Submarine

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

Nunca sai do seu dispositivo
Senha do perfilArgon2idChave do perfilAES-256-GCMItens criptografados
HTTPSServidor de sincronizaçãoArmazena os itens criptografados e os detalhes listados acima
A senha e as chaves ficam no seu dispositivo. Só são enviados os itens criptografados e os detalhes em torno deles.

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).

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…"
}

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.

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.

5. Compartilhar um perfil

Para compartilhar perfis, cada conta tem um par de chaves X25519. A chave privada é criptografada com uma chave gerada a partir da sua frase secreta de compartilhamento (de novo com Argon2id), e a frase secreta nunca sai do seu dispositivo. Cada membro de um perfil compartilhado recebe a chave de dados do perfil selada com a chave pública do próprio membro.

Quando você convida alguém, o app usa a chave pública que o servidor fornece para esse endereço de e-mail. Se a chave de um membro mudar depois, o app avisa e mostra uma impressão digital que você pode comparar com a pessoa. O servidor sabe os nomes dos perfis compartilhados e quem é membro, mas não o que há dentro deles.

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.

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.

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.

  1. 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).

  2. 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.

  3. 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.

  4. 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.)

  5. 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.

  6. 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 chaveArgon2id, 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 sincronizadohex(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 perfilhex(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
CompartilhamentoX25519, 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.