Spaßkasse

Eine Self-Custody-Wallet für den Desktop. Die Schlüssel liegen auf deinem Gerät. Es gibt keinen Server, der sie hält — auch nicht verschlüsselt, auch nicht kurz.

Vorabversion. Noch keine Freigabe für echte Mittel. Es gibt bisher keinen signierten Download und keine öffentliche Version. Mainnet ist nicht einkompiliert: die Anwendung kann derzeit kein echtes Netz erreichen, auch wenn man es ihr sagen würde.

Warum Tauri und nicht Electron

Nicht wegen der Bundle-Größe und nicht wegen Offlinefähigkeit. Sondern weil privates Schlüsselmaterial nie in einen JavaScript-Heap gelangen darf.

In JavaScript lässt sich ein Seed nach Gebrauch nicht zuverlässig löschen — der Garbage Collector entscheidet, und Kopien bleiben liegen. In Rust lässt sich das erzwingen. Electron ist gegenüber einer reinen Web-App ein echter Fortschritt, aber der Main-Prozess ist weiterhin JavaScript: Zeroisierung bleibt unmöglich, und der komplette npm-Baum bleibt im Signierpfad.

Web-App Electron Tauri 2
Schlüssel vom JS-Kontext trennbar nein teilweise ja
Speicher überschreibbar nein (GC) nein (GC) ja
npm-Lieferkette im Signierpfad vollständig vollständig minimal
XSS erreicht Schlüssel direkt ja ja nein

Was zugesichert wird

Schlüssel verlassen dieses Gerät nicht

Kein Server hält Schlüsselmaterial, Wiederherstellungsphrasen oder etwas daraus Ableitbares. Kein Konto auf unserer Seite. Keine Telemetrie, kein Analytics-SDK, kein Crash-Reporter, der Inhalte überträgt.

Google-Anmeldung entsperrt die Wallet nicht

Ein OAuth-Token ist ein Bearer-Credential: Google kann es erzeugen, ein kompromittierter Browser es stehlen, eine übernommene Sitzung es wiederholen. Wer damit Schlüssel entsperrt, hat eine Custodial-Wallet mit Extraschritten gebaut. Entsperrt wird ausschließlich lokal mit einer Passphrase über Argon2id. OAuth dient allein dazu, ein bereits verschlüsseltes Backup abzulegen — Google sieht Ciphertext ohne Schlüssel.

Keine selbstgebaute Kryptographie

Jede Primitive stammt aus einer auditierten oder breit geprüften Bibliothek, die vor der Aufnahme einzeln bewertet wird. Die offiziellen Testvektoren (BIP-32/39/84/86, EIP-712, RFC 7636) laufen als Tests und werden nie übersprungen.

Was signiert wird, wird vorher entschlüsselt gezeigt

Die unsignierte Transaktion verlässt den Kern nie. Die Oberfläche bekommt eine undurchsichtige Kennung und die entschlüsselte Vorschau; bestätigt wird nur mit dieser Kennung. Hielte die Oberfläche die Transaktion und reichte sie zum Signieren zurück, könnte eine kompromittierte Oberfläche eine andere zurückreichen — und die Prüfung vergliche dann die Transaktion eines Angreifers mit dessen eigener Vorschau und wäre mit sich einverstanden.

Dasselbe gilt für EIP-712-Signaturen. Eine Unterschrift unter ein Permit ist eine übertragbare Ausgabeerlaubnis, kostet das Opfer keine Gebühr und ist in einer Wallet, die nur Hex zeigt, nicht von einem Login zu unterscheiden. Spaßkasse zeigt Domain, Typ und jedes Feld — und eine unbegrenzte Freigabe als unbegrenzt statt als 78-stellige Zahl, denn genau diese Zahl ist der Grund, warum der Angriff funktioniert: sie liest sich als Rauschen.

Fremde Eingaben werden gefuzzt

Sechs cargo-fuzz-Ziele über die Parser, die Daten lesen, die nicht von uns stammen: JSON-RPC-Antworten, ERC-20-Calldata, EIP-712-Nutzdaten, Phrasen-Import, Vault-Kopf und Transaktions-Dekodierung. Rund 35 Millionen Ausführungen, keine Treffer. Geprüft wird nicht „parst korrekt“ — die meisten Eingaben sind Müll und gehören abgelehnt — sondern dass eine Ablehnung nie zu einem Absturz wird.

Laut scheitern

Kryptographische Operationen haben keinen stillen Fallback. Eine fehlgeschlagene Entschlüsselung, Ableitung oder Signatur ist ein harter Fehler, nie ein Standardwert.

Wogegen nicht geschützt wird

Das hier auszusprechen gehört zum Sicherheitsmodell. Eine Wallet, die mehr Schutz andeutet als sie hat, ist eine Wallet, deren Nutzer Risiken eingehen, denen sie nicht zugestimmt haben.

Stand

