Le criptovalute nascono nel 2008 con il protocollo Bitcoin, e la sicurezza dei fondi che vi transitano dipende interamente da un elemento: la chiave privata che controlla il portafoglio. Se quella chiave è generata in modo prevedibile, nessuna password e nessuna precauzione successiva possono proteggere il denaro che custodisce.

È esattamente ciò che è accaduto con Randstorm, una vulnerabilità che ha interessato i wallet di criptovaluta generati tra il 2011 e il 2015 attraverso alcune piattaforme web. Il difetto non stava nelle piattaforme, ma in una libreria di terze parti che tutte utilizzavano.

  1. Come nasce Randstorm
  2. Perché una patch non risolve il problema
  3. Le piattaforme coinvolte
  4. L’impatto stimato
  5. Cosa fare se avete un wallet di quel periodo
Come la generazione di chiavi private deboli ha esposto i wallet di criptovaluta creati fra il 2011 e il 2015

Come nasce Randstorm

La vulnerabilità è stata individuata nel 2022 dai ricercatori di Unciphered, durante un’operazione di recupero delle credenziali di un portafoglio creato nel 2014. Analizzando il modo in cui quel wallet era stato generato, i ricercatori hanno risalito la catena fino a una libreria JavaScript open source chiamata JSBN, utilizzata da numerose piattaforme di criptovaluta per creare le chiavi private direttamente nel browser dell’utente.

Il punto critico è la funzione `SecureRandom` di quella libreria. Generare una chiave crittografica richiede numeri casuali di qualità elevata, e la funzione tentava di ottenerli da `window.crypto.random`, una delle prime interfacce pensate per la crittografia nel browser. Quella interfaccia era però disponibile soltanto nei browser della famiglia Netscape Navigator, già obsoleti all’epoca in cui la libreria veniva usata.

Quando non la trovava, la libreria ripiegava su `Math.random`, una funzione progettata per usi generici e non per la crittografia. La differenza fra le due non è di grado ma di natura.

Funzione genericaFunzione crittografica
Progettata perSimulazioni, animazioni, ordinamento casuale di elementiChiavi, token, segreti, qualsiasi valore che deve restare non indovinabile
Origine dei valoriUn algoritmo deterministico che parte da uno stato internoEntropia raccolta dal sistema operativo
PrevedibilitàChi conosce lo stato interno ricostruisce la sequenza, in avanti e a ritrosoLa conoscenza dei valori precedenti non consente di prevedere i successivi
Uso correttoTutto ciò che non ha bisogno di restare segretoTutto il resto

Il risultato è che le chiavi generate in quel modo non avevano l’imprevedibilità attesa da una chiave a 256 bit. L’entropia effettiva scendeva a valori talmente inferiori da rendere praticabile un attacco a forza bruta: non serve provare tutte le combinazioni possibili, basta provare quelle che quella funzione poteva effettivamente produrre.

C’è anche una gradazione temporale. Le implementazioni successive hanno progressivamente migliorato la raccolta di entropia, quindi violare un portafoglio generato nel 2012 richiede in genere meno risorse rispetto a uno del 2014.

Perché una patch non risolve il problema

Nella maggior parte dei casi una vulnerabilità si chiude aggiornando il componente difettoso. Qui no, e la ragione riguarda il momento in cui il danno si è prodotto.

La chiave privata è stata generata una volta sola, anni fa, ed è quella che controlla i fondi da allora. Correggere oggi la libreria non rigenera la chiave che è già stata creata: il portafoglio resta debole per sempre, indipendentemente da quante versioni della libreria siano state pubblicate dopo. È il motivo per cui l’unica raccomandazione possibile è creare un portafoglio nuovo e trasferirvi i fondi.

Il secondo aspetto riguarda la provenienza del difetto. Nessuna delle piattaforme coinvolte aveva scritto quel codice: lo avevano ereditato importando una libreria di uso comune. Un’azienda che avesse verificato il proprio codice sorgente non avrebbe trovato nulla, perché il problema stava in una dipendenza esterna, in una funzione che tutti davano per corretta.

Il difetto di Randstorm non riguarda del resto le criptovalute in quanto tali, ma il modo in cui viene prodotta la casualità. Nelle applicazioni aziendali lo stesso errore si presenta in punti diversi, con conseguenze diverse.

