Submarine

Esta página es una traducción. En caso de diferencias, prevalece la versión en inglés. Versión en inglés

Cómo se protegen tus datos

No te pedimos que confíes en nosotros. Esta página explica con exactitud qué se cifra, qué puede ver nuestro servidor y qué no, y cómo puedes comprobar por tu cuenta cada afirmación.

En un minuto

  • Tus servidores, credenciales, claves y notas se conservan en un solo archivo en tu dispositivo, cifrado con AES-256-GCM. Algunas opciones que solo se aplican a este dispositivo, como el aspecto de la aplicación y una carpeta compartida con un servidor RDP, se guardan sin cifrar en la configuración de la aplicación y nunca se sincronizan.
  • La clave se genera a partir de la contraseña de tu perfil con Argon2id, un método lento a propósito para que adivinarla resulte costoso. La contraseña nunca se guarda ni se envía a ningún sitio.
  • Si activas la sincronización, cada elemento se cifra en tu dispositivo antes de subirse. El servidor guarda datos que no puede descifrar.
  • Lo que el servidor sí ve es lo que rodea a tus datos: tu dirección de correo electrónico, cuándo sincronizas y desde qué dirección IP, cuántos elementos de cada tipo tienes y qué tamaño tienen, los nombres de tus perfiles y, en los perfiles compartidos, sus nombres y las direcciones de correo electrónico de los miembros.
  • La aplicación no tiene anuncios, ni analítica, ni informes de fallos.

El servidor no puede leer

  • El contenido de tus elementos: nombres, direcciones, puertos, nombres de usuario, contraseñas, claves privadas y sus frases de contraseña, túneles, notas, comandos, nombres de carpetas
  • Qué credencial o qué clave corresponde a qué servidor
  • Quién modificó un elemento
  • La contraseña de tu perfil, tu frase de contraseña para compartir y las claves que abren tus perfiles

El servidor puede ver

  • Tu dirección de correo electrónico y, cuando inicias sesión, la contraseña de tu cuenta (solo guarda un hash bcrypt de ella)
  • La dirección IP y la hora de los inicios de sesión y de las sincronizaciones
  • Cuántos elementos de cada tipo tiene un perfil, su tamaño, y cuándo se modificó cada uno y desde qué dispositivo (un identificador aleatorio)
  • Los nombres de tus perfiles
  • En los perfiles compartidos: su nombre, las direcciones de correo electrónico de los miembros y el rol de cada uno

Qué pasa cuando sincronizas

Nunca sale de tu dispositivo
Contraseña del perfilArgon2idClave del perfilAES-256-GCMElementos cifrados
HTTPSServidor de sincronizaciónGuarda los elementos cifrados y los datos indicados arriba
La contraseña y las claves se quedan en tu dispositivo. Solo se envían los elementos cifrados y los datos asociados a ellos.

1. En tu dispositivo

Cada perfil es un archivo. Dentro hay una pequeña base de datos con tus servidores, credenciales, claves SSH, notas y ajustes. Toda la base de datos se comprime y después se cifra con AES-256-GCM. Cada vez que se guarda el archivo, se usa un nonce aleatorio nuevo, y el archivo se escribe primero en una copia temporal, de modo que un fallo no puede dejar un archivo a medias.

La clave se obtiene de la contraseña de tu perfil mediante Argon2id con 64 MiB de memoria, 3 pasadas y 4 carriles, y una sal aleatoria para cada perfil. Estos parámetros están fijados en la aplicación, así que un archivo modificado no puede debilitarlos.

La contraseña nunca se escribe en el disco ni se envía a ningún sitio. Una vez generada la clave, se borra la copia de la contraseña que hay en el núcleo de la aplicación, y la clave se borra cuando bloqueas el perfil. Al bloquearlo también se cierran todas las conexiones y se cancela un inicio de sesión que todavía esté en curso. Si olvidas la contraseña, el perfil no se puede abrir. No hay forma de restablecerla, porque no se guarda en ningún sitio nada que pueda abrirlo.

El desbloqueo rápido es opcional y está desactivado de forma predeterminada. En Windows usa Windows Hello y el TPM; en Android, el sensor de huellas dactilares y el Android Keystore. El sistema guarda la clave del perfil, nunca tu contraseña, y esa clave nunca se sincroniza. En Android, la copia de seguridad en la nube que hace el sistema está desactivada para los datos de la aplicación.

En Windows, cuando Conexión a Escritorio remoto abre un servidor que tiene una contraseña guardada, la aplicación le pasa la contraseña en un archivo .rdp de corta duración. La contraseña que contiene está cifrada con DPAPI de Windows para tu usuario de Windows, y el archivo se elimina en cuanto Conexión a Escritorio remoto lo ha leído (como muy tarde a los 30 segundos; un archivo que quede tras un fallo se elimina la próxima vez que se inicia la aplicación).

2. Cloud sync (sincronización en la nube)

