Ferry

Modèle de sécurité

Comment Ferry protège vos données

Il n'y a aucun tiers de confiance dans Ferry, donc chaque règle est appliquée indépendamment par la machine qui s'en soucie, contre une preuve cryptographique plutôt que la parole d'un serveur. Voici ce que ça veut dire en pratique.

Pré-version

Le protocole et le format de stockage ne sont pas figés, et aucun audit de sécurité externe n'a eu lieu. Gardez-le en tête jusqu'à la 1.0.

01

La clé d'identité

Chaque machine a une clé d'identité ed25519, générée au premier lancement du démon. Elle n'est jamais écrite sur disque en clair. Par défaut elle vit dans le trousseau de l'OS — Keychain macOS, DPAPI Windows, Secret Service Linux. Une machine sans tête et sans trousseau la garde plutôt dans un fichier identity.age chiffré avec age-scrypt, déverrouillé par une phrase secrète venant de l'environnement ou d'un fichier ; une mauvaise phrase fait échouer le démarrage.

02

La cérémonie d'appairage

Deux machines ne deviennent pairs que par un échange délibéré. Un côté lance ferry pair listen et lit un court code numérique à l'autre, qui le tape dans ferry pair connect. Un échange SPAKE2 sur ce code dérive un secret partagé, et les deux écrans affichent alors la même phrase de vérification tirée d'une liste de mots fixe. Les deux personnes confirment qu'elle correspond. L'étape n'est jamais sautable, jamais « oui » par défaut, jamais contournée par « faire confiance à ce réseau ». Un code non concordant ou une phrase refusée annule sans rien écrire.

03

L'application du roster au handshake

Chaque connexion ouvre par un handshake Noise XK. Le répondeur résout la clé statique de l'initiateur contre le roster local et coupe la connexion si elle n'y est pas — avant qu'une seule trame soit lue comme une commande. C'est appliqué dans la couche transport. La crate réseau ne peut pas importer la crate crypto, donc la vérification du roster entre comme un prédicat injecté sur des octets de clé bruts : le réseau l'applique mécaniquement et n'entre jamais en mode transport sans un passage, et la couche domaine fournit la décision réelle. Aucune couche ne peut être amenée à faire confiance à l'autre par accident. Un nom d'hôte sur un réseau est une affirmation non authentifiée ; la découverte n'est pas la confiance.

04

Scellement et destruction à la lecture

Les charges utiles sont scellées avec age. Un élément secret reçoit en plus sa propre clé de données jetable. « Détruire à la lecture » le détruit réellement : la clé enveloppée d'abord, puis le chiffré, puis la ligne. Une destruction interrompue est conçue pour laisser un chiffré inouvrable — jamais un orphelin ouvrable. Un secret en clair n'est jamais écrit non chiffré sur disque, jamais journalisé, et jamais inclus dans un rapport de crash.

05

L'expiration sur l'horloge du destinataire

Le TTL et la destruction à la lecture sont mesurés sur l'horloge monotone du destinataire, à partir du moment de la livraison — jamais sur un horodatage absolu fourni par l'expéditeur, car l'horloge d'un expéditeur est contrôlée par l'attaquant et deux portables sur un partage de connexion ne sont de toute façon pas d'accord sur l'heure. Un secret de dix minutes resté vingt minutes en file dispose encore de dix minutes lisibles après son arrivée. Si les estimations monotone et murale divergent après un redémarrage, l'élément expire. Une échéance corrompue ou hostile loin dans le futur est rejetée plutôt que traitée comme un TTL sans limite.

06

Un journal d'audit sans contenu

Le journal d'audit consigne qu'un événement a eu lieu — l'acteur, le type, l'id de l'élément, l'heure, le résultat — et jamais ce qu'il contenait. L'appairage, les imports de roster, les livraisons et les ouvertures écrivent tous une ligne. La seule exception est délibérée : si l'écriture de la ligne « ouvert » échoue sur une erreur d'E/S, une destruction n'est jamais rapportée comme échouée pour autant.

07

Livraison directe uniquement

Aucune machine ne détient, ne transmet, ni ne relaie jamais un chiffré destiné à un tiers. Les deux bouts doivent être joignables sur le même réseau. Il n'y a pas de relais et il n'y en aura jamais — pas même temporairement.

08

Des primitives, pas des constructions

La cryptographie est assemblée à partir de primitives que d'autres ont revues : age pour le scellement, Noise XK pour le transport, SPAKE2 pour l'appairage, ed25519 pour l'identité et les signatures de roster. Aucune construction nouvelle, aucune dérivation de clé faite maison.

Périmètre

Ce qu'un rapport de sécurité devrait couvrir

Dans le périmètre

La cérémonie d'appairage, le transport Noise, l'application du roster, la façon dont les charges sont scellées, la destruction à la lecture, la gestion de l'expiration et du TTL, le journal d'audit qui reste sans contenu, la frontière IPC, et les deux keystores d'identité.

Hors périmètre

Une machine déjà compromise. Ferry protège la donnée en transit et derrière un trousseau verrouillé ou un fichier d'identité chiffré. Il ne peut rien pour une machine qui fait tourner un malware sous votre compte, ni pour quelqu'un qui a déjà la phrase secrète du keystore fichier.

Vous avez trouvé quelque chose ? N'ouvrez pas d'issue publique. Écrivez à [email protected] en indiquant quel est le problème et à peu près où, comment le reproduire, et ce que quelqu'un pourrait en faire. Vous aurez une réponse sous quelques jours ; merci de laisser un délai raisonnable pour un correctif et une publication avant d'en parler publiquement.