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.
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.
- Schadsoftware mit deinen Rechten. Ein Keylogger liest die Passphrase beim Tippen mit. Keine Software auf demselben Rechner verhindert das. Die ehrliche Antwort darauf ist eine Hardware-Wallet — deshalb steht Ledger-Unterstützung auf der Liste.
- Ein kompromittiertes Betriebssystem, Kernel oder eine kompromittierte Firmware.
- Eine vergessene Passphrase oder verlorene Wiederherstellungsphrase. Es gibt kein Zurücksetzen, keinen Wiederherstellungslink, keinen Support-Weg. Wir können nicht helfen, weil wir nichts halten.
- Eine schwache Passphrase. Argon2id mit 256 MiB kauft etwa 25–30 Bit Vorsprung gegenüber einer GPU-Farm. Eine achtstellige Passphrase rettet es nicht.
-
Ein Token, das behauptet, ein bekannter zu sein.
symbol()gibt zurück, was der Vertrag will — jeder kann für den Preis einer Transaktion ein Token deployen, das sich USDC nennt. Spaßkasse begrenzt Symbole auf zehn druckbare ASCII-Zeichen (das schließt Homoglyphen und Schreibrichtungs-Tricks in einer Regel aus) und zeigt immer die Vertragsadresse daneben. Verlässlich ist nur die Adresse. - Screenshot-Sperre als Garantie. Sie funktioniert unter macOS und Windows. X11 und Wayland bieten kein Äquivalent, und die Oberfläche behauptet dort auch keines.
- Zwischenablage-Manipulation. Die Zwischenablage wird 20 s nach dem Kopieren geleert, aber Clipboard-Manager haben den Inhalt längst dupliziert. Was wirklich schützt, ist die gruppierte Adressanzeige und der QR-Code als bevorzugter Empfangsweg.
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.
- Wiederherstellungsphrase — die einzige Sicherung, die ohne Spaßkasse funktioniert. Alles andere ist Komfort obendrauf.
- Verschlüsselte Datei-Sicherung — enthält, was die Phrase nicht wiederherstellt: Konten, Bezeichnungen, Ableitungspfade, Adressbuch.
- Google-Drive-Sync — dieselbe Datei, die letzten fünf Stände, jederzeit abschaltbar. Google sieht ausschließlich Ciphertext.
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.