Het SeedSigner-project is ongewoon eerlijk over waar zijn beveiliging werkelijk vandaan komt. In hun eigen woorden:
De basis van het beveiligingsmodel van SeedSigner steunt erop dat gebruikers zelf de verantwoordelijkheid nemen om te zorgen dat ze geldige software draaien. Omdat we standaardonderdelen gebruiken, draait de hardware elke code die je erop zet.
Dat klopt precies, en het is het deel waar de meeste mensen overheen lezen. Een SeedSigner is een Raspberry Pi met een schermpje. Er is geen secure boot, geen slot van een fabrikant, en geen mening over wat je op de kaart zet. Het toestel weet niet of de software erop van het project komt of van iemand die met je download geknoeid heeft. Het enige dat tussen die twee situaties in staat, ben jij, die controleert.
Hoe controleer je dat dan? Hier zijn de instructies van het project zelf, en ik wil de aanname eruit citeren die ze doen, want dat is het hele onderwerp van dit artikel:
We gaan ervan uit dat je de commando's uitvoert op een computer waar zowel GPG als shasum al geïnstalleerd zijn, en dat je ook weet hoe je je weg vindt in een terminal.
Lees dat nog eens met een gewone klant in gedachten. Iemand die net zijn eerste hardware wallet gekocht heeft, die zenuwachtig is om dit goed te doen, en die nog nooit van zijn leven een terminal geopend heeft. We hebben hem zonet verteld dat de beveiliging van het toestel waar hij voor betaald heeft afhangt van een stap waarvan de instructies beginnen met de aanname dat hij ontwikkelaar is.
Mensen doen die stap niet
Ze doen het niet omdat het onredelijk is om het van hen te verwachten. De eerlijke versie van wat er gebeurt is dit: ze downloaden het bestand, ze zien een muur van commando's, ze besluiten dat het wel goed zal zitten, en ze schrijven het naar de kaart. De controlestap wordt iets dat in de documentatie bestaat in plaats van iets dat gebeurt.
En een beveiligingsstap die mensen overslaan is geen beveiligingsstap. Het is een disclaimer.
Ik verkoop deze toestellen, dus dit is meer mijn probleem dan dat van de meeste mensen. Als een klant de controle overslaat, is het feit dat de instructies bestonden voor geen van ons beiden een troost.
Wat ik gebouwd heb
verify.bitsaga.be doet dezelfde controle, door een bestand op een pagina te slepen.
Je kiest welk model je hebt, je klikt op de downloadknop (die je naar de eigen GitHub van SeedSigner stuurt, niet naar ons, want wij hosten geen firmware en zullen dat ook nooit doen), en dan sleep je het gedownloade bestand op de pagina. Die leest het bestand in je browser, berekent de SHA-256, en vergelijkt die met de hash die het project gepubliceerd heeft. Groen betekent dat het klopt. Rood betekent stoppen, en de volgende stap blijft op slot zodat je niet per ongeluk verder gaat.
Er wordt niets geüpload. Het bestand verlaat je computer nooit, en de pagina doet geen enkel verzoek aan een andere server, zet geen cookies, en bevat geen trackingcode. Het zijn een paar honderd regels gewone HTML, CSS en JavaScript zonder dependencies, zonder framework en zonder buildstap, dus iedereen kan het geheel in ongeveer twintig minuten lezen en het zelf vaststellen.
Ongeveer vijftien minuten, van begin tot een afgewerkte kaart, zonder een commando te typen.
Het stuk waarin ik zeg dat je haar niet moet vertrouwen
Hier komt het ongemakkelijke deel, en ik zeg het liever zelf dan dat iemand anders het aanwijst.
Een pagina die jou de verwachte hash geeft en je vervolgens vertelt dat je bestand ermee overeenkomt, kan niets bewijzen aan iemand die de pagina niet al vertrouwt. Als iemand de controle had over verify.bitsaga.be, zou die je een groen vinkje kunnen tonen voor een bestand dat nooit van SeedSigner was. Dat is een cirkel, en geen enkele hoeveelheid zorgvuldige code binnen de pagina ontsnapt eraan.
Dus de pagina doet niet alsof. Ze heeft drie standen, en het verschil ertussen is een enkele vraag: wie moet je vertrouwen?
- Easy. Bitsaga. De pagina controleert het bestand en jij neemt haar op haar woord. Vier stappen, geen jargon, een ding tegelijk.
- Advanced. SeedSigner. Elke waarde staat er: de berekende hash, de verwachte hash, de vingerafdruk van de sleutel, en links naar de plaatsen waar die sleutel gepubliceerd staat en die niet in ons beheer zijn, zodat je kunt vergelijken in plaats van vertrouwen.
- Cypherpunk. Niemand. De terminalcommando's om het hele ding zonder de pagina te doen, en de Docker-regel om de firmware zelf uit de broncode te herbouwen en de hash er zelf uit af te leiden.
Die laatste telt zwaarder dan het lijkt. De builds van SeedSigner zijn reproduceerbaar, wat betekent dat niemand voor de hash hoeft in te staan. Je kunt hem uit de broncode afleiden. Dat is de sterkste schakel in de hele ketting, en het is de reden dat deze pagina een gids is en geen autoriteit.
De Cypherpunk-stand verkoopt je ook niets. Geen boekingslink, geen winkellink. Als je het soort mens bent dat die stand leest, kwam je niet voor een aanbod.
Wat ze nog steeds niet kan
Software kan geen hardware controleren. Een perfect gecontroleerde image op een gemanipuleerd bordje is nog steeds een gemanipuleerd bordje. De controle zegt ook niets over hoe je seed gemaakt is of over de vraag of het ontvangstadres waar je naar kijkt echt van jou is.
Er bestaat geen versie hiervan die vertrouwen volledig wegneemt. Reproduceerbare builds duwen de grens heel ver op en wissen haar niet uit, want uiteindelijk is het de compiler, de processor, of de broncode zelf. Wie je vertelt dat zijn product nul vertrouwen bereikt, verkoopt je iets. De pagina zegt dit allemaal hardop, op dezelfde plek waar ze je het groene vinkje toont.
De details, voor wie ze wil
Ze dekt alleen de Raspberry Pi Zero v1.3, want dat is het bordje in elk toestel dat wij verkopen, en ze pint twee firmwares vast: de standaard SeedSigner-release en de Satochip-smartcardfork. Die twee worden op volledig verschillende manieren ondertekend, wat het interessantste deel van het bouwen was. SeedSigner ondertekent een checksumbestand met PGP. De beheerder van de smartcardfork ondertekent het checksumblok met een Bitcoin-berichtondertekening, te controleren tegen een adres dat op zijn eigen website, YouTube-kanaal en Reddit-profiel gepubliceerd staat.
Elke vastgepinde waarde is opgehaald en gecontroleerd in plaats van uit documentatie overgenomen, en de commando's en hun uitvoer staan in de repository zodat je ze kunt herhalen. Het controleren van die Bitcoin-berichtondertekening vroeg om een implementatie vanaf nul, omdat ze een Electrum-conventie gebruikt waardoor verschillende algemene tools een valse mismatch melden. Die staat ook in de repository, in ongeveer honderddertig regels gewone Python.
Nog iets dat de pagina afhandelt, wat helemaal niets met beveiliging te maken heeft maar meer supportberichten oplevert dan wat dan ook: als je een SeedSigner Plus hebt, is zijn grotere scherm niet de standaard van de firmware, en de instelling overleeft geen herstart tenzij je eerst persistentie aanzet. De pagina loodst je erdoorheen, of geeft je een bestandje van twee regels om in plaats daarvan op de kaart te zetten.
Neem het mee
Het geheel valt onder de MIT-licentie en staat op GitHub. Verkoop je zelf SeedSigners, fork het dan en zet je eigen naam erop. Zie je iets fout staan, zeker in de vastgepinde waarden, dan hoor ik het oprecht liever wel dan niet.
Wil je op het toestel oefenen voor je hardware aankomt, dan draait de echte firmware ook in een browsertabblad. En als je dit liever niet alleen doet: ik geef begeleide installatiegesprekken waarin we het samen doornemen via een schermdeling.
Dit is een onafhankelijk project. Het is niet verbonden aan of goedgekeurd door het SeedSigner-project, en de smartcardfirmware is een onafhankelijke fork ervan. Je download controleren is de moeite waard of je deze pagina nu gebruikt of niet: de officiële instructies en de sleutel van het project op Keybase zijn de referentie, en deze pagina is een oprit ernaartoe in plaats van een vervanging.