Phase Inhalt Stand
0 Fundament, IPC-Grenze, Bedrohungsmodell fertig
1 Vault: Argon2id, XChaCha20-Poly1305, BIP-39/32, Auto-Lock fertig
2 Chain-Fundament, Signer-Trennung, RPC-Regeln fertig
3 Bitcoin (BIP-84/86, PSBT) und EVM (EIP-1559, ERC-20, EIP-712), nur Testnetz fertig
4 Oberfläche, Onboarding, Senden, Bestätigungsschirme, Notfall-Probe fertig
5 Verschlüsselte Datei-Sicherung, Drive-Sync (SLIP-39 zurückgestellt) fertig
6 WalletConnect, Ledger, Solana, Multisig offen

Was die Wallet heute kann, auf Testnetzen: Wallet anlegen oder wiederherstellen, Empfangsadressen ableiten, echte Guthaben von einem selbst eingetragenen Knoten abfragen, mit entschlüsselter Bestätigung senden, EIP-712-Signaturanfragen entschlüsseln und unterschreiben, eine verschlüsselte Sicherung schreiben und zurückholen, sie nach Drive spiegeln — und nachweisen, dass der abgetippte Zettel die Wallet wirklich wiederherstellt.

Mainnet ist nicht einkompiliert. Es liegt hinter einem Cargo-Feature, das standardmäßig aus ist; die CI schlägt fehl, falls es je in die Standardkonfiguration gerät. Eine Chain wird einzeln freigeschaltet — nach einem vollständigen Testnetz-Durchlauf, grünen Testvektoren und einem externen Review des Vault- und Signierpfads. Bitcoin kommt zuerst: sein Signierpfad hat keine Calldata, keine Freigaben und keine Typed-Data-Signaturen, also weniger, das beim ersten echten Netz schiefgehen kann.

Sicherung und Wiederherstellung

Drei Wege mit klar getrennten Zwecken. Sie zu verwechseln ist die häufigste Ursache für Totalverluste, deshalb erklärt die Oberfläche für jeden, was er wiederherstellt und was nicht.

Shamir über eine BIP-39-Phrase wird ausdrücklich abgelehnt: das ergibt ein Format, das sich nirgends außerhalb dieser Anwendung wiederherstellen lässt — also eine Sicherung, die genau dann versagt, wenn man sie braucht.

SLIP-39 ist zurückgestellt. Es war als alternatives Seed-Schema vorgesehen. Die Crate-Prüfung fiel negativ aus: die einzige SLIP-39-Bibliothek für Rust ist ein GPL-3.0-Kommandozeilenwerkzeug mit letztem Release im Januar 2020, und die Bibliothek darunter bezeichnet sich in ihrer eigenen Beschreibung als „Work-in-Progress“ — Version 0.0.3, ebenfalls von 2020. Eine Sicherung ist der falsche Ort für eine ungeprüfte Implementierung, und sie selbst zu schreiben wäre selbstgebaute Kryptographie. Wer „mehrere müssen zustimmen“ braucht, ist mit Multisig bzw. Safe besser bedient — das fasst den Seed gar nicht erst an.

Google-Drive-Sync: was Google bekommt

Die verschlüsselte Datei. Sonst nichts — kein Label, kein Zeitstempel, nichts außerhalb der Verschlüsselung.

Die Anmeldung dient ausschließlich dem Speicherplatz. Angefragt wird genau ein Recht, drive.appdata: kein openid, keine E-Mail, kein Profil. Die Anwendung kann also gar nicht erfahren, wer du bist — es gibt keine Kennung, aus der sich etwas ableiten ließe, weil wir keine anfordern. Eine Google-Anmeldung öffnet niemals den Vault.

Das Zugangs-Token liegt innerhalb des verschlüsselten Vaults. Es zu lesen setzt die Passphrase also bereits voraus — womit es strukturell unmöglich ist, dass dieses Token ein Weg hinein wird. Ein Schlüsselbund-Eintrag oder eine Konfigurationsdatei hätten auch funktioniert und genau diese Eigenschaft still aufgegeben.

Rechtlicher Hinweis

Eine rein non-custodial Wallet ohne Verfügungsgewalt über fremde Schlüssel fällt in Deutschland und der EU üblicherweise nicht unter das Kryptoverwahrgeschäft. Sobald Custody-Elemente, Swap-Funktionen, Fiat-Anbindung oder serverseitige Schlüsselanteile dazukämen, ändert sich die Einordnung (MiCAR, KWG). Genau diese sind bewusst außerhalb des Projektumfangs. Das ist ein Hinweis darauf, wo die Linie verläuft, keine Rechtsberatung.

Kontakt

Sicherheitsrelevante Funde bitte an martin.pfeffer@celox.io, nicht öffentlich. Das Repository ist bislang nicht öffentlich; es gibt daher noch keinen Quellcode-Link und keinen Download.