Submarine

Cette page est une traduction. En cas de différence avec la version anglaise, c’est la version anglaise qui fait foi. Version anglaise

Comment vos données sont protégées

Nous ne vous demandons pas de nous faire confiance. Cette page explique exactement ce qui est chiffré, ce que notre serveur peut voir et ne peut pas voir, et comment vérifier vous-même chaque affirmation.

En une minute

  • Vos serveurs, identifiants, clés et notes sont conservés dans un fichier sur votre appareil, chiffré avec AES-256-GCM. Quelques choix propres à cet appareil, comme l’apparence de l’application et un dossier partagé avec un serveur RDP, sont conservés sans chiffrement dans les réglages de l’application et ne sont jamais synchronisés.
  • La clé est calculée à partir du mot de passe de votre profil avec Argon2id, une méthode volontairement lente, pour que deviner le mot de passe coûte cher. Le mot de passe n’est jamais enregistré ni envoyé nulle part.
  • Si vous activez la synchronisation, chaque élément est chiffré sur votre appareil avant d’être envoyé. Le serveur stocke des données qu’il ne peut pas déchiffrer.
  • Le serveur voit tout de même ce qui entoure vos données : votre adresse e-mail, quand vous synchronisez et depuis quelle adresse IP, combien d’éléments de chaque type vous avez et quelle est leur taille, les noms de vos profils et, pour les profils partagés, les noms des partages et les adresses e-mail des membres.
  • L’application n’a ni publicité, ni statistiques d’utilisation, ni rapports de plantage.

Le serveur ne peut pas lire

  • Le contenu de vos éléments : noms, adresses, ports, noms d’utilisateur, mots de passe, clés privées et leurs phrases secrètes, tunnels, notes, commandes, noms de dossiers
  • Quel identifiant ou quelle clé appartient à quel serveur
  • Qui a modifié un élément
  • Le mot de passe de votre profil, votre phrase secrète de partage et les clés qui ouvrent vos profils

Le serveur peut voir

  • Votre adresse e-mail, et le mot de passe de votre compte lorsque vous vous connectez (il n’en stocke qu’un hachage bcrypt)
  • L’adresse IP et l’heure des connexions et des synchronisations
  • Le nombre d’éléments de chaque type dans un profil, leur taille, et pour chacun, quand et par quel appareil il a été modifié (un ID aléatoire)
  • Les noms de vos profils
  • Pour les profils partagés : les noms des partages, les adresses e-mail des membres et leurs rôles

Ce qui se passe quand vous synchronisez

Ne quitte jamais votre appareil
Mot de passe du profilArgon2idClé du profilAES-256-GCMÉléments chiffrés
HTTPSServeur de synchronisationStocke les éléments chiffrés et les informations listées plus haut
Le mot de passe et les clés restent sur votre appareil. Seuls les éléments chiffrés, et les informations qui les entourent, sont envoyés.

1. Sur votre appareil

Chaque profil est un fichier. Il contient une petite base de données avec vos serveurs, identifiants, clés SSH, notes et réglages. La base de données entière est compressée, puis chiffrée avec AES-256-GCM. Un nouveau nonce aléatoire est utilisé à chaque enregistrement du fichier, et le fichier est d’abord écrit dans une copie temporaire : un plantage ne peut donc pas laisser derrière lui un fichier à moitié écrit.

La clé est calculée à partir du mot de passe de votre profil par Argon2id, avec 64 MiB de mémoire, 3 passes et 4 voies, et un sel aléatoire propre à chaque profil. Ces paramètres sont fixés dans l’application : un fichier modifié ne peut donc pas les affaiblir.

Le mot de passe n’est jamais écrit sur le disque ni envoyé nulle part. Une fois la clé calculée, la copie du mot de passe dans le cœur de l’application est effacée, et la clé est effacée quand vous verrouillez le profil. Le verrouillage ferme aussi toutes les connexions, et annule une connexion qui est encore en train de s’établir. Si vous oubliez le mot de passe, le profil ne peut pas être ouvert. Il n’y a pas de réinitialisation possible, car rien qui pourrait l’ouvrir n’est conservé nulle part.

Le déverrouillage rapide est facultatif et désactivé par défaut. Sous Windows, il utilise Windows Hello et le TPM ; sous Android, le capteur d’empreintes digitales et l’Android Keystore. Le système conserve la clé du profil, jamais votre mot de passe, et cette clé n’est jamais synchronisée. Sous Android, la sauvegarde dans le cloud effectuée par le système est désactivée pour les données de l’application.

Sous Windows, quand Connexion Bureau à distance ouvre un serveur qui a un mot de passe enregistré, l’application lui transmet ce mot de passe dans un fichier .rdp à courte durée de vie. Le mot de passe qu’il contient est chiffré avec Windows DPAPI pour votre utilisateur Windows, et le fichier est supprimé dès que Connexion Bureau à distance l’a lu (au plus tard après 30 secondes ; un fichier laissé par un plantage est supprimé au démarrage suivant).

2. La synchronisation (Cloud sync)

