Exploit no Coldcard: PRNG Determinístico Drenou $88M em BTC

Em 1º de agosto de 2026, aproximadamente 1.196 endereços de bitcoin foram esvaziados em uma varredura coordenada. Sem phishing. Sem PSBT malicioso assinado. Sem erro do usuário no sentido tradicional. A exploração da Coldcard que drenou aproximadamente US$ 88 milhões em BTC nunca tocou em nenhum dispositivo no momento do roubo, segundo a reportagem da CoinDesk sobre o incidente.
A causa raiz é pior do que qualquer análise que vi nas primeiras 24 horas. Tratou-se de uma falha no firmware da hardware wallet, lançada em 2021, que substituiu silenciosamente o gerador de números verdadeiramente aleatórios do hardware por uma rotina pseudo-aleatória de software. Toda seed gerada naquela versão era determinística. Todo endereço derivado dessas seeds era, em princípio, pré-computável por qualquer pessoa que fizesse engenharia reversa do bug.
Isso não é um hack. É um intervalo de cinco anos entre o commit e as consequências.
O que o bug de firmware da Coinkite realmente fez
A versão defeituosa, conforme detalhado pelo The Hacker News, roteava as chamadas de entropia por um PRNG de software inicializado a partir de um estado pequeno e previsível, em vez de usar o RNG de hardware do chip SE. Os usuários não tinham como detectar a substituição. O dispositivo inicializava, exibia as telas de configuração esperadas, produzia uma seed de 24 palavras e parecia idêntico a uma carteira gerada corretamente.
As seeds que produzia viviam dentro de um espaço pesquisável de talvez alguns bilhões de possibilidades. Isso não é uma carteira. É um bilhete de loteria.
Quando o atacante (ou, mais provavelmente, o pesquisador que encontrou isso e não fez a divulgação responsável) começou a percorrer o espaço contra o conjunto UTXO em 1º de agosto, o esvaziamento levou horas, não meses.
Por que o número de 1.196 endereços de bitcoin drenados importa
1.196 é pequeno em termos absolutos e enorme em termos de sinal. Ele delimita a população de usuários que geraram uma seed naquela janela exata de firmware e nunca rotacionaram. Essa é uma afirmação testável e falsificável sobre o raio de impacto, e a análise do TechSpot confirma que os dispositivos afetados remontam a um período de envio restrito.
Se você gerou sua seed em um firmware diferente, ou se rotacionou após uma atualização de firmware, quase certamente está bem. Se você gerou naquela versão e nunca moveu os fundos, você já estava comprometido, só ainda não sabia.
Um detalhe discreto: alguns dos UTXOs drenados ficaram intocados desde 2021. Cinco anos de "minhas chaves, minhas moedas", e as chaves nunca foram realmente suas.
O problema do PRNG determinístico no Bitcoin é antigo e continua se repetindo
Essa classe de bug tem uma longa e vergonhosa história. O SecureRandom do Android em 2013 fez pessoas perderem BTC da mesma forma. O bug no PRNG do OpenSSL do Debian em 2008 comprometeu chaves SSH por dois anos antes de alguém perceber. A cada geração, reaprendemos que a entropia é a única coisa que não se pode auditar olhando para a saída.
Um número aleatório de 256 bits bem formado e um número de 256 bits determinístico parecem idênticos na inspeção. Você precisa auditar a fonte, não a amostra. Esse é o ponto central.
Hardware wallets vendem a premissa de que o elemento seguro cuida disso por você. Quando o firmware contorna o SE, você obtém todo o atrito do cold storage sem nenhuma das garantias. O pior dos dois mundos.
Self-custody versus ETF não é o debate que as pessoas pensam
Aqui está minha opinião, e assumo a responsabilidade por ela: a conversa sobre self-custody versus ETF foi enquadrada como ideologia quando na verdade é uma questão de cadeia de suprimentos.
Um ETF spot de BTC tem uma superfície de ataque que me preocupa: a segurança operacional do custodiante. Essa superfície é auditável por reguladores, assegurável e conta com pessoas cujo trabalho em tempo integral é não perder moedas. Quando falha, alguém escreve um cheque.
Self-custody tem uma cadeia mais longa: fornecedor de chip, pipeline de build do firmware, assinatura do lançamento, rota de fornecimento, OPSEC do usuário final, higiene de backup. Qualquer elo quebra e não há cheque. O esvaziamento da Coldcard é o momento Terra para essa tese, não porque self-custody esteja morto, mas porque o enquadramento maximalista "simplesmente guarde suas próprias chaves" precisa amadurecer.
Ambos os modelos têm riscos reais. Fingir que um deles não tem risco foi o que fez com que 1.196 endereços fossem drenados.
O que realmente muda após a exploração da Coldcard
Algumas coisas que acredito que irão (e devem) mudar:
- Builds de firmware reproduzíveis se tornam requisito básico. Se você não consegue reconstruir o binário a partir do código-fonte e compará-lo byte a byte, está confiando em uma assinatura, não em um codebase.
- Atestação de entropia pós-geração. O dispositivo deve assinar uma prova de que determinada seed veio do SE, não do software. Isso não é difícil. A Coinkite poderia lançar isso em um trimestre.
- Verificações independentes de sanidade da seed. Ferramentas de terceiros que possam, sem ver sua seed, verificar que seu caminho de derivação resulta em uma distribuição consistente com verdadeira aleatoriedade.
- Produtos de seguro para self-custody. Não o tipo caricato. Subscrição real que exige firmware atestado e renova a cobertura conforme as versões envelhecem.
Nada disso torna as hardware wallets obsoletas. Torna-as de nível empresarial, o que é o que sempre afirmaram ser.
A leitura desconfortável para o resto de nós
Na LCX, dedicamos uma quantidade desproporcional de tempo de engenharia em coisas que parecem invisíveis para os usuários: cerimônias de chaves HSM, pipelines de build determinísticos, auditorias de entropia em qualquer caminho de código que toque uma chave privada. É um trabalho tedioso. É também a diferença entre uma manchete e uma terça-feira comum.
O incidente com a Coldcard tem o mesmo impacto que os comentários do CEO da OpenZeppelin sobre auditorias de DeFi tiveram no início deste ano. A pilha de auditoria que herdamos foi projetada para um mundo onde o código que você lançava era o código que você executava. Esse não é mais o mundo, se é que algum dia foi.
Cold storage deveria ser a resposta tediosa e correta. Acontece que o tedioso precisa de muito mais estrutura do que admitimos.