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
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).
- Dérivation de clé (paramètres Argon2id) lib.rs:237–254
- AES-256-GCM avec un nonce neuf lib.rs:256–263
- Enregistrement du fichier de profil lib.rs:431–486
- Le mot de passe pour Connexion Bureau à distance (DPAPI) rdp.rs:178–193
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…"
}- Chiffrement de chaque élément synchronisé lib.rs:1050–1056
- Ce qui est envoyé pour chaque élément lib.rs:1086–1124
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.
- La copie stockée de la clé du profil lib.rs:1551–1569
- Ouverture sur un nouvel appareil lib.rs:1574–1594
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.
- La requête de connexion cloud.rs:105–108
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.
- La recherche de mises à jour about.rs:75–139
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.
- Confinement des chemins au dossier partagé rdp_share.rs:121–147
- Ce que le presse-papiers de VNC peut transporter vnc_client.rs:180–188
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é.
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).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.
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.
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.)
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.
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 profil | hex(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 |
| Partage | X25519, 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.