La sincronización está desactivada hasta que inicias sesión. Cada perfil tiene su propia clave de datos aleatoria de 256 bits, que se guarda dentro del perfil cifrado. Antes de subirse, cada elemento (un servidor, una credencial, una clave, una nota…) se cifra por separado con esta clave, usando AES-256-GCM y un nonce aleatorio nuevo.

Junto a cada elemento cifrado, el servidor recibe un identificador aleatorio, el tipo de elemento, una marca de tiempo y un indicador que dice si se eliminó. La marca de tiempo contiene un identificador aleatorio del dispositivo que hizo el cambio. El tamaño del elemento cifrado deja ver aproximadamente cuánto ocupa el elemento. El servidor también guarda el nombre de cada perfil. Las claves de host conocidas, el historial de comandos, los ajustes de supervisión y las opciones que se guardan solo para este dispositivo nunca se sincronizan.

Esto es lo que el servidor guarda de un elemento: (Ejemplo)

{
  "uuid": "6f1c2e0a9b7d4c3e8a5f0d1b2c3e4f50",
  "entity_type": "servers",
  "updated_at": "001761043562118:00000:9f3a61c2d4e5b7a8",
  "deleted": false,
  "blob": "4e8a1f0c2b9d3e7a5c6f8b1d0a2e4c6b8d0f1a3c5e7b9d1f…"
}

3. Abrir un perfil en un dispositivo nuevo

Para abrir un perfil sincronizado en otro dispositivo, ese dispositivo necesita la clave de datos del perfil. Por eso, el servidor guarda un registro más: la clave de datos, cifrada con una clave generada a partir de la contraseña de tu perfil, con los mismos parámetros de Argon2id. El servidor no puede abrirla.

Esto es también lo principal que podría intentar un atacante si alguna vez robara los datos del servidor: adivinar la contraseña de tu perfil sin conexión. Cada intento cuesta una ejecución completa de Argon2id, así que una contraseña larga que no uses en ningún otro sitio mantiene tus datos a salvo.

4. La contraseña de tu cuenta

Tu cuenta de sincronización tiene su propia contraseña, distinta de la contraseña de tu perfil. Se envía al servidor cuando inicias sesión, por HTTPS, y el servidor solo guarda un hash bcrypt de ella. Tras 5 contraseñas incorrectas, el inicio de sesión con contraseña se suspende durante 15 minutos.

El servicio está detrás de Cloudflare, que gestiona la conexión HTTPS en su nombre. Por eso, al igual que el servidor, Cloudflare podría ver la contraseña de tu cuenta cuando inicias sesión, pero tus elementos solo en su forma cifrada.

Nunca uses la contraseña de tu perfil como contraseña de la cuenta. Así, nada de lo que lleguen a ver el servidor o Cloudflare podrá abrir tus perfiles.

5. Compartir un perfil

Para compartir perfiles, cada cuenta tiene un par de claves X25519. La clave privada se cifra con una clave generada a partir de tu frase de contraseña para compartir (de nuevo con Argon2id), y esa frase de contraseña nunca sale de tu dispositivo. Cada miembro de un perfil compartido recibe la clave de datos del perfil sellada con su propia clave pública.

Cuando invitas a alguien, la aplicación usa la clave pública que el servidor proporciona para esa dirección de correo electrónico. Si más adelante cambia la clave de un miembro, la aplicación te avisa y te muestra una huella digital que puedes comparar con esa persona. El servidor conoce los nombres de los perfiles compartidos y quién es miembro, pero no su contenido.

6. Si el servidor fuera hostil

La buena seguridad no depende solo de lo que se supone que debe hacer un servidor. Esto es lo que podría y lo que no podría hacer alguien con control total del servidor.

No podría

  • Leer tus elementos, ni cambiar su contenido sin que se note
  • Abrir la copia guardada de la clave de tu perfil sin la contraseña del perfil
  • Averiguar la contraseña de tu perfil ni tu frase de contraseña para compartir, que la aplicación nunca envía
  • Cambiar la aplicación en tu dispositivo: no hay actualizaciones automáticas; la aplicación solo muestra que existe una versión nueva

Podría

  • Intentar adivinar sin conexión una contraseña débil del perfil, a razón de una lenta ejecución de Argon2id por intento
  • Capturar la contraseña de tu cuenta la próxima vez que inicies sesión
  • Eliminar elementos, restaurar versiones anteriores o retener cambios. Antes de que una sincronización elimine algo, la aplicación guarda una copia de tu perfil en tu dispositivo
  • Entregar una clave pública equivocada cuando invites a alguien a un perfil compartido
  • Ver los datos indicados en la tabla de arriba

7. Todas las conexiones de la aplicación

Tus propios servidores, y los proxies y servidores de salto que configures para ellos. El servidor de sincronización, solo cuando tienes la sesión iniciada. Y GitHub, para comprobar si hay una versión más reciente: cuando se abre la lista de perfiles y cuando pulsas «Check for updates» (buscar actualizaciones), la aplicación consulta la lista pública de versiones de GitHub. Esa solicitud solo lleva el nombre y la versión de la aplicación.