La synchronisation reste désactivée jusqu’à ce que vous vous connectiez. Chaque profil a sa propre clé de données aléatoire de 256 bits, conservée à l’intérieur du profil chiffré. Avant l’envoi, chaque élément (un serveur, un identifiant, une clé, une note…) est chiffré individuellement avec cette clé, au moyen d’AES-256-GCM et d’un nouveau nonce aléatoire.

Avec chaque élément chiffré, le serveur reçoit un ID aléatoire, le type d’élément, un horodatage et un indicateur précisant si l’élément a été supprimé. L’horodatage contient un ID aléatoire de l’appareil qui a fait la modification. La taille de l’élément chiffré indique à peu près la taille de l’élément lui-même. Le serveur stocke aussi le nom de chaque profil. Les clés d’hôtes connues, l’historique des commandes, les réglages de supervision et les choix conservés pour cet appareil uniquement ne sont jamais synchronisés.

Voici ce que le serveur stocke pour un élément : (Exemple)

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

3. Ouvrir un profil sur un nouvel appareil

Pour ouvrir un profil synchronisé sur un autre appareil, cet appareil a besoin de la clé de données du profil. Le serveur conserve donc un enregistrement de plus : la clé de données, chiffrée avec une clé calculée à partir du mot de passe de votre profil, avec les mêmes paramètres Argon2id. Le serveur ne peut pas l’ouvrir.

C’est aussi la principale chose qu’un attaquant pourrait tenter s’il volait un jour les données du serveur : deviner le mot de passe de votre profil hors ligne. Chaque essai coûte un calcul Argon2id complet ; un mot de passe long que vous n’utilisez nulle part ailleurs protège donc vos données.

4. Le mot de passe de votre compte

Votre compte de synchronisation a son propre mot de passe, distinct du mot de passe de votre profil. Il est envoyé au serveur par HTTPS lorsque vous vous connectez, et le serveur n’en stocke qu’un hachage bcrypt. Après 5 mots de passe erronés, la connexion par mot de passe est suspendue pendant 15 minutes.

Le service se trouve derrière Cloudflare, qui gère la connexion HTTPS pour lui. Comme le serveur, Cloudflare pourrait donc voir le mot de passe de votre compte lorsque vous vous connectez, mais vos éléments uniquement sous leur forme chiffrée.

N’utilisez jamais le mot de passe de votre profil comme mot de passe de compte. Ainsi, rien de ce que le serveur ou Cloudflare pourra jamais voir ne permettra d’ouvrir vos profils.

5. Partager un profil

Pour partager des profils, chaque compte a une paire de clés X25519. La clé privée est chiffrée avec une clé calculée à partir de votre phrase secrète de partage (là encore avec Argon2id), et la phrase secrète ne quitte jamais votre appareil. Chaque membre d’un profil partagé reçoit la clé de données du profil, scellée avec sa propre clé publique.

Quand vous invitez quelqu’un, l’application utilise la clé publique que le serveur fournit pour cette adresse e-mail. Si la clé d’un membre change plus tard, l’application vous prévient et affiche une empreinte que vous pouvez comparer avec ce membre. Le serveur connaît les noms des profils partagés et qui en est membre, mais pas leur contenu.

6. Si le serveur était malveillant

Une bonne sécurité ne se résume pas à ce qu’un serveur est censé faire. Voici ce que quelqu’un qui contrôlerait entièrement le serveur pourrait faire, et ce qu’il ne pourrait pas faire.

Il ne pourrait pas

  • Lire vos éléments, ni modifier leur contenu sans que cela se remarque
  • Ouvrir la copie stockée de la clé de votre profil sans le mot de passe de ce profil
  • Découvrir le mot de passe de votre profil ou votre phrase secrète de partage, que l’application n’envoie jamais
  • Modifier l’application sur votre appareil : il n’y a pas de mise à jour automatique, l’application indique seulement qu’une nouvelle version existe

Il pourrait

  • Tenter de deviner hors ligne un mot de passe de profil faible, à raison d’un calcul Argon2id lent par essai
  • Capturer le mot de passe de votre compte lors de votre prochaine connexion
  • Supprimer des éléments, rétablir d’anciennes versions ou retenir des modifications. Avant qu’une synchronisation ne supprime quoi que ce soit, l’application garde une copie de votre profil sur votre appareil
  • Fournir une mauvaise clé publique quand vous invitez quelqu’un dans un profil partagé
  • Voir les informations listées dans le tableau ci-dessus

7. Tout ce à quoi l’application se connecte

Vos propres serveurs, ainsi que les proxys et hôtes de rebond que vous configurez pour eux. Le serveur de synchronisation, uniquement quand vous êtes connecté. Et GitHub, pour vérifier s’il existe une version plus récente : à l’ouverture de la liste des profils et quand vous appuyez sur « Check for updates », l’application consulte la liste publique des versions sur GitHub. Cette requête ne transmet que le nom et la version de l’application.

L’application ne contient aucun code de statistiques d’utilisation, de rapports de plantage ou de publicité. Pour la synchronisation, elle ne fait confiance qu’à sa propre liste intégrée d’autorités de certification, et elle ne suit jamais de redirection : on ne peut donc pas la faire pointer discrètement vers un autre serveur.

