Bitcoin Transactions QR Airgapped: Come Gestire Bitcoin in Totale Sicurezza

Just because you’re paranoid doesn’t mean they aren’t after you.
(Joseph Heller, Catch-22)
L’aspetto più affascinante del metodo descritto in questo articolo è che il wallet offline di fatto esiste solo come mnemonic. Ogni volta che lo si vuole usare nel computer offline occorre fare un recovery a partire dalle 12 (o 24) parole e dalla passphrase se utilizzata.
Questa è un’enorme riduzione della superficie d’attacco. Ma vediamo i dettagli.
Introduzione
Tra i vari vettori di attacco che un wallet può subire, uno dei più critici è rappresentato dalla possibilità che il dispositivo utilizzato per firmare le transazioni sia connesso alla rete. È certamente vero che i wallet hardware sono stati progettati per mitigare questo rischio, ma ci sono alcuni aspetti che personalmente non mi lasciano del tutto tranquillo.
Wallet come Ledger Nano o Trezor, ad esempio, sono in teoria isolati dal computer connesso a Internet, ma in pratica sono a quest’ultimo fisicamente collegati tramite cavo. Esiste dunque una connessione fisica attiva, e ciò solleva una domanda legittima: come possiamo essere certi che non possa avvenire un’iniezione di codice malevolo dal web verso il wallet? Inoltre, sappiamo che questi dispositivi funzionano spesso tramite tool online, e che in alcuni casi (come nel caso di Ledger) vengono installate applicazioni all’interno del wallet hardware stesso per gestire specifiche blockchain.
Perché non mi fido dei wallet hardware
Per queste ragioni ho deciso di sperimentare una procedura alternativa, interamente air-gapped e basata su Electrum, uno dei wallet più affidabili e trasparenti nel panorama open source.
I limiti strutturali di Ledger e Trezor
È pur vero che dispositivi come Ledger e Trezor sono considerati sicuri, ma rimane un problema di fondo: come possiamo avere la certezza che il firmware installato sul dispositivo non stia eseguendo operazioni non documentate? Un caso emblematico è rappresentato da Ledger, che ha introdotto una funzione di recupero delle parole di backup. Questo ha sollevato forti perplessità nella comunità: se il dispositivo può inviare altrove il seed per un “recovery”, allora tecnicamente potrebbe anche inviarlo a un attaccante, o a chi controlla il software. Inoltre, il codice sorgente di Ledger non è pubblico, quindi non è possibile sapere con esattezza come funziona il sistema internamente.
Non è solo una questione di fiducia, ma anche di trasparenza e verificabilità. Ad esempio, il processo di generazione dei numeri casuali per creare le chiavi private dovrebbe essere sufficientemente entropico; ma se venisse invece eseguito con un pattern deterministico, potrebbe in futuro costituire una vulnerabilità latente. In altre parole, non possiamo sapere se un giorno un attacco premeditato da parte di “Mr. Ledger” possa compromettere i fondi degli utenti.
Trezor e il problema della verificabilità
Il discorso è parzialmente diverso per Trezor, che pubblica il proprio codice sorgente. Tuttavia, la verifica del fatto che il codice installato nel dispositivo corrisponda esattamente a quello disponibile su GitHub non è alla portata di tutti: richiede tempo, competenze e strumenti adeguati.
Conclusione della premessa
Alla fine potrebbe sembrare un discorso eccessivamente paranoico, ma nella sicurezza informatica la paranoia non è un difetto: è spesso l’unica vera forma di prudenza. e basata su Electrum, uno dei wallet più affidabili e trasparenti nel panorama open source. Ho anche scelto di trasferire i dati esclusivamente tramite codici QR, evitando completamente l’uso di chiavette USB o altri supporti esterni.
Il mio obiettivo era validare un metodo sicuro, pratico e replicabile per firmare una transazione offline, mantenendo le chiavi private su un dispositivo completamente isolato da Internet.
Considerazioni sul modello di minaccia
Possiamo distinguere, almeno a grandi linee, diversi livelli di esigenza in termini di sicurezza (o, se si preferisce, diversi livelli di paranoia):
- Minimizzare l’esposizione al malware: desidero essere certo che il mio wallet per la firma delle transazioni non possa essere infettato da codice malevolo. Questo richiede un isolamento netto tra il dispositivo air-gapped e qualunque sistema online.
- Sfidare la fiducia nel produttore del wallet: desidero superare anche il sospetto che il costruttore stesso possa inserire backdoor o funzionalità non documentate nel firmware.
- Eliminare ogni canale di comunicazione diretto: desidero garantire che non vi sia alcuno scambio fisico (file, pendrive) tra il computer online e il dispositivo air-gapped.
- Controllare la generazione della chiave: vorrei essere certo che i numeri casuali usati per generare la chiave privata siano realmente casuali, e non deterministici o manipolabili.
In questo post non affronto direttamente l’ultimo punto: do per assunto che il software usato (Electrum su Tails) generi le chiavi con un livello di entropia adeguato e conforme agli standard. Qualora non si volesse fare affidamento su nessuna libreria o generatore software, l’unica alternativa sarebbe quella di ricorrere a metodi manuali come il lancio di dadi o di monete, bit per bit (e anche in quel caso resterebbero dubbi su come usare correttamente l’entropia raccolta).
Tuttavia, per quanto riguarda i primi tre punti, ritengo che il flusso air-gapped con QR code rappresenti un buon compromesso tra sicurezza e praticità.
Ambiente operativo: Android e una live USB con Tails
La versione di Electrum utilizzata nel mio esperimento è la 4.3.4, che corrisponde a quella preinstallata in Tails al momento in cui scrivo. Sarebbe teoricamente possibile aggiornarla, ma questo richiederebbe l’inserimento manuale di pacchetti o file binari in un sistema progettato per non mantenere dati persistenti. Un’operazione simile può compromettere l’affidabilità dell’ambiente, quindi ho preferito evitarla.
È importante sottolineare che il corretto funzionamento della procedura dipende dalla disponibilità di una versione di Electrum sufficientemente aggiornata. Versioni troppo vecchie potrebbero non supportare il formato PSBT o le funzionalità di codifica e lettura dei QR code necessarie per il flusso air-gapped.
Per semplificare l’intera procedura, ho deciso di utilizzare un telefono Android come dispositivo online, installando l’app ufficiale di Electrum, e un portatile avviato tramite Tails, una distribuzione Linux pensata per la sicurezza e la privacy, utilizzato come wallet air-gapped.
Tails è progettato per non lasciare tracce permanenti sul sistema: tutto viene eseguito in memoria, senza scrivere nulla sul disco, e la connessione a Internet può essere completamente disattivata. Queste caratteristiche lo rendono particolarmente adatto per operazioni di firma offline.
Ecco alcuni vantaggi pratici che ho riscontrato nell’utilizzare Tails:
- Nessuna persistenza dei dati: al termine di ogni sessione, il sistema viene azzerato. Questo riduce il rischio che file sensibili o configurazioni compromesse possano permanere.
- Verificabilità: l’immagine ISO di Tails può essere verificata tramite firma GPG, assicurando l’integrità del sistema prima di ogni avvio.
- Isolamento completo: ho disattivato manualmente tutte le interfacce di rete. Le chiavi private non hanno mai avuto accesso a Internet.
- Sistema amnesico: ogni avvio parte da un ambiente pulito e controllato.
- Compatibilità immediata: Electrum è preinstallato nella versione standard di Tails, facilitando l’intero processo.
Cosa ho utilizzato
Per facilitare l’esecuzione della procedura, ho utilizzato un portatile dotato di webcam, su cui ho avviato Tails, e uno smartphone Android anch’esso provvisto di fotocamera. Entrambi i dispositivi devono essere in grado di visualizzare e scansionare codici QR con sufficiente definizione.
È importante precisare che questa configurazione non è attualmente replicabile su iPhone, poiché Electrum non è disponibile su iOS. La scelta di Android è stata quindi anche una necessità tecnica: al momento in cui scrivo, non esistono porting ufficiali o affidabili di Electrum per l’ecosistema Apple.
- Un portatile con Tails (wallet air-gapped)
- Un telefono Android con Electrum installato (wallet watch-only)
- Le fotocamere dei due dispositivi per inquadrare i codici QR
- Nessun collegamento fisico tra i due ambienti
Tutto il processo si è svolto senza lo scambio di file né l’uso di dispositivi USB: soltanto QR code generati e letti tra schermo e fotocamera.
Creazione del wallet offline
Per visualizzare la chiave pubblica estesa (xpub) in Electrum, è sufficiente cliccare sul menu “Wallet” e poi su “Information”. Da lì è possibile accedere alla stringa in formato testuale o, più utilmente nel nostro caso, al relativo codice QR.
Ho avviato Tails sul portatile e aperto Electrum, creando un nuovo wallet standard. Una volta generato il seed, ho completato la verifica e attivato la visualizzazione della chiave pubblica estesa (xpub), generando il relativo QR code. Questo è stato il primo e unico “punto di uscita” dei dati dal wallet offline.
Impostazione del wallet watch-only
Per impostare correttamente il wallet in modalità watch-only su Android, è necessario avviare la creazione di un nuovo wallet e selezionare l’opzione “Importare una chiave o un indirizzo Bitcoin”. A quel punto, si può inquadrare il QR code contenente la master public key (xpub) mostrato sul dispositivo offline.
Electrum importerà così la chiave pubblica e ricostruirà il portafoglio completo in sola lettura, consentendomi di monitorare il saldo, ricevere fondi e costruire transazioni, pur non avendo alcun accesso al seed o alle chiavi private.
Sul telefono Android, ho avviato Electrum e creato un nuovo wallet, scegliendo l’opzione per importare una chiave pubblica. Ho inquadrato il QR code dell’xpub visualizzato dal dispositivo con Tails.
Electrum ha ricostruito il portafoglio in modalità watch-only, consentendomi di monitorare il saldo, ricevere fondi e creare transazioni non firmate, senza mai conoscere il seed.
Ricezione di fondi
Per testare il flusso completo, ho trasferito una piccola quantità di Bitcoin a uno degli indirizzi generati dal wallet watch-only. Dopo alcune conferme, il saldo era visibile correttamente.
Creazione della transazione
Dal wallet Android ho avviato una nuova transazione, specificando l’indirizzo di destinazione e l’importo. Electrum consente di salvare la transazione non firmata nel formato PSBT e mostrarla come QR code. Ho utilizzato questa funzione per visualizzarla sullo schermo del telefono.
Firma della transazione offline
Sul dispositivo con Tails ho aperto Electrum, selezionato “Carica transazione → da codice QR” e inquadrato il QR mostrato dallo smartphone. Electrum ha caricato la transazione PSBT, che ho esaminato attentamente prima di procedere con la firma.
Dopo la firma, Electrum ha generato un nuovo QR code contenente la versione firmata della transazione.
(A questo punto ho avuto un attimo di soddisfazione: mi sono sentito un po’ come un operatore dei servizi segreti, anche se con meno glamour e più QR code.)
Perché ho scelto i QR code al posto di una chiavetta USB
Una delle motivazioni principali che mi ha spinto a usare i QR code riguarda il profilo di sicurezza. Quando si utilizza un supporto USB per trasferire file tra un dispositivo online e uno air-gapped, si introduce inevitabilmente un vettore fisico di attacco. È sufficiente un malware presente sul computer connesso alla rete – o nel firmware della chiavetta stessa – per compromettere il dispositivo offline.
I QR code, invece, eliminano completamente questo rischio, in quanto non comportano alcun contatto fisico tra i due dispositivi. L’unico elemento condiviso è l’immagine visiva del codice, visualizzata da uno schermo e letta da una fotocamera. Di conseguenza, non vi è alcun canale attraverso cui possa avvenire la trasmissione di codice dannoso.
Questa modalità riduce sensibilmente la superficie di attacco, preservando l’integrità del wallet air-gapped e semplificando al tempo stesso la gestione operativa.
Trasmissione finale
Ho caricato la transazione firmata sul wallet Android inquadrando il QR code generato dal portatile con Tails. Electrum ha riconosciuto immediatamente i dati e, dopo una rapida conferma, ho inviato la transazione alla rete.
Possiamo distinguere, almeno a grandi linee, diversi livelli di esigenza in termini di sicurezza (o, se si preferisce, diversi livelli di paranoia):
- Minimizzare l’esposizione al malware: desidero essere certo che il mio wallet per la firma delle transazioni non possa essere infettato da codice malevolo. Questo richiede un isolamento netto tra il dispositivo air-gapped e qualunque sistema online.
- Sfidare la fiducia nel produttore del wallet: desidero superare anche il sospetto che il costruttore stesso possa inserire backdoor o funzionalità non documentate nel firmware.
- Eliminare ogni canale di comunicazione diretto: desidero garantire che non vi sia alcuno scambio fisico (file, pendrive) tra il computer online e il dispositivo air-gapped.
- Controllare la generazione della chiave: vorrei essere certo che i numeri casuali usati per generare la chiave privata siano realmente casuali, e non deterministici o manipolabili.
In questo post non affronto direttamente l’ultimo punto: do per assunto che il software usato (Electrum su Tails) generi le chiavi con un livello di entropia adeguato e conforme agli standard. Qualora non si volesse fare affidamento su nessuna libreria o generatore software, l’unica alternativa sarebbe quella di ricorrere a metodi manuali come il lancio di dadi o di monete, bit per bit (e anche in quel caso resterebbero dubbi su come usare correttamente l’entropia raccolta).
Tuttavia, per quanto riguarda i primi tre punti, ritengo che il flusso air-gapped con QR code rappresenti un buon compromesso tra sicurezza e praticità.
Diagramma del flusso
Riferimenti
- Guida ufficiale Electrum per cold storage: https://electrum.readthedocs.io/en/latest/coldstorage.html
- Ledger e la controversia su Ledger Recover: https://decrypt.co/140364/is-there-a-backdoor-in-ledger-hardware-wallets
- Malware e app false di Ledger Live: https://www.techradar.com/pro/security/mac-users-beware-fake-ledger-apps-are-being-used-by-hackers-to-steal-seed-phrases-and-hack-accounts
- Attacchi ai wallet air-gapped: https://arxiv.org/abs/1804.08714
- La questione del generatore Dual EC DRBG: https://en.wikipedia.org/wiki/Dual_EC_DRBG
Conclusioni
Questa esperienza ha confermato la solidità dell’approccio air-gapped, soprattutto se potenziato con strumenti come Electrum e ambienti come Tails. L’uso esclusivo dei QR code ha semplificato il processo e rafforzato la sicurezza, evitando completamente il rischio associato allo scambio di file fisici.
Ritengo che questo metodo sia particolarmente indicato per chi desidera conservare Bitcoin in modo sicuro per lunghi periodi, o per chi vuole evitare l’acquisto di hardware wallet senza rinunciare a un alto standard di protezione.
L’intero processo richiede un minimo di competenze tecniche e una certa disciplina operativa, ma offre in cambio una garanzia importante: le chiavi private non hanno mai abbandonato il dispositivo offline.