Un bug ha rischiato di mettere in ginocchio il bitcoin

bug bitcoin

Per oltre un anno, le diverse versioni di Bitcoin Core - la principale implementazione del software Bitcoin - contenevano un grave bug del software. Il bug è stato corretto con la versione Bitcoin Core 0.16.3 (e 0.17.0rc4), rilasciata la scorsa settimana, e lo stato della rete Bitcoin ora sembra essere sicuro, senza danni. Il progetto Bitcoin Core ha pubblicato un rapporto completo, rivelando che il bug era persino peggiore di quanto si pensasse in precedenza.

Qui di seguito parleremo degli aspetti più fastidiosi del bug che ha minacciato di mettere in ginocchio il Bitcoin. 

Il bug faceva parte di un miglioramento che era stato introdotto nella versione Bitcoin Core 0.14.0, rilasciato ufficialmente nel marzo 2017. Il bug avrebbe impedito ai nodi di  rifiutare un blocco contenente una transazione contenente una doppia spesa che spende la stessa valuta digitale più volte. 

Il problema del double-spending (doppia spesa) è un tipo di frode digitale nella quale un utente cerca di spendere la stessa cifra due volte, ad esempio inviando contemporaneamente lo stesso pagamento a due destinatari differenti. Questo tipo di problema è più difficile da risolvere all'interno di un sistema decentralizzato, per la mancanza di un ente, ad esempio una banca, che garantisce le transazioni effettuate.

La soluzione più immediata ed efficace risulta essere quella di considerare come valida la transazione che per prima viene verificata. Il bug in questione, avrebbe permesso una forma irregolare di doppia spesa: probabilmente il motivo per il quale Bitcoin è stato progettato. 

Le versioni di Bitcoin Core da 0.14.0 a 0.14.2 (e, in alcuni casi, le versioni più recenti), avrebbero accettato il blocco ma, allo stesso tempo, avrebbero riconosciuto che qualcosa non andava. Tuttavia, non sarebbero state in grado di identificare esattamente cosa non andava. Di conseguenza, il nodo avrebbe smesso di funzionare del tutto e si sarebbe spento. Se un blocco non valido causato da questo bug si fosse fatto strada tra i nodi, avrebbe causato il loro arresto.

Le versioni di Bitcoin Core da 0.15.0 a 0.16.2 includevano un altro miglioramento delle prestazioni, rendendo in questo modo i nodi incapaci di riconoscere che qualcosa non andava. In particolare, se la valuta digitale fosse stata spesa due volte e la transazione non fosse già stata spostata nello stesso blocco (solitamente questo è il caso), questi nodi avrebbero accettato la transazione e il blocco normalmente. Nella peggiore delle ipotesi, un miner malintenzionato avrebbe potuto gonfiare la riserva monetaria di Bitcoin copiando l'ammontare di criptovaluta a sua disposizione e facendo accettare a chiunque avesse usato le versioni di Bitcoin Core da 0.15.0 a 0.16.2 quelle criptovalute  come valide.

Questo tipo di bug avrebbe potuto causare un fork blockchain tra i nodi interessati (Bitcoin Core da 0.15.0 a 0.16.2) e nodi non affetti (in particolare Bitcoin Core 0.13.2 e versioni precedenti, oltre ad alcune implementazioni alternative di Bitcoin). Per fork si intende la nascita di una nuova catena (chain) che si verificherà a partire da un dato momento in poi. La creazione di un fork in queste condizioni è altamente improbabile. Quello che sarebbe potuto succedere però è che i nodi avrebbero dovuto bloccarsi, in attesa di un blocco valido.

L'aspetto più preoccupante di questo bug che avrebbe potuto scatenare uno dei peggiori attacchi di sempre al Bitcoin è che è rimasto inosservato per circa 18 mesi dal suo rilascio. Nonostante questo, un miner malintenzionato deciso a lanciare questo tipo di attacco all'integrità della blockchain sarebbe stato notato abbastanza rapidamente - visto che tutto accade su una blockchain pubblica, i rapporti sugli arresti anomali avrebbero riempito in poco tempo le chat room, i forum e molti canali telegram. A quel punto, la base utenti di Bitcoin si sarebbe accorta dell'inflazione aggiuntiva e avrebbe scovato il bug, impedendogli di essere accettato come una nuova regola del protocollo blockchain.

Il Bitcoin aveva già avuto dei problemi con diversi bug nel 2010 e nel 2013, in questo caso la maggior parte dei minatori (con hash power) avrebbe aggiornato o declassato il proprio software rapidamente, respingendo il "blocco di attacco" e minando sulla blockchain pubblica senza proseguire la "catena d'attacco" o fork. Non appena la blockchain avesse superato la "catena d'attacco", anche i nodi vulnerabili sarebbero passati alla blockchain e avrebbero ignorato la "catena d'attacco", lasciando il minatore malintenzionato senza alcuna ricompensa.

Il bug è stato scoperto da uno sviluppatore Bitcoin "awemany" che ha informato diversi sviluppatori che lavorano su Bitcoin Core (e altri che lavorano su implementazioni come Bitcoin Cash, Bitcoin ABC e Bitcoin Unlimited). Inizialmente è stato originariamente presentato come un attacco DoS (Denial of Service). Questo tipo di attacco inonda la vittima di un traffico anomalo in entrata che proviene da molte fonti diverse. Ciò rende effettivamente impossibile fermare l'attacco semplicemente bloccando una singola fonte. Ad un ulteriore esame, il collaboratore di Bitcoin Core e l'impiegato di Chaincode Labs, Matt Corallo, ha scoperto che lo stesso bug era anche una vulnerabilità che avrebbe causato doppia spesa.

Il bug è stato rapidamente corretto e rilasciato martedì in una nuova versione di Bitcoin Core: Bitcoin Core 0.16.3. Il gruppo di contributori di Bitcoin Core che erano a conoscenza del bug ha iniziato a contattare i principali attori dell'ecosistema Bitcoin, in particolare i miners e le grandi aziende, chiedendo loro di passare a Bitcoin Core 0.16.3. Anche gli utenti regolari sono stati invitati a eseguire l'aggiornamento.

La gravità di un bug come questo può essere difficile da gestire su una rete aperta, decentralizzata e continuamente operativa, supportata da software open source. L'atto di correggere una vulnerabilità nel codice potrebbe rivelarla a potenziali avversari, aprendo una finestra di attacco fino a quando la correzione non viene ampiamente distribuita attraverso i nodi.

Per evitare possibili attacchi, gli sviluppatori di Bitcoin Core consapevoli del problema hanno deciso di non rendere subito pubblica la gravità del bug. Inizialmente omettendo alcune informazioni ai miners, alle aziende e a un pubblico più vasto, hanno scelto di rivelare la vulnerabilità del DoS, ma non la vulnerabilità alla doppia spesa. In questo modo speravano che la vulnerabilità DoS sarebbe stato un motivo più che sufficiente per effettuare l'aggiornamento, senza lasciare una potenziale finestra di attacco a uno o più miners malintenzionati. 

Nonostante questo approccio, quando il bug è arrivato sotto i riflettori, più utenti hanno iniziato a capire da soli che il bug era più grave di una attacco DoS. Alcuni di questi sviluppatori hanno iniziato a far trapelare tutta la vulnerabilità, mettendo la rete Bitcoin a maggior rischio di attacco. Quando la vulnerabilità è stata segnalata su Hacker News (anche se successivamente è stata ritirata), c'erano pochi motivi per tenerla ancora nascosta. 

A quel punto, gli sviluppatori di Bitcoin Core sapevano che la maggior parte dei miners aveva eseguito un aggiornamento e che la rete Bitcoin era sicura. La domanda è lecita: quando arriverà il prossimo attacco al Bitcoin?

Questo post è la parziale traduzione del post The Good, the Bad and the Ugly Details of One of Bitcoin’s Nastiest Bugs Yet.