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

sequenceDiagram participant Offline as Wallet Offline (Tails) participant Online as Wallet Online (Android) Offline->>Online: Mostra QR con xpub (da Wallet → Information) Online->>Online: Crea wallet watch-only importando xpub Note right of Online: Riceve BTC su un indirizzo generato Online->>Online: Prepara transazione PSBT Online->>Offline: Mostra QR con PSBT (non firmata) Offline->>Offline: Scansiona e firma PSBT Offline->>Online: Mostra QR con PSBT firmata Online->>Online: Scansiona QR e invia transazione Note over Offline,Online: Le chiavi private non lasciano mai il dispositivo offline

Riferimenti

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.