Vulnerabilidade de número pseudo aleatório em Bitcoin

As chaves privadas de Bitcoin são um valor inteiro de 1 a 11579208923731619542357098500868790785283756427907490438260516314151816141494337 ou no HEX 1 a 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaffce6af48a03bbfd Na rede principal do Bitcoin, existem endereços começando com 1: compactado, não compactado; 3 endereços: SigScript e versões anteriores compatíveis com o SegWit, bem como endereços SegWit nativos começando com bc1. Além disso, já existem cerca de setenta garfos com prefixos diferentes, mas com as mesmas raízes do Bitcoin principal.

Os endereços Bitcoin são calculados pela função de assinatura criptográfica ECDSA () com base em uma curva elíptica.

Portanto, considere a geração de um endereço Bitcoin a partir de uma chave privada.

Chave privada d - número
A chave pública Q é o ponto da curva elíptica igual a dG,
onde G é o ponto base da curva.

  • Para assinatura, um número aleatório k é selecionado no intervalo [1, n-1].
  • O ponto da curva é calculado (x1, y1) = k * G
  • Ele calcula r = x1 mod N, onde N é a ordem da curva.
  • Ele calcula s = k-1 (H (m) + rd) mod N, onde k-1 é o número inverso de N a k módulo N.
  • H (m) é o hash da mensagem que está sendo assinada.

imagem

A assinatura é um par (r, s).

A variável "k" é aleatória e é obtida no algoritmo ECDSA de bibliotecas padrão do sistema operacional.

Assim, em toda a função você pode afetar apenas essa variável. O que fornece dois vetores de ataque:

  1. vulnerabilidade de número pseudo-aleatório
  2. e sorte universal em que um número aleatório cai duas vezes


Ataque pseudo-gerador de números aleatórios


Nils Schneider foi o primeiro a investigar e publicar esse problema em 28 de janeiro de 2013 em sua página pessoal. Mas o problema persistiu e, além disso, adquiriu uma nova escala.

Um ataque de software ao PRNG é dividido em três tipos:
Ataque criptográfico direto com base na análise da saída do algoritmo.

Ataques baseados em dados de entrada podem ser divididos em ataques com dados de entrada conhecidos, ataques com dados de entrada reproduzíveis e ataques a dados de entrada selecionados.

Ataques baseados na revelação do estado interno em que o atacante conhece o estado inicial ou inicial do gerador.

Também estão incluídos aqui os indicadores do software, nos quais o criador do algoritmo conhece qualquer um dos números pseudo-aleatórios com hash e os subsequentes na cadeia. Esse algoritmo é difícil de determinar de fora, pois os números parecem distribuídos uniformemente por toda a faixa.

As vulnerabilidades de software também incluem geração fraca de números pseudo-aleatórios em bibliotecas individuais. Como SSL, OpenSSL, algumas bibliotecas Java, JavaScript, etc. Materiais detalhados foram descritos repetidamente em periódicos de hackers e, com o tempo, tornaram-se exemplos em livros didáticos de criptografia.

Qual é a escala da ameaça para o Bitcoin?


Tendo um nó Bitcoin completo, você pode comparar e agrupar todas as transações de rede. Basta comparar a variável "k" em todas as transações em cada endereço e encontrar duplicatas.

Na primeira vez em que fizemos a reconciliação no final de 2016, o banco de dados atingiu mais de 210 milhões de endereços, transações com um total de mais de 170 milhões de endereços e assinaturas 447 milhões. Demorou uma semana para verificar os endereços vulneráveis ​​em dez threads.

Como resultado, foram encontrados 1327 endereços vulneráveis ​​com as mesmas assinaturas! Uma lista de endereços pode ser encontrada no final do artigo.

Isso significa que você pode calcular a chave privada para esses endereços, o que significa obter controle sobre o dinheiro.

O maior vazamento ocorreu no verão de 2015. A carteira JavaScript Blockchain.info por várias horas produziu o mesmo valor da variável "k". O que levou ao roubo de cerca de 200 Bitcoins!

Se removermos o fator humano das vulnerabilidades de software, a probabilidade de coincidência é de aproximadamente 0,000296868%. Nem um pouco, mas eu realmente não gostaria de ter tanta "sorte" e perder meu dinheiro.

Como lidar com isso?


Conforme descrito acima, essa vulnerabilidade funciona apenas ao enviar pagamentos e gerar a mesma variável "K" em pelo menos duas transações. Portanto, se você não criar transações de saída ou minimizar seu número, não haverá ameaça alguma. Essa idéia foi implementada há muito tempo no protocolo Bitcoin BIP 32 (Carteiras determinísticas hierárquicas, carteira HD) Carteira determinística hierárquica.

Sua idéia é usar uma chave privada a partir da qual você pode obter uma cadeia interminável de endereços Bitcoin. Você pode usar um endereço único para receber cada transação individual. Ao mesmo tempo, o valor do saldo da carteira HD é a soma de todos os saldos da cadeia de endereços. E com uma transação de saída, as moedas são coletadas desses endereços, formando uma transação de saída para cada endereço de Bitcoin. A mudança será direcionada para o novo endereço Bitcoin da cadeia de endereços.

Esse esquema de trabalho aumenta significativamente a segurança e o anonimato da carteira.

Referências:

[1] ECDSA - Falhas de aplicação e implementação, Markus Schmid, UC SANTA BARBARA, CS 290G, FALL 2015.

[2] Nils Schneider: Recuperando chaves privadas de Bitcoin usando assinaturas fracas da blockchain, entrada do Blog, 28 de janeiro de 2013.

[3] Ataques de combinação de recuperação de chave privada

[4] Lista de endereços vulneráveis ​​e equilíbrio geral

Source: https://habr.com/ru/post/pt430240/


All Articles