Em resumo

  • Um bug de firmware fez com que as carteiras Coldcard gerassem sementes a partir de um gerador pseudoaleatório de software, em vez do chip de hardware projetado para essa função.
  • O bug efetivamente reduziu o espaço de busca de 128 bits para aproximadamente 40 bits nos modelos mais antigos.
  • Veja o que isso significa e como levou ao roubo de mais de US$ 130 milhões em Bitcoin.

Alguém tem esvaziado carteiras Bitcoin que nunca deveriam ser acessíveis.

As moedas estavam em dispositivos Coldcard—carteiras de hardware do fabricante canadense Coinkite, do tipo que nunca toca a internet. Nenhum link de phishing. Nenhum malware. Nenhum laptop roubado. Os atacantes simplesmente descobriram quais eram as chaves privadas.

A Galaxy Research agora rastreou mais de 1.596 BTC roubados em três ondas confirmadas, com uma quarta onda suspeita que elevaria o total para aproximadamente 2.055 BTC—cerca de US$ 130 milhões aos preços atuais. Uma varredura moveu US$ 70 milhões em 41 minutos. A Coinkite diz que pelo menos 15 atacantes separados entraram na jogada.

A empresa publicou um documento técnico de antecedentes em 1º de agosto explicando o que deu errado. É um documento excepcionalmente franco, e a versão resumida é que a carteira esteve rolando dados viciados por oito anos sem que ninguém notasse.

Zero ainda é algo

Em 2021, a Coinkite migrou a criptografia do Coldcard para libsecp256k1, a mesma biblioteca que o Bitcoin Core usa. Decisão sólida. A integração foi onde tudo desmoronou.

A migração redirecionou silenciosamente a geração de sementes do gerador de números aleatórios de hardware do próprio Coldcard para o fallback de software do MicroPython—um pequeno algoritmo chamado Yasmarang que existe para dispositivos sem chip de aleatoriedade.

O Coldcard tem um chip de aleatoriedade. Ele simplesmente parou de ser consultado.

O motivo é quase pequeno demais para acreditar. Um guard de build usou #ifndef, que verifica se uma configuração existe em vez de verificar se está ativada. A Coinkite havia definido essa configuração como zero, significando "desligado". Como zero ainda conta como definido, a verificação de segurança passou e o build foi concluído. Ambas as versões da função tinham assinaturas idênticas, então nada parecia errado.

"A maior parte da aleatoriedade no COLDCARD vinha de um PRNG que eu não sabia que estava realmente na base do código-fonte", escreveu a Coinkite, referindo-se a um gerador de números pseudoaleatórios — software que produz números que parecem aleatórios, mas seguem uma receita fixa a partir de um valor inicial.

Alimente a receita com o mesmo valor inicial e você obterá a mesma saída. Todas as vezes.

Nos dispositivos Mk2 e Mk3 rodando firmware 4.0.1 a 4.1.9, esse valor inicial vinha do número de série do chip e do seu relógio. A Coinkite estima o espaço de busca resultante em cerca de 40 bits. Modelos mais novos misturaram um pouco de entropia do elemento seguro, elevando-os para aproximadamente 72 bits.

Nenhum deles é 128, o alvo.

A lacuna importa mais do que parece. Bits são expoentes. Um espaço de busca de 128 bits contém mais combinações do que átomos no universo observável, e ninguém está procurando nele. Quarenta bits é cerca de um trilhão — um número que um laptop decente pode processar. Cada bit perdido reduz o trabalho pela metade.

A equipe de engenharia da Block, que publicou sua própria análise, colocou o espaço de busca efetivo do elemento seguro dos dispositivos mais novos em 2^32 candidatos, com média de cerca de 2^31 tentativas. Sua avaliação para as placas mais antigas é mais direta: para um ID de dispositivo conhecido, estado do timer e histórico de chamadas, a geração da carteira é determinística.

E determinístico é o oposto de aleatório, o que é essencial para a criptografia.

Não "fraco". Previsível.

A Coinkite suspeita que foi encontrado por máquina. "Temos que assumir que alguém usou IA para revisar versões anteriores do nosso firmware e tropeçou nesse problema", escreveu a empresa, acrescentando que recentemente executou um dos melhores modelos de IA disponíveis sobre o mesmo código e não encontrou nada. "Tanto atacantes quanto defensores têm as mesmas ferramentas de IA, mas hoje ela não nos ajudou, e só ajudou os bandidos."

Firmware corrigido está disponível para todos os modelos afetados. Ele não repara sementes existentes; essas carteiras precisam ser regeneradas e os fundos movidos. A Decrypt cobriu como o armazenamento air-gapped muda após um exploit como este e rastreou as perdas subindo além de $114 milhões.

O que é entropia, na prática

Entropia é a medida de quanto um atacante não sabe.

Em outras palavras, é basicamente incerteza, contada em bits. Um bit é um lançamento de moeda: dois resultados, e um adivinhador acerta metade das vezes. Dez bits são 1.024 resultados. Cada bit dobra o trabalho do adivinhador.

