Relatório de incidente completo · 16 fontes · Anzen Lab

Quatro linhas de código.
Mais de 1.596 BTC desaparecidos.

Em março de 2021, uma versão de firmware da COLDCARD parou de pedir números aleatórios ao seu chip de hardware e passou a delegar essa tarefa a software comum. Ninguém deu por isso durante cinco anos. Em julho de 2026, os atacantes fizeram os cálculos e começaram a esvaziar as carteiras.

O custo da configuração
5 anos
a falha esteve presente num código totalmente público, sem ser detetada1
1.596+ BTC
confirmados como roubados de cerca de 7.300 endereços, e o número continua a subir7
41 min
o maior roubo individual: 1.083 BTC, cerca de 70 milhões de dólares na altura9
1 em um bilião
as probabilidades que um atacante tinha de vencer num Mk3. O design exigia uma hipótese em número com 78 dígitos1
O que correu mal

Uma verificação de segurança que existia e não fez nada

01

Toda a proteção depende de um número que ninguém consegue adivinhar

Uma carteira de hardware cumpre várias funções. Mostra o que está realmente a assinar em vez de lhe pedir para confiar no ecrã de um computador infetado, e mantém a sua chave guardada num chip construído para resistir a tentativas de abertura. Cada uma dessas defesas assume que o número que deu origem à sua chave não podia ser adivinhado. Se pudesse, um atacante nunca precisaria de ultrapassar nenhuma delas. A reserva de onde é retirada uma frase de 24 palavras contém aproximadamente um número por cada mil átomos no universo observável. Uma reserva desse tamanho não pode ser pesquisada. Esse é todo o modelo de segurança.

Detalhe técnico

12 palavras transportam 128 bits de entropia, 24 transportam 256, além de uma soma de verificação (checksum) a partir do SHA-256 dessa entropia. O BIP-39 estende o resultado para a chave mestre BIP-32.

Detalhe técnico

12 palavras transportam 128 bits de entropia, 24 transportam 256, além de uma soma de verificação (checksum) a partir do SHA-256 dessa entropia. O BIP-39 estende o resultado para a chave mestre BIP-32.

02

A COLDCARD parou de retirar dessa reserva

Uma alteração de firmware em 2021 fez com que a carteira deixasse silenciosamente de pedir esse número ao seu chip de aleatoriedade dedicado e passasse a calcular um através de software comum. Lado a lado, este é o incidente completo:

Isto não é segurança reduzida a dois terços. Cada bit duplica o trabalho, pelo que menos 88 bits reduzem a tarefa por um fator de 2⁸⁸. Um bilião é um número grande para uma pessoa e pequeno para alguém que aluga máquinas de alto desempenho para o processar.

Detalhe técnico

A geração de sementes passou de ckcc.rng_bytes() para ngu.random.bytes(). A Coinkite estima cerca de 40 bits de espaço de pesquisa remanescente no Mk3 e cerca de 72 no Mk4/Mk5/Q, face a um alvo de 128 bits. A análise independente da Block atinge a mesma ordem (inferior a 2⁴⁰·⁷ e inferior a 2⁷۳·³) e encontra condições mais restritas onde resta muito menos.2

Detalhe técnico

A geração de sementes passou de ckcc.rng_bytes() para ngu.random.bytes(). A Coinkite estima cerca de 40 bits de espaço de pesquisa remanescente no Mk3 e cerca de 72 no Mk4/Mk5/Q, face a um alvo de 128 bits. A análise independente da Block atinge a mesma ordem (inferior a 2⁴⁰·⁷ e inferior a 2⁷۳·³) e encontra condições mais restritas onde resta muito menos.2

De onde 24 palavras devem ser retiradas
115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,936
De onde a COLDCARD retirou efetivamente
1,099,511,627,776
03

Porque o software não pode ser aleatório

Pense no que torna o lançamento de uma moeda imprevisível. A força do lançamento, a gravidade, uma corrente de ar de um aparelho de ar condicionado, ténues tremores no solo. Dezenas de influências que consegue nomear e dezenas que não consegue. Ninguém consegue calcular a trajetória, por isso ninguém consegue adivinhar o resultado. O software funciona de forma diferente. Executa uma fórmula fixa sobre um punhado de valores iniciais e produz uma resposta fixa. Aqui, esses valores eram o número de série do chip e o tempo que o dispositivo tinha estado ligado. Um atacante que conheça a receita e os ingredientes recalcula o resultado em vez de o adivinhar.

Detalhe técnico

Com o RNG de hardware desativado, rng_get() ligou-se ao PRNG Yasmarang do MicroPython, inicializado a partir de estado não secreto (UID, SysTick, RTC) e não recolheu nova entropia após isso, pelo que os candidatos são enumerados offline. A Coinkite não considera as sementes misturadas com 50 ou mais lançamentos justos e privados em risco apenas devido a este problema: 50 × log₂6 ≈ 129 bits.3

Detalhe técnico

Com o RNG de hardware desativado, rng_get() ligou-se ao PRNG Yasmarang do MicroPython, inicializado a partir de estado não secreto (UID, SysTick, RTC) e não recolheu nova entropia após isso, pelo que os candidatos são enumerados offline. A Coinkite não considera as sementes misturadas com 50 ou mais lançamentos justos e privados em risco apenas devido a este problema: 50 × log₂6 ≈ 129 bits.3

04

E a verificação destinada a impedi-lo fez a pergunta errada

Havia uma guarda no código de compilação, escrita especificamente para impedir o envio de firmware sem o gerador de hardware. Perguntava se uma definição existia, e não se a definição estava ativada. A definição existia e estava desativada. A guarda manteve-se em silêncio, a compilação não relatou erros e o firmware foi enviado.

Detalhe técnico

#ifndef apenas testa a definição. A configuração da placa definiu MICROPY_HW_ENABLE_RNG como 0, definido e desativado, pelo que o #error nunca foi acionado e o linker resolveu rng_get() para a alternativa em software.3

Detalhe técnico

#ifndef apenas testa a definição. A configuração da placa definiu MICROPY_HW_ENABLE_RNG como 0, definido e desativado, pelo que o #error nunca foi acionado e o linker resolveu rng_get() para a alternativa em software.3

O defeito, citado a partir do código-fonte.3

05

Nada nisto pareceu errado durante cinco anos

Uma frase de recuperação fraca parece exatamente igual a uma forte. Vinte e quatro palavras comuns, a soma de verificação correta, um dispositivo que se comporta normalmente. Nada o avisa no ecrã e nenhum erro é gerado na compilação. A fonte esteve pública todo o tempo. Lê-la ainda exigia que alguém abrisse aquele ficheiro em específico.

Detalhe técnico

O comprimento da saída, a ausência de zeros e a não repetição passam todos num PRNG fraco, pelo que os testes de fumo habituais também não o poderiam ter detetado.

Detalhe técnico

O comprimento da saída, a ausência de zeros e a não repetição passam todos num PRNG fraco, pelo que os testes de fumo habituais também não o poderiam ter detetado.

06

Depois, alguém fez as contas

Nunca tocaram num único dispositivo. Geraram as frases prováveis nas suas próprias máquinas, calcularam que endereços de Bitcoin cada uma produziria e verificaram esses endereços face à cadeia de blocos pública. Todos os endereços com saldo foram esvaziados. Uma carteira que estivesse desligada numa gaveta desde 2022 estava tão exposta quanto uma em utilização diária.

Detalhe técnico

Os candidatos derivam offline através de BIP-39/BIP-32; apenas a consulta final do saldo toca na rede, pelo que não existe qualquer sinal prévio do lado da vítima.3

Detalhe técnico

Os candidatos derivam offline através de BIP-39/BIP-32; apenas a consulta final do saldo toca na rede, pelo que não existe qualquer sinal prévio do lado da vítima.3

Esta página não é uma celebração de vitória.

A Coinkite divulgou a falha, publicou um relatório técnico e lançou uma correção. Investigadores externos conseguiram reconstruir o que aconteceu porque a COLDCARD é de código aberto.

Uma advertência sobre as estimativas: descrevem o esforço de adivinhação que um atacante enfrenta com os pressupostos atuais, e não um cronómetro. Ninguém consegue dizer quanto tempo demoraria a quebrar uma carteira específica.2

Se possui uma COLDCARD

Leia isto antes de mais nada

O que precisa de fazer depende do dispositivo que estava a utilizar quando a frase de recuperação foi criada pela primeira vez, e não do que possui hoje.

Assuma que isto ainda está a acontecer. As frases tornaram-se adivinháveis em 2021 e o método é agora público, pelo que qualquer pessoa pode executar a mesma pesquisa. Não há nenhum patch que resolva isto a partir de fora, nem qualquer razão para um atacante parar. Se for afetado, a premissa segura é que o tempo é a única coisa entre si e eles.

Mk2 e Mk3: mova as suas moedas agora

O intervalo afetado compreende o firmware 4.0.1 a 4.1.9. A versão 4.2.0 corrige a forma como as novas frases são criadas, mas nenhuma atualização consegue voltar atrás e adicionar aleatoriedade a uma frase que já exista. Crie uma nova carteira num dispositivo em que confie e transfira os seus fundos.1

Mk4 e Mk5: verifique a versão do firmware

Se a frase foi criada num firmware anterior a 5.6.0 (ou 6.6.0X em versões Edge), atualize, crie uma carteira nova no firmware atualizado e, em seguida, mova os seus fundos. A atualização por si só não reparará a frase antiga.1

Q: o mesmo, o limite é 1.5.0Q

Atualize para 1.5.0Q ou posterior, ou 6.6.0QX em compilações Edge, crie uma nova carteira, anote e teste a cópia de segurança, envie uma pequena transação de teste e, depois, transfira o resto.1

Atualizar o firmware da COLDCARD corrige uma frase de recuperação que já possuo?

Como posso descobrir qual firmware gerou a minha frase de recuperação da COLDCARD?

Como posso verificar se o meu endereço foi afetado por isto?

Os lançamentos de dados ou uma frase-passe protegem uma frase de recuperação do COLDCARD?

O aviso da Coinkite abrange todas as COLDCARD afetadas?

Aviso técnico oficial da CoinkiteMude-se para uma carteira nova num dispositivo em que já confie e envie uma pequena transação de teste antes de migrar tudo. Guarde as provas públicas (IDs de transação, endereços, carimbos de data/hora) e nunca um segredo. Qualquer pessoa que se ofereça para recuperar os seus fundos é um segundo roubo em curso, e esse serviço não existe. Que hardware comprar a seguir pode esperar até que as suas moedas estejam seguras.
E se possuir uma OneKey

Nenhum dispositivo OneKey é afetado

Nenhum modelo que alguma vez enviámos. O nosso firmware não contém nenhuma dependência de libngu, Coinkite, COLDCARD ou CKCC, pelo que o caminho de código que falhou não está lá para ser acedido, e pode verificar isso por si próprio nos nossos repositórios. No nosso hardware atual, a chave vem do gerador verdadeiramente aleatório dentro de um elemento seguro certificado, nunca de software no processador principal. Essa substituição foi o que esta falha representou.

Não afetados
OneKey Pro
OneKey Classic 1S
OneKey Classic 1S Pure
OneKey Touch
OneKey Classic
OneKey Mini

Também não aceitámos isso com base na confiança. Quando a notícia rebentou, o Anzen Lab rastreou a nossa aleatoriedade de ponta a ponta (de onde vem, o que a chama e as definições de compilação que decidem qual versão chega ao seu dispositivo) e publicou os ficheiros exatos que verificaram.12

Ler a nova verificação do Anzen Lab
A pergunta que está realmente a fazer

Isto poderia ter acontecido a uma OneKey?

Esta falha exigia que três coisas diferentes fossem verdadeiras ao mesmo tempo. Numa OneKey nenhuma delas é verdadeira, e pode verificar todas as três por si próprio.

De onde vem a nossa

Então, de onde vem a aleatoriedade da OneKey?

Gerada dentro de um chip certificado EAL 6+

As suas chaves são criadas e mantidas dentro de um chip dedicado e inviolável, em vez do processador de uso geral que executa tudo o resto. EAL 6+ é o nível de garantia utilizado para cartões de pagamento e de identidade.

Aleatoriedade que vigia a si própria

Esse chip gera aleatoriedade a partir de ruído físico real e testa continuamente a sua própria saída. Se a aleatoriedade começar a funcionar mal, o chip deteta-o em vez de continuar silenciosamente.

Fomos rever o nosso

Após as notícias sobre a COLDCARD, o Anzen Lab rastreou a nossa própria aleatoriedade de ponta a ponta (de onde vem, o que a chama realmente e as definições de compilação que decidem qual versão acaba no seu dispositivo) e publicou os ficheiros exatos que examinaram.11

OneKey Pro's EAL 6+ certified secure element
EAL 6+ Badge
Cada transação, protegida por chips certificados EAL 6+
Onde a aleatoriedade é gerada
Elemento seguro
THD89
Nível de garantia
Certificado EAL 6+
Fonte de entropia
TRNG de hardware, com autoteste
Saída certificada contra
BSI AIS 20 / 31
Reauditado após este incidente
Anzen Lab, código-fonte publicado
Como o OneKey é construído e quem o verifica

Quatro controlos em cada OneKey, e nenhum deles confia nos outros três

Qualquer uma delas pode falhar em algo. O ponto é que todas as quatro teriam de falhar exatamente na mesma coisa. O COLDCARD não tinha essa salvaguarda: uma única definição de compilação não verificada foi suficiente.

01

Código aberto que consegue verificar de facto

O nosso firmware e as nossas aplicações são públicos no GitHub, e as nossas compilações são reproduzíveis, o que significa que pode recompilar o código por si próprio e confirmar que produz exatamente o software em execução no seu dispositivo. Esse é o passo que deteta um problema de "código certo, versão errada".

OneKey no GitHub
02
SlowMist

Especialistas externos auditam-nos, oficialmente

A empresa de segurança SlowMist audita-nos e publica os relatórios. Avaliações separadas cobrem o OneKey Pro, o Classic 1S e o nosso SDK. As nossas práticas de segurança são certificadas pela norma ISO/IEC 27001, e a linha Pro e Classic 1S é certificada contra a norma EN 18031 por um organismo nomeado pela UE. Tudo publicado, nada autoavaliado.13

Ler o resumo da auditoria da SlowMist
03

Uma equipa paga para quebrar os nossos próprios produtos

O Anzen Lab é a nossa equipa de segurança interna de engenheiros de segurança de hardware, firmware e aplicações, a trabalhar com um conjunto rotativo de investigadores externos. O seu trabalho consiste em quebrar carteiras de hardware, incluindo as nossas, antes de qualquer envio. Quando esta história rebentou, reexaminaram a aleatoriedade da OneKey de ponta a ponta e publicaram exatamente quais os ficheiros que verificaram.11

Ler a análise do Anzen Lab
04

Pagamos a estranhos para encontrarem os nossos erros

Qualquer pessoa nos pode reportar uma falha de forma privada, através do nosso programa público no BugRap ou diretamente para [email protected], e ser recompensada por isso. A gravidade determina o pagamento, pontuada com base no CVSS. O objetivo principal é tornar a revelação mais atrativa do que a venda.15

OneKey no BugRap
entro.tools · Criado pelo nosso fundador

Teste a carteira na sua mão

O entro.tools é uma ferramenta gratuita e de código aberto que lê os números aleatórios reais provenientes de uma carteira de hardware e executa os testes de saúde estatística padrão neles, no seu browser, através de USB, sem que nada seja carregado para lado nenhum e sem necessidade de atualização de firmware.

Funciona na Trezor e na KeepKey, bem como nos nossos próprios dispositivos, para que os possa comparar lado a lado em vez de confiar na afirmação de um único fornecedor.
Como é executada
No seu browser, através de WebUSB
Testes aplicados
FIPS 140-2, NIST SP 800-22 / 90B
Os seus dados
Nunca saem da página
Atualização de firmware
Não necessária
Verificação de Entropia

Executa testes de saúde FIPS 140-2, NIST SP 800-22 e SP 800-90B localmente através de WebUSB (Chrome ou Edge em desktop). O dispositivo pede para exportar entropia, um lote de números aleatórios que acabou de gerar, nunca a sua frase de recuperação.16

O teste universal de Maurer precisa de pelo menos 387.840 bits; abaixo disso o relatório marca-o como ignorado em vez de o omitir em silêncio.16

Quais as carteiras que podem ser verificadas

Se um observador externo consegue ler os números aleatórios brutos de um dispositivo. Esta é apenas uma dimensão restrita. Veja a nota abaixo.

OneKey
Verificável por si
Todos os modelos, firmware de origem16
Trezor
Verificável por si
Todos os modelos, protocolo de comunicação partilhado16
KeepKey
Verificável por si
Família de protocolos de comunicação da Trezor16
Ledger
Confiar no fornecedor
Elemento seguro fechado; nenhum comando de host expõe números aleatórios em bruto16
BitBox02
Confiar no fornecedor
O pedido de números aleatórios do protocolo foi removido pelo fornecedor16
Blockstream Jade
Confiar no fornecedor
O host só pode adicionar entropia; não existe forma de ler a origem de volta16
COLDCARD
Confiar no fornecedor
Tem USB, mas o seu protocolo não contém nenhum comando de entropia16
Keystone
Confiar no fornecedor
Isolado de rede (air-gapped) por design; a USB transporta apenas informações do dispositivo e atualizações de firmware16
"Não pode ser testado" e "inseguro" são afirmações diferentes. Os elementos seguros fechados seguem o seu próprio caminho de certificação. Um resultado positivo prova apenas que nenhum defeito estatístico aparece hoje. Não pode provar a imprevisibilidade criptográfica e não diz nada sobre a aleatoriedade utilizada no dia em que a sua carteira foi criada.
Ainda com dúvidas

Questões que isto levanta para todos os outros

A OneKey é afetada pela falha de entropia da COLDCARD?

Quais carteiras de hardware são afetadas pela falha de entropia da COLDCARD?

Posso testar a aleatoriedade da minha própria carteira?

Como posso avaliar se uma carteira de hardware é de confiança?

Segurança que pode verificar, não segurança em que lhe pedem para acreditar.

Código aberto e reproduzível, auditado por terceiros, atacado pelo nosso próprio laboratório e pago quando alguém descobre uma falha. Estes são os dispositivos sobre os quais esta discussão se debruça.

Referências

Fontes abaixo, obtidas a 6 de agosto de 2026. O próprio aviso e relatório técnico da Coinkite aparecem primeiro, seguidos por análises independentes ao nível do código-fonte e contabilidade na cadeia de blocos. Os valores de perda continuam a ser revistos em alta: a Galaxy Research confirmou 1.596 BTC a 4 de agosto e estimou as perdas suspeitas em cerca de 2.055 BTC.