La aplicación no contiene código de analítica, de informes de fallos ni de publicidad. Para la sincronización, la aplicación solo confía en su propia lista integrada de autoridades de certificación y nunca sigue una redirección, así que no se la puede desviar en silencio hacia otro servidor.

8. Qué recibe un escritorio remoto de tu dispositivo

El portapapeles. El texto que pegas en una pestaña de RDP o VNC va a ese servidor, y no se le ofrece nada antes de que pegues. Con Share the clipboard activado (la opción predeterminada, con un interruptor para cada servidor), el texto copiado en el escritorio remoto se pone en el portapapeles de este dispositivo. Es solo texto, nunca archivos, y VNC solo transmite texto ASCII sin formato.

Archivos, solo con el cliente RDP integrado en una computadora, y solo si eliges una carpeta o una unidad para ese servidor, de solo lectura si quieres. El servidor la ve como una unidad dentro de \\tsclient, y nada más de tu computadora. Se comprueba cada ruta que pide: no se admite .. ni se sigue ningún enlace por el camino, así que no se puede llegar a nada fuera de lo que elegiste.

Estas opciones se guardan en este dispositivo y nunca se sincronizan, así que nadie con quien compartas un perfil puede activarlas.

Compruébalo por tu cuenta

No tienes que fiarte de nuestra palabra en nada de esto. Aquí tienes formas de comprobarlo, de las más sencillas a las más avanzadas.

  1. Lee el código

    La aplicación es de código abierto. Los enlaces de esta página llevan a las líneas exactas que hacen el trabajo, en la versión que describe esta página (c9dec31).

  2. Observa las conexiones

    Usa un cortafuegos o un monitor de red. Verás tus propios servidores, el servidor de sincronización solo mientras tengas la sesión iniciada, y api.github.com cuando se abra la lista de perfiles. Nada más.

  3. Mira lo que guarda el servidor

    Avanzado: toma tu token de inicio de sesión de la carpeta de datos de la aplicación (cloud_token.json) y pide tus datos a la API con la cabecera X-Auth-Token: GET /api/sync/profiles, o POST /api/sync con una lista de registros vacía. Solo recibirás identificadores, tipos, marcas de tiempo, indicadores y texto cifrado. Después, cierra sesión en la aplicación para terminar esa sesión.

  4. Lee el tráfico

    Avanzado: ejecuta en tu computadora un pequeño proxy que reenvíe las solicitudes al servidor real y, en la aplicación, cambia el servidor de sincronización a http://127.0.0.1 con el puerto del proxy. La aplicación solo permite HTTP sin cifrar para tu propia computadora. Verás lo que envía la aplicación y que tus elementos van cifrados. (Un certificado de proxy añadido a tu sistema no funcionará, porque la aplicación usa su propia lista de autoridades de certificación.)

  5. Descifra tus propios datos

    Avanzado: con tu contraseña, puedes abrir tus propios datos con cualquier herramienta de Argon2id y AES-GCM, usando los parámetros de la tabla de abajo. Sin la contraseña, nadie puede.

  6. Comprueba tu descarga

    Compara la suma de verificación con el archivo SHA256SUMS de la versión publicada (a partir de la 0.4), comprueba el certificado de la aplicación de Android con apksigner o compila la aplicación a partir del código fuente.

Los parámetros, para tus propias herramientas

Derivación de la claveArgon2id, versión 0x13, 64 MiB de memoria, 3 pasadas, 4 carriles, clave de 32 bytes, sal aleatoria de 16 bytes
Archivo del perfil“OMNV” · versión 1 · sal (16 bytes) · nonce (12 bytes) · AES-256-GCM de la base de datos SQLite comprimida con zstd, con su etiqueta de 16 bytes
Elemento sincronizadohex(nonce (12 bytes) · texto cifrado y etiqueta de AES-256-GCM), con la clave de datos de 256 bits del perfil
Copia guardada de la clave del perfilhex(0x02 · sal (16 bytes) · nonce (12 bytes) · AES-256-GCM de la clave de datos de 32 bytes), con la clave generada a partir de la contraseña de tu perfil
Uso compartidoX25519, HKDF-SHA256, AES-256-GCM

Lo que esta página no promete

  • Submarine no se ha sometido a una auditoría de seguridad independiente. Hasta ahora, sus revisiones las ha hecho el autor.
  • Una contraseña débil o reutilizada es el punto más débil. Usa una contraseña larga y única para el perfil, y otra distinta para la cuenta.
  • Telnet y VNC en su forma básica no están cifrados por diseño. La aplicación los marca y puede hacer que pasen por un servidor SSH. Con VNC en su forma básica, el texto del portapapeles que pegas o que copia el servidor también viaja por la red sin cifrar.
  • El cliente RDP integrado es experimental (se compila a partir de un commit de IronRDP, no de una versión publicada) y está desactivado hasta que lo eliges para un servidor.
  • Esta página describe la aplicación tal como está en c9dec31. Si el código cambia, esta página cambia con él.