Dove serve casualità imprevedibileCosa accade se è prevedibile
Token di sessioneUn attaccante calcola il token di un altro utente e ne assume l’identità senza conoscerne le credenziali
Link di reimpostazione passwordIl link inviato a un altro indirizzo diventa ricostruibile, e con esso il controllo dell’account
Codici monouso di verificaIl secondo fattore di autenticazione perde efficacia, perché il codice si prevede invece di intercettarlo
Chiavi API e segreti generati dall’applicazioneLe credenziali di integrazione fra sistemi si deducono anziché rubarle
Identificativi di documenti e ordiniDiventa possibile enumerare i dati di altri clienti scorrendo gli identificativi
Randstorm appartiene quindi a una classe di problemi che riguarda anche le applicazioni web aziendali: una funzione non crittografica impiegata dove serviva casualità reale. È fra i controlli previsti da un web vulnerability assessment, che verifica come l’applicazione genera i valori da cui dipende la sicurezza delle sessioni e degli account.

Le piattaforme coinvolte

Le librerie JSBN e BitcoinJS sono state utilizzate attivamente fra il 2011 e il 2015 da numerosi servizi di generazione di wallet. Alcuni di quei servizi non esistono più, altri sono ancora operativi.

Piattaforme non più operative o reindirizzatePiattaforme ancora attive e potenzialmente interessate
Blockrail, BrainWallet, CoinPunk, Dark Wallet, DecentralBank, EI8HT, QuickCon, Robocoin, Skyhook ATM, GreenAddressBitAddress, Blockchain.com, BitPay, BitGo, CoinKite

Per le piattaforme della seconda colonna la circostanza da tenere presente è una: il fatto che siano ancora attive e abbiano corretto le proprie implementazioni non protegge i portafogli generati all’epoca. Vale la distinzione della sezione precedente, la chiave debole resta debole.

La vulnerabilità non riguarda soltanto Bitcoin. Diverse criptovalute alternative, fra cui Litecoin, Zcash e Dogecoin, hanno adottato implementazioni derivate da BitcoinJS, ereditandone il difetto di generazione.

L’impatto stimato

Secondo Unciphered la vulnerabilità interessa oltre un milione e mezzo di portafogli, e un attacco condotto su larga scala comporterebbe perdite stimate fra i 4,7 e i 7,9 miliardi di dollari ai valori di mercato del periodo di pubblicazione della ricerca.

I ricercatori hanno dimostrato la praticabilità dell’attacco recuperando l’accesso ad alcuni portafogli creati in passato, ma hanno scelto di non pubblicare alcuna dimostrazione tecnica del metodo. È una decisione coerente con la prassi della divulgazione responsabile: rendere noto il rischio a chi deve proteggersi, senza fornire lo strumento a chi vorrebbe sfruttarlo. Lo stesso criterio distingue le attività di ethical hacking dalla ricerca condotta senza mandato.

Una precisazione utile: nessuno ha modo di sapere quanti di quei portafogli siano stati effettivamente violati. La stima descrive l’esposizione teorica, non il danno accertato.

Cosa fare se avete un wallet di quel periodo

L’azione principale è una sola, e non ammette alternative: se avete generato un portafoglio fra il 2011 e il 2015 tramite un servizio web, createne uno nuovo con uno strumento attuale e trasferitevi i fondi. Non esiste un modo di rafforzare una chiave già generata.

Sulla generazione del nuovo portafoglio, gli strumenti più solidi sono i dispositivi hardware dedicati, che creano e conservano la chiave privata offline e la impiegano soltanto nel momento della transazione, senza esporla al browser né al sistema operativo. È la differenza rispetto ai portafogli generati in una pagina web, dove la qualità della casualità dipende dall’ambiente in cui la pagina viene eseguita.

Per la protezione della chiave privata valgono due criteri. La copia di sicurezza va conservata offline e in forma cifrata, perché una chiave privata copiata su un servizio cloud o in un file di testo è già un rischio superiore a quello da cui la copia dovrebbe proteggervi. E la passphrase che protegge il portafoglio va scelta puntando sulla lunghezza: una sequenza lunga di parole non correlate resiste meglio di una stringa breve con simboli e maiuscole, che è la vecchia regola di composizione oggi superata dalle linee guida di riferimento.

Restano due accortezze operative. Le transazioni in criptovaluta sono irreversibili, quindi l’indirizzo del destinatario va verificato prima della conferma e non dopo: è la ragione per cui il furto di criptovaluta passa spesso dalla sostituzione dell’indirizzo negli appunti di sistema, più che dalla violazione della chiave. E il settore è fra i più battuti dalle frodi, con schemi di investimento fraudolento, campagne di phishing su piattaforme di scambio e falsi annunci attribuiti a personaggi noti.

Randstorm mostra anche il limite di un processo di aggiornamento che guarda solo al proprio codice: la falla stava in una libreria di terze parti, e nessuna patch applicata internamente avrebbe potuto correggerla. Sapere quali componenti esterni sono in uso nelle proprie applicazioni, e in quali versioni, è la parte della gestione delle vulnerabilità che viene trascurata più spesso.


    Dichiaro di aver letto e compreso l'Informativa sul trattamento dei dati