Esta página é uma tradução. Se ela divergir da versão em inglês, prevalece a versão em inglês. Versão em inglês
Como seus dados são protegidos
Não pedimos que você confie em nós. Esta página explica exatamente o que é criptografado, o que o nosso servidor consegue e não consegue ver e como você mesmo pode verificar cada afirmação.
Em um minuto
- Seus servidores, logins, chaves e notas ficam em um único arquivo no seu dispositivo, criptografado com AES-256-GCM. Algumas opções que valem só para este dispositivo, como a aparência do app e uma pasta compartilhada com um servidor RDP, ficam sem criptografia nas configurações do app e nunca são sincronizadas.
- A chave é gerada a partir da senha do perfil com Argon2id, um método lento de propósito, para que tentar adivinhar a senha saia caro. A senha nunca é armazenada nem enviada a lugar nenhum.
- Se você ativar a sincronização, cada item é criptografado no seu dispositivo antes de ser enviado. O servidor armazena dados que ele não consegue descriptografar.
- O servidor vê, sim, o lado de fora dos seus dados: seu endereço de e-mail, quando você sincroniza e de qual endereço IP, quantos itens de cada tipo você tem e o tamanho deles, os nomes dos seus perfis e, nos perfis compartilhados, os nomes dos compartilhamentos e os endereços de e-mail dos membros.
- O app não tem anúncios, análise de uso nem relatórios de falhas.
O servidor não consegue ler
- O que há dentro dos seus itens: nomes, endereços, portas, nomes de usuário, senhas, chaves privadas e suas frases secretas, túneis, notas, comandos, nomes de pastas
- Qual login ou chave pertence a qual servidor
- Quem alterou um item
- A senha do perfil, a sua frase secreta de compartilhamento e as chaves que abrem os seus perfis
O servidor consegue ver
- Seu endereço de e-mail e, quando você faz login, a senha da conta (ele armazena só um hash bcrypt dela)
- O endereço IP e o horário de cada login e de cada sincronização
- Quantos itens de cada tipo um perfil tem, o tamanho deles e quando cada um foi alterado e por qual dispositivo (um ID aleatório)
- Os nomes dos seus perfis
- Nos perfis compartilhados: os nomes dos compartilhamentos, os endereços de e-mail dos membros e as funções deles
O que acontece quando você sincroniza
1. No seu dispositivo
Cada perfil é um arquivo. Dentro dele há um pequeno banco de dados com os seus servidores, logins, chaves SSH, notas e configurações. O banco de dados inteiro é compactado e depois criptografado com AES-256-GCM. Um novo nonce aleatório é usado toda vez que o arquivo é salvo, e o arquivo é gravado primeiro em uma cópia temporária; assim, um travamento não tem como deixar um arquivo pela metade.
A chave é gerada a partir da senha do perfil com Argon2id, usando 64 MiB de memória, 3 passadas e 4 lanes, além de um salt aleatório para cada perfil. Esses parâmetros são fixos no app, então um arquivo alterado não tem como enfraquecê-los.
A senha nunca é gravada em disco nem enviada a lugar nenhum. Depois que a chave é gerada, a cópia da senha no núcleo do app é apagada, e a chave é apagada quando você bloqueia o perfil. Bloquear também fecha todas as conexões e cancela um login que ainda esteja em andamento. Se você esquecer a senha, o perfil não pode ser aberto. Não há redefinição, porque nada que possa abri-lo fica guardado em lugar nenhum.
O desbloqueio rápido é opcional e vem desativado por padrão. No Windows, ele usa o Windows Hello e o TPM; no Android, o sensor de impressão digital e o Android Keystore. O sistema guarda a chave do perfil, nunca a sua senha, e essa chave nunca é sincronizada. No Android, o backup na nuvem que o sistema faz dos dados do app fica desativado.
No Windows, quando a Conexão de Área de Trabalho Remota abre um servidor que tem uma senha salva, o app entrega a senha em um arquivo .rdp de curta duração. A senha nesse arquivo é criptografada com o Windows DPAPI para o seu usuário do Windows, e o arquivo é excluído assim que a Conexão de Área de Trabalho Remota o lê (no máximo depois de 30 segundos; um arquivo deixado para trás por um travamento é removido na próxima inicialização).
- Derivação de chave (parâmetros do Argon2id) lib.rs:237–254
- AES-256-GCM com um nonce novo lib.rs:256–263
- Salvar o arquivo do perfil lib.rs:431–486
- A senha para a Conexão de Área de Trabalho Remota (DPAPI) rdp.rs:178–193
2. Cloud sync (sincronização na nuvem)
A sincronização fica desativada até você entrar na sua conta. Cada perfil tem a própria chave de dados aleatória de 256 bits, que fica dentro do perfil criptografado. Antes do envio, cada item (um servidor, um login, uma chave, uma nota…) é criptografado separadamente com essa chave, usando AES-256-GCM e um novo nonce aleatório.
Junto com cada item criptografado, o servidor recebe um ID aleatório, o tipo do item, um carimbo de data e hora e um marcador que indica se ele foi excluído. O carimbo de data e hora contém um ID aleatório do dispositivo que fez a alteração. O tamanho do item criptografado indica, aproximadamente, o tamanho do item. O servidor também armazena o nome de cada perfil. Chaves de hosts conhecidos, histórico de comandos, configurações de monitoramento e as opções guardadas só para este dispositivo nunca são sincronizados.
Veja o que o servidor armazena para um item: (Exemplo)
{
"uuid": "6f1c2e0a9b7d4c3e8a5f0d1b2c3e4f50",
"entity_type": "servers",
"updated_at": "001761043562118:00000:9f3a61c2d4e5b7a8",
"deleted": false,
"blob": "4e8a1f0c2b9d3e7a5c6f8b1d0a2e4c6b8d0f1a3c5e7b9d1f…"
}- Criptografar cada item sincronizado lib.rs:1050–1056
- O que é enviado para cada item lib.rs:1086–1124
3. Abrir um perfil em um novo dispositivo
Para abrir um perfil sincronizado em outro dispositivo, esse dispositivo precisa da chave de dados do perfil. Por isso, o servidor guarda mais um registro: a chave de dados, criptografada com uma chave gerada a partir da senha do perfil, com os mesmos parâmetros do Argon2id. O servidor não consegue abri-la.
Essa também é a principal coisa que um atacante poderia tentar se um dia roubasse os dados do servidor: adivinhar a senha do perfil offline. Cada tentativa custa uma execução completa do Argon2id, então uma senha longa que você não use em nenhum outro lugar mantém seus dados seguros.
- A cópia armazenada da chave do perfil lib.rs:1551–1569
- Abrir a cópia em um novo dispositivo lib.rs:1574–1594
4. A senha da sua conta
Sua conta de sincronização tem uma senha própria, separada da senha do perfil. Ela é enviada ao servidor quando você faz login, dentro da conexão HTTPS, e o servidor armazena só um hash bcrypt dela. Depois de 5 senhas erradas, o login com senha fica pausado por 15 minutos.
O serviço fica atrás da Cloudflare, que cuida da conexão HTTPS para ele. Então, assim como o servidor, a Cloudflare poderia ver a senha da sua conta quando você faz login, mas os seus itens só na forma criptografada.
Nunca use a senha do perfil como senha da conta. Assim, nada que o servidor ou a Cloudflare chegue a ver pode abrir os seus perfis.
- A requisição de login cloud.rs:105–108
6. Se o servidor fosse hostil
Uma boa segurança não se resume ao que um servidor deveria fazer. Veja o que alguém com controle total do servidor poderia e não poderia fazer.
Essa pessoa não poderia
- Ler os seus itens ou alterar o que há dentro deles sem que isso seja percebido
- Abrir a cópia armazenada da chave do perfil sem a senha do perfil
- Descobrir a senha do perfil ou a frase secreta de compartilhamento, que o app nunca envia
- Alterar o app no seu dispositivo: não há atualizações automáticas, o app só mostra que existe uma versão nova
Essa pessoa poderia
- Tentar adivinhar offline uma senha de perfil fraca, com uma execução lenta do Argon2id por tentativa
- Capturar a senha da sua conta na próxima vez que você fizer login
- Excluir itens, trazer de volta versões mais antigas ou reter alterações. Antes que uma sincronização exclua qualquer coisa, o app guarda uma cópia do seu perfil no seu dispositivo
- Entregar a chave pública errada quando você convidar alguém para um perfil compartilhado
- Ver os detalhes listados na tabela acima
7. Tudo a que o app se conecta
Os seus próprios servidores e os proxies e jump hosts que você configurar para eles. O servidor de sincronização, só quando você está conectado à sua conta. E o GitHub, para ver se há uma versão mais nova: quando a lista de perfis abre e quando você aperta “Check for updates”, o app consulta a lista pública de versões no GitHub. Essa requisição leva só o nome e a versão do app.
Não há código de análise de uso, de relatórios de falhas nem de publicidade no app. Para a sincronização, o app só confia na própria lista embutida de autoridades certificadoras e nunca segue um redirecionamento, por isso não pode ser desviado discretamente para outro servidor.
- A verificação de atualizações about.rs:75–139
8. O que uma área de trabalho remota recebe do seu dispositivo
A área de transferência. O texto que você cola em uma aba de RDP ou VNC vai para esse servidor, e nada é oferecido a ele antes que você cole. Com Share the clipboard ativado (o padrão, e uma opção para cada servidor), o texto copiado na área de trabalho remota é colocado na área de transferência deste dispositivo. É só texto, nunca arquivos, e o VNC leva apenas texto ASCII simples.
Arquivos, só com o cliente RDP integrado em um computador, e só se você escolher uma pasta ou uma unidade para esse servidor, em modo somente leitura, se você quiser. O servidor a vê como uma unidade em \\tsclient, e nada mais do seu computador. Cada caminho que ele pede é verificado: nada de .., e nenhum link é seguido ao longo do caminho, então nada fora do que você escolheu pode ser alcançado.
Essas opções ficam neste dispositivo e nunca são sincronizadas, então ninguém com quem você compartilha um perfil pode ativá-las.
- Manter os caminhos de uma pasta compartilhada dentro dela rdp_share.rs:121–147
- O que a área de transferência do VNC pode levar vnc_client.rs:180–188
Verifique você mesmo
Você não precisa acreditar em nada disso só porque nós dizemos. Veja formas de verificar, das mais fáceis às avançadas.
Leia o código
O app é de código aberto. Os links desta página levam às linhas exatas que fazem o trabalho, na versão que esta página descreve (
c9dec31).Observe as conexões
Use um firewall ou um monitor de rede. Você vai ver os seus próprios servidores, o servidor de sincronização só enquanto estiver conectado à sua conta e o api.github.com quando a lista de perfis abre. Nada mais.
Veja o que o servidor armazena
Avançado: pegue o seu token de login na pasta de dados do app (cloud_token.json) e peça os seus dados à API, com o cabeçalho X-Auth-Token: GET /api/sync/profiles, ou POST /api/sync com uma lista vazia de registros. Você recebe de volta só IDs, tipos, horários, marcadores e texto criptografado. Depois, saia da conta no app para encerrar essa sessão.
Inspecione o tráfego
Avançado: execute no seu computador um pequeno proxy que repasse as requisições ao servidor real e configure o servidor de sincronização do app como http://127.0.0.1 com a porta do proxy. O app só permite HTTP sem criptografia para o seu próprio computador. Você vai ver o que o app envia e que os seus itens estão criptografados. (Um certificado de proxy adicionado ao seu sistema não vai funcionar, porque o app usa a própria lista de autoridades certificadoras.)
Descriptografe os seus próprios dados
Avançado: com a sua senha, você pode abrir os seus próprios dados com qualquer ferramenta de Argon2id e AES-GCM, usando os parâmetros da tabela abaixo. Sem a senha, ninguém consegue.
Verifique seu download
Compare a soma de verificação com o arquivo SHA256SUMS da versão (a partir da 0.4), verifique o certificado do app para Android com o apksigner ou compile o app a partir do código-fonte.
Os parâmetros, para as suas próprias ferramentas
| Derivação de chave | Argon2id, versão 0x13, 64 MiB de memória, 3 passadas, 4 lanes, chave de 32 bytes, salt aleatório de 16 bytes |
| Arquivo do perfil | “OMNV” · versão 1 · salt (16 bytes) · nonce (12 bytes) · AES-256-GCM do banco de dados SQLite compactado com zstd, com a tag de 16 bytes |
| Item sincronizado | hex(nonce (12 bytes) · texto cifrado AES-256-GCM e tag), com a chave de dados de 256 bits do perfil |
| Cópia armazenada da chave do perfil | hex(0x02 · salt (16 bytes) · nonce (12 bytes) · AES-256-GCM da chave de dados de 32 bytes), com a chave gerada a partir da senha do perfil |
| Compartilhamento | X25519, HKDF-SHA256, AES-256-GCM |
O que esta página não promete
- O Submarine não passou por uma auditoria de segurança independente. As revisões feitas até agora foram conduzidas pelo autor.
- Uma senha fraca ou reutilizada é o ponto mais fraco. Use uma senha de perfil longa e exclusiva, e uma senha de conta diferente.
- O Telnet e o VNC simples não são criptografados, por natureza. O app os sinaliza e pode passá-los por um servidor SSH. No VNC simples, o texto da área de transferência que você cola ou que o servidor copia também atravessa a rede sem criptografia.
- O cliente RDP integrado é experimental (ele é compilado a partir de um commit do IronRDP, não de uma versão publicada) e fica desativado até você escolhê-lo para um servidor.
- Esta página descreve o app na versão
c9dec31. Se o código mudar, esta página muda junto.