Uma carteira Bitcoin é um número muito grande mantido em segredo. O endereço para onde as pessoas enviam moedas é derivado dele matematicamente, e a derivação funciona em apenas uma direção — você pode ir da chave para o endereço, mas nunca voltar.

Então a segurança de cada carteira depende de uma pergunta: quantos números um atacante teria que tentar?

Se o número foi escolhido com 128 bits de entropia, a resposta é "mais do que a física permite." Se foi escolhido com 40, a resposta é "me dê algum tempo."

Esta é a mesma propriedade que torna a ameaça da computação quântica digna de debate — uma máquina quântica atacaria a matemática que liga a chave ao endereço. O bug da Coldcard nunca precisou disso. Ele tornou as chaves adivinháveis antes que essa matemática entrasse em ação.

É aqui que o vocabulário fica escorregadio. Um gerador pseudoaleatório produz saída que passa em testes estatísticos de aleatoriedade, então basicamente nada que uma planilha sinalizaria. Essa saída ainda é totalmente determinada pelo seu valor de semente. Parece aleatória, mas não é.

Aleatoriedade estatística e imprevisibilidade criptográfica são propriedades diferentes, e a saída da Coldcard teria passado pelo primeiro teste enquanto falhava completamente no segundo.

Aleatoriedade verdadeira tem que vir de ruído físico: jitter elétrico em um circuito, flutuação térmica, decaimento radioativo. Era para isso que servia o chip de hardware na Coldcard. Esse é o chip que o flag de build desconectou.

Então Luke Dashjr mencionou os dados

Enquanto os usuários corriam para regenerar sementes, muitos recorreram à solução óbvia de baixa tecnologia. As Coldcards permitem que você role dados físicos e insira os resultados como entropia. A própria orientação da Coinkite trata sementes feitas com pelo menos 50 lançamentos de dados independentes e privados como não estando em risco com o bug.

Pode parecer estúpido, mas a empresa realmente vende um saco com "100 dados pequenos e fofos" para facilitar todo o processo para você.

Em 31 de julho, o desenvolvedor do Bitcoin Core, Luke Dashjr, publicou um aviso: "Muitas pessoas sugerindo/usando dados para mitigar a vulnerabilidade do Coldcard. Observe que dados comuns não são projetados para serem criptograficamente seguros. Se você vai fazer isso, provavelmente deveria comprar dados de cassino de precisão. E mesmo assim, tenha outra fonte de entropia."

O Bitcoin Twitter não levou isso com calma.

"lol agora você nem pode rolar dados", escreveu um usuário. "A autocustódia acabou..." Outro perguntou se ele deveria contratar alguém com Parkinson para jogá-los. (Não é legal.)

Provavelmente a resposta mais útil veio com aritmética. O desenvolvedor Justin Sharp calculou exatamente quanto um dado ruim custa para você:

"Exagero. Um d6 perfeito dá 2,585 bits por rolagem. Um dado visivelmente tendencioso, por exemplo, com uma face caindo 20% das vezes em vez de 16,7%, ainda dá cerca de 2,55 bits. Em 99 rolagens, isso é a diferença entre ~256 bits e ~252 bits de entropia."

Quatro bits de 256. Esse é todo o prejuízo por um dado visivelmente injusto.

Dashjr não está errado que dados baratos têm viés mensurável—os pontos moldados por injeção removem quantidades ligeiramente diferentes de plástico de cada face, que é precisamente por isso que os cassinos usam dados de precisão com pontos preenchidos. Ele está certo sobre a física e errado sobre o que está em jogo. Perder quatro bits de 256 deixa você com 252. O bug do Coldcard deixou os usuários com 40.

Há um argumento mais afiado enterrado em seu conselho, no entanto, e não é sobre tolerância de fabricação. É sobre não confiar em nenhuma fonte única. A falha do Coldcard não foi que sua entropia fosse ligeiramente tendenciosa—foi que um componente silenciosamente parou de contribuir e nada detectou.

O que fazer sobre isso

Se você gerou uma semente em um Coldcard afetado sem rolagens de dados (sério) ou uma frase-senha BIP-39 forte, essa semente está comprometida.

Atualize o firmware, gere uma nova semente, verifique a impressão digital, envie uma transação de teste e então mova tudo. O aviso da Coinkite explica isso modelo por modelo. Sementes exportadas carregam a falha com elas—mover uma semente ruim para um aplicativo de carteira diferente não resolve nada.

Para todos os outros, a lição não é que carteiras de hardware são quebradas ou que dados são uma armadilha.

É que "aleatório" é uma afirmação, e afirmações precisam de verificação. O código-fonte da Coldcard esteve público o tempo todo. O RNG de hardware pretendido estava bem ali no binário. Os revisores confirmaram que ele existia e nunca confirmaram que o gerador de sementes realmente o chamava.

Oito anos de auditorias olharam para o código certo. Ninguém verificou se ele era executado.