Sicherheitsmodell
Es gibt keinen vertrauenswürdigen Dritten in Ferry, also wird jede Regel unabhängig von der Maschine durchgesetzt, die sich darum kümmert, anhand kryptografischer Beweise statt des Worts eines Servers. Hier ist, was das in der Praxis bedeutet.
Pre-Release
Das Protokoll und das Speicherformat sind noch nicht festgeschrieben, und es hat noch keine externe Sicherheitsprüfung stattgefunden. Behandelt Ferry bis zur 1.0 entsprechend.
Jede Maschine hat einen ed25519-Identitätsschlüssel, erzeugt beim ersten Start des Daemons. Er wird nie im Klartext auf Platte geschrieben. Standardmäßig lebt er im OS-Schlüsselbund — macOS Keychain, Windows DPAPI, Linux Secret Service. Eine kopflose Maschine ohne Desktop-Schlüsselbund bewahrt ihn stattdessen in einer mit age-scrypt verschlüsselten Datei identity.age, entsperrt durch eine Passphrase aus der Umgebung oder einer Datei; die falsche Passphrase lässt den Start fehlschlagen.
Zwei Maschinen werden erst durch einen bewussten Austausch zu Peers. Eine Seite führt ferry pair listen aus und liest der anderen einen kurzen numerischen Code vor, die ihn in ferry pair connect eingibt. Ein SPAKE2-Austausch über diesen Code leitet ein gemeinsames Geheimnis ab, und beide Bildschirme zeigen dann dieselbe Verifizierungsphrase aus einer festen Wortliste. Beide Personen bestätigen die Übereinstimmung. Der Schritt lässt sich nie überspringen, wird nie standardmäßig bestätigt, und nie durch „diesem Netzwerk vertrauen“ umgangen. Ein nicht übereinstimmender Code oder eine abgelehnte Phrase bricht ab, ohne etwas zu schreiben.
Jede Verbindung öffnet mit einem Noise-XK-Handshake. Der Antwortende gleicht den statischen Schlüssel des Initiators mit dem lokalen Roster ab und trennt die Verbindung, wenn er nicht dort steht — bevor auch nur ein Frame als Befehl gelesen wird. Das ist auf Transportebene durchgesetzt. Die Netzwerk-Crate kann die Krypto-Crate nicht importieren, also kommt die Roster-Prüfung als injiziertes Prädikat über rohe Schlüssel-Bytes herein: das Netzwerk setzt sie mechanisch durch und geht nie ohne Bestehen in den Transportmodus, und die Domänenschicht liefert die eigentliche Entscheidung. Keine Schicht kann versehentlich dazu gebracht werden, der anderen zu vertrauen. Ein Hostname in einem Netzwerk ist eine unauthentifizierte Behauptung; Entdeckung ist kein Vertrauen.
Nutzdaten werden mit age versiegelt. Ein geheimes Element bekommt zusätzlich einen eigenen Wegwerf-Datenschlüssel. „Nach dem Lesen verbrennen“ zerstört es wirklich: zuerst den umhüllten Schlüssel, dann den Chiffretext, dann die Zeile. Ein unterbrochener Burn ist so konzipiert, dass er unlesbaren Chiffretext hinterlässt — nie ein offenes Fragment. Ein Klartext-Geheimnis wird nie unverschlüsselt auf Platte geschrieben, nie protokolliert, und nie in einem Absturzbericht enthalten.
TTL und Burn-after-Read werden ab dem Moment der Zustellung nach der monotonen Uhr des Empfängers gemessen — nie nach einem absoluten Zeitstempel, den der Absender geliefert hat, denn die Uhr eines Absenders ist vom Angreifer kontrollierbar, und zwei Laptops an einem Hotspot sind sich ohnehin nicht über die Uhrzeit einig. Ein Zehn-Minuten-Geheimnis, das zwanzig Minuten in der Warteschlange stand, hat nach der Ankunft immer noch zehn lesbare Minuten. Stimmen die monotone und die Wanduhr-Schätzung nach einem Neustart nicht überein, läuft das Element ab. Eine beschädigte oder böswillige, weit in der Zukunft liegende Frist wird abgelehnt statt als unbegrenzte TTL behandelt.
Das Audit-Log hält fest, dass ein Ereignis stattgefunden hat — Akteur, Art, Element-ID, Zeit, Ergebnis — und nie, was es enthielt. Pairing, Roster-Importe, Zustellungen und Öffnungen schreiben alle eine Zeile. Die eine Ausnahme ist bewusst: schlägt das Schreiben der Zeile „geöffnet“ mit einem E/A-Fehler fehl, wird ein Burn trotzdem nie deswegen als fehlgeschlagen gemeldet.
Keine Maschine hält, leitet weiter oder relayt je Chiffretext, der für einen Dritten bestimmt ist. Beide Enden müssen im selben Netzwerk erreichbar sein. Es gibt kein Relay und wird nie eines geben — nicht einmal vorübergehend.
Die Kryptografie ist aus Primitiven zusammengesetzt, die andere geprüft haben: age für die Versiegelung, Noise XK für den Transport, SPAKE2 für das Pairing, ed25519 für Identität und Roster-Signaturen. Keine neuartigen Konstruktionen, keine selbstgebaute Schlüsselableitung.
Umfang
Im Umfang
Die Pairing-Zeremonie, der Noise-Transport, die Roster-Durchsetzung, wie Nutzdaten versiegelt werden, Burn-after-Read, Ablauf- und TTL-Handhabung, dass das Audit-Log inhaltsfrei bleibt, die IPC-Grenze, und beide Identitäts-Schlüsselspeicher.
Nicht im Umfang
Eine bereits kompromittierte Maschine. Ferry schützt Daten während der Übertragung und hinter einem gesperrten Schlüsselbund oder einer verschlüsselten Identitätsdatei. Es kann einer Maschine, auf der Malware unter eurem Konto läuft, nicht helfen, ebenso wenig jemandem, der bereits die Passphrase des Datei-Schlüsselspeichers hat.
Etwas gefunden? Öffnet kein öffentliches Issue. Schreibt an [email protected] mit dem Problem und ungefähr wo, wie man es reproduziert, und was jemand damit anstellen könnte. Ihr bekommt innerhalb weniger Tage Antwort; bitte gebt einen angemessenen Zeitraum für einen Fix und ein Release, bevor ihr öffentlich darüber schreibt.