A varredura demorou 41 minutos
A 30 de julho alguém percorreu 1.196 endereços de bitcoin e esvaziou-os, levando 1.082,65 bitcoins, no valor de cerca de 70,2 milhões de dólares, numa janela de 41 minutos. Ninguém forçou uma fechadura. Nenhum aparelho foi tocado, nenhum utilizador foi enganado, nenhum servidor foi violado. O atacante não precisou de nada disso, porque as chaves privadas que protegiam aqueles endereços podiam ser deduzidas de raiz. Os primeiros relatos situavam a perda perto dos 38 milhões de dólares; concluída a contagem, o número ficou quase no dobro.
Os aparelhos envolvidos eram carteiras físicas Coldcard fabricadas pela Coinkite, ou seja, precisamente a categoria de produto que se compra para manter as chaves longe das redes. É isso que torna o incidente digno de uma hora de atenção de qualquer proprietário, pense ele o que pensar do bitcoin. A falha não ocorreu no perímetro para o qual toda a gente faz orçamento. Ocorreu no momento em que o segredo foi criado, anos antes de alguém tentar roubá-lo.
Uma macro posta a zero ligou o recurso alternativo
O relato técnico da própria Coinkite é invulgarmente franco quanto ao mecanismo. Em março de 2021, durante uma migração para a libsecp256k1 do Bitcoin Core, a geração de sementes foi desviada da rotina que invocava o gerador de números aleatórios por hardware do aparelho para uma função de uso geral. Esse novo caminho resolvia-se no recurso por software do MicroPython em vez da implementação por hardware da Coldcard. O código alternativo existia desde maio de 2018 e nunca tinha tocado na geração de sementes até àquela migração.
A razão pela qual chegou a ser compilado merece entrar na sua própria lista de verificação. A guarda em torno do recurso alternativo verificava se uma macro de configuração estava definida, não se estava posta a um. Os programadores tinham-na posto a zero, no sentido de que ali o gerador por hardware não era preciso, e uma macro posta a zero continua a ser uma macro definida. A guarda leu a presença do valor em vez do valor em si, e ligou o recurso alternativo. Ninguém escreveu criptografia fraca. O gerador por hardware existia e funcionava. Apenas deixou de ser aquilo de onde a semente era retirada.
Passaram cinco anos e todos os testes continuaram verdes
Em aparelhos Mk2 e Mk3 com firmware 4.0.1 a 4.1.9, as sementes resultantes levavam cerca de 40 bits de entropia em vez dos 128 que uma frase de doze palavras deve ter. Em Mk4, Mk5 e Q o quadro era melhor mas não seguro: os engenheiros tinham misturado valores dos elementos seguros no estado do gerador como, na expressão da Coinkite, uma reserva da reserva, o que elevou essas sementes para cerca de 72 bits. Ambos os números são catastróficos do mesmo modo. O acaso não se vê. Uma chave com 40 bits por detrás assina transações, verifica endereços e é reposta a partir de cópia tal como uma de 128, pelo que todos os testes funcionais que a empresa e os seus clientes correram durante cinco anos passaram, e bem, enquanto o produto estava avariado.
A Coinkite oferece ainda um pormenor que a maioria dos fornecedores teria enterrado. Há algumas semanas, escreve, a empresa usou um dos melhores modelos de inteligência artificial disponíveis para rever o próprio código à procura de problemas de segurança, e ele não encontrou este defeito. Vale a pena deter-se aí antes que o próximo fornecedor lhe diga que o código dele foi revisto por um modelo. O defeito não era subtil visto em retrospetiva nem estava escondido, mas vivia na junta entre uma configuração de compilação e um pressuposto criptográfico, ou seja, exatamente a costura que um revisor atento à qualidade do código dificilmente tratará como fronteira de segurança.
A correção protege a chave seguinte, não a anterior
A Coinkite lançou a 31 de julho firmware corrigido para cada modelo e ramo afetados: 4.2.0 para Mk2 e Mk3, 5.6.0 para Mk4 e Mk5, 1.5.0Q para Q e as compilações edge correspondentes. Depois publicou a frase que pesa mais do que a correção. Atualizar o firmware não altera nem repara uma semente existente. A instrução da empresa é instalar o firmware corrigido, gerar uma semente nova no aparelho atualizado, registar e verificar a respetiva cópia de segurança antes de depositar seja o que for, confirmar um novo endereço de receção no ecrã do aparelho, enviar uma pequena transação de teste e só então mover os fundos restantes.
Isto é uma migração e não uma atualização, e nessa distinção está toda a lição. Duas coisas podiam salvar uma carteira criada na janela afetada: cinquenta lançamentos de dados independentes e privados introduzidos através da função de dados do próprio aparelho, dado que a Coldcard os incorporava na semente, ou uma frase-passe forte e única, que funciona como barreira separada à frente da semente fraca. Ainda assim, a Coinkite aconselha mesmo os utilizadores com frase-passe a migrar logo que seja praticável. TAPSIGNER, OPENDIME e SATSCARD assentam noutras bases de código e não estão afetados.
Faça o registo do que gerou, não só do que executa
Quase todos os processos de correção que um proprietário alguma vez aprovou tratam a versão do software como unidade de risco. Fica-se a saber que uma versão é vulnerável, atualiza-se, e a exposição termina. Os defeitos de entropia partem esse modelo por completo, porque o dano não está no código em execução mas em objetos que o código emitiu e entregou: chaves, tokens, identificadores de sessão, códigos de recuperação, segredos de API, certificados. Esses objetos sobrevivem à versão que os fez, viajam para cópias de segurança e sistemas de terceiros, e levam a fraqueza consigo de forma permanente. Atualizar o gerador acaba com a produção de segredos maus. Nada faz quanto ao inventário.
Assim, a pergunta a fazer a qualquer fornecedor cujo produto crie segredos em seu nome não é apenas que versões estão afetadas. É que segredos foram gerados numa versão afetada, como se enumeram e qual é o caminho de substituição. Isto vale muito para lá das carteiras físicas: o HSM na cadeia de pagamentos, a autoridade de certificação, a linha de aprovisionamento de aparelhos, o fornecedor de identidade que emite tokens de longa duração. Onde quer que uma máquina cunhe algo em que mais tarde se apoie, a janela defeituosa é o que há a inventariar, e quase ninguém guarda registo dela.
Leia a seguir: Três empresas decidem se o seu telemóvel fica barato | Siemens e Schneider entraram a 22 de julho