8. Ce qu’un bureau à distance reçoit de votre appareil

Le presse-papiers. Le texte que vous collez dans un onglet RDP ou VNC va à ce serveur, et rien ne lui est proposé avant que vous colliez. Avec Share the clipboard activé (le réglage par défaut, avec un interrupteur pour chaque serveur), le texte copié sur le bureau à distance est placé dans le presse-papiers de cet appareil. Il s’agit uniquement de texte, jamais de fichiers, et VNC ne transporte que du texte ASCII simple.

Les fichiers, uniquement avec le client RDP intégré sur un ordinateur, et uniquement si vous choisissez un dossier ou un lecteur pour ce serveur, en lecture seule si vous le souhaitez. Le serveur le voit comme un lecteur sous \\tsclient, et rien d’autre de votre ordinateur. Chaque chemin qu’il demande est vérifié : pas de .., et aucun lien n’est suivi en cours de route, si bien que rien en dehors de ce que vous avez choisi n’est accessible.

Ces choix sont conservés sur cet appareil et ne sont jamais synchronisés : personne avec qui vous partagez un profil ne peut donc les activer.

Vérifiez par vous-même

Vous n’avez pas à nous croire sur parole. Voici des moyens de vérifier, du plus simple au plus avancé.

  1. Lisez le code

    L’application est open source. Les liens de cette page mènent aux lignes exactes qui font ce travail, dans la version que décrit cette page (c9dec31).

  2. Observez les connexions

    Utilisez un pare-feu ou un outil de surveillance du réseau. Vous verrez vos propres serveurs, le serveur de synchronisation uniquement pendant que vous êtes connecté, et api.github.com à l’ouverture de la liste des profils. Rien d’autre.

  3. Regardez ce que le serveur stocke

    Niveau avancé : récupérez votre jeton de connexion dans le dossier de données de l’application (cloud_token.json), puis demandez vos données à l’API avec GET /api/sync/profiles, ou avec POST /api/sync et une liste d’enregistrements vide, en envoyant le jeton dans l’en-tête X-Auth-Token. Vous ne recevez que des ID, des types, des horodatages, des indicateurs et du texte chiffré. Déconnectez-vous ensuite dans l’application pour mettre fin à cette session.

  4. Inspectez le trafic

    Niveau avancé : lancez sur votre ordinateur un petit proxy qui transmet les requêtes au vrai serveur, et réglez le serveur de synchronisation de l’application sur http://127.0.0.1 avec le port du proxy. L’application n’autorise le HTTP en clair que pour votre propre ordinateur. Vous verrez ce que l’application envoie, et que vos éléments sont chiffrés. (Un certificat de proxy ajouté à votre système ne fonctionnera pas, car l’application utilise sa propre liste d’autorités de certification.)

  5. Déchiffrez vos propres données

    Niveau avancé : avec votre mot de passe, vous pouvez ouvrir vos propres données avec n’importe quel outil Argon2id et AES-GCM, en utilisant les paramètres du tableau ci-dessous. Sans le mot de passe, personne ne le peut.

  6. Vérifiez votre téléchargement

    Comparez la somme de contrôle avec le fichier SHA256SUMS de la version publiée (à partir de la version 0.4), vérifiez le certificat de l’application Android avec apksigner, ou compilez l’application à partir du code source.

Les paramètres, pour vos propres outils

Dérivation de cléArgon2id, version 0x13, 64 MiB de mémoire, 3 passes, 4 voies, clé de 32 octets, sel aléatoire de 16 octets
Fichier de profil“OMNV” · version 1 · sel (16 octets) · nonce (12 octets) · AES-256-GCM de la base de données SQLite compressée avec zstd, avec son tag de 16 octets
Élément synchroniséhex(nonce (12 octets) · texte chiffré AES-256-GCM et tag), avec la clé de données de 256 bits du profil
Copie stockée de la clé du profilhex(0x02 · sel (16 octets) · nonce (12 octets) · AES-256-GCM de la clé de données de 32 octets), avec la clé calculée à partir du mot de passe de votre profil
PartageX25519, HKDF-SHA256, AES-256-GCM

Ce que cette page ne promet pas

  • Submarine n’a pas fait l’objet d’un audit de sécurité indépendant. Jusqu’ici, ses revues ont été faites par l’auteur.
  • Un mot de passe faible ou réutilisé est le point le plus faible. Utilisez un mot de passe de profil long et unique, et un mot de passe de compte différent.
  • Telnet et le VNC simple ne sont pas chiffrés, de par leur conception. L’application les signale, et peut les faire passer par un serveur SSH. Avec le VNC simple, le texte du presse-papiers que vous collez ou que le serveur copie traverse lui aussi le réseau sans chiffrement.
  • Le client RDP intégré est expérimental (il est compilé à partir d’un commit d’IronRDP, et non d’une version publiée) et reste désactivé tant que vous ne le choisissez pas pour un serveur.
  • Cette page décrit l’application au commit c9dec31. Si le code change, cette page change avec lui.