Why Nostr? What is Njump?
2024-02-18 20:04:40

bolsonitro_btc on Nostr: Doutores, números aleatórios é coisa séria em nosso meio, muito importante no ...

Doutores, números aleatórios é coisa séria em nosso meio, muito importante no contexto do Bitcoin.
🧵

Isso porque as carteiras de Bitcoin são geradas à partir de números aleatórios, se eu obter um número aleatório igual ao seu, poderei obter uma carteira idêntica à sua.
Por isso precisa-se de entropia o suficiente, números realmente aleatórios.

Recentemente foi descoberta a vulnerabilidade Milk Sad, no qual uma lib usou um algoritmo inseguro para geração de números aleatórios, inicializando com 32 bits de dados, esses 32 bits era a hora atual do sistema. (Essa é a semente do algoritmo)

Um bit é um dado binário (0 ou 1), no computador, tudo é binário, então 32 bits de dados é algo como:
01010011011100110011101010101101
Acontece que o algoritmo de geração (Mersenne Twister) gera o mesmo número aleatório para se a semente for a mesma.

Então se eu gero sempre um mesmo número "aleatório" se a semente for igual, e a lib usava 32bits como semente, então o total de combinações possíveis era de 2^32 = 4.294.967.296
Isso não é um número grande.

Portanto alguém poderia fazer um bruteforce e gerar várias carteiras que outras pessoas também geraram com essa lib.
Essa lib foi usada como exemplo do livro "Mastering Bitcoin"

A vulnerabilidade foi batizada de "Milk Sad" porque quando a data do sistema fosse 0 a lib gerava a mesma mnemonica, que começava com "Milk Sad"
https://milksad.info

Recentemente houve outra vulnerabilidade descoberta, também envolvendo a aleatoriedade.
A lib BitcoinJS foi usada para gerar a carteira Bitcoin nos navegadores, acontece que ela usou métodos do JS que eram inseguros, como o Math.Random() ou window.crypto.random que ainda não estava disponível em muitos navegadores.
Isso fez com que carteiras geradas entre 2011 e 2015 não tivessem entropia suficiente, e portanto, estariam vulneráveis. Em torno de 1,2 a 2,2 bilhões de dólares estão vulneráveis à esse tipo de ataque.

Depois de março/2012 alguns projetos começaram a adicionar fontes de entropia, além dos números do Math.Random() como cliques e movimentos do mouse.
Mas isso não é suficiente, e pelo que entendi, a Unciphered conseguiu minerar algumas dessas carteiras antigas de BTC.

É por isso que fontes de números verdadeiramente aleatórios, e que não sejam de meros 32 bits, é muito importante.
Lembra que 32 bits são 2^32 combinações possíveis?
Se for 256 bits são 2^256 que dá 115792089237316195423570985008687907853269984665640564039457584007913129639936 combinações possíveis.
Ou seja, quase impossível de testar todas elas.
Existem muitas fontes de entropia, alguns processadores geram uma entropia com base no ruído de wifi, ruído da entrada de energia, microfone, giroscópio etc.


Por exemplo, esse é o histograma de geração de números aleatórios no RP2040, usado no Raspberry Pi Pico (Não é o Pi Zero).
Como você pode ver, não é aleatório, e não atende os critérios de segurança, isso é uma informação bem clara no datasheet.


Já o ESP32 usa um número aleatório do processador correlacionado à fontes de ruído, como Wi-Fi.
Ou seja, tem algumas condições para que seja verdadeiramente aleatório.


ESP32 é o processador do SEEDER, que disponibiliza a função de gerar uma carteira usando a entropia do processador, ou usando a jogada de moeda.
A primeira vez que me falaram de HW no ESP32 eu perguntei logo sobre a entropia.
Mesmo assim é um número aleatório de 32 bits. Então é preciso ter cuidado.

A vantagem é que a Seeder permite que use entropia gerada pela moeda.
O que com certeza gera mais entropia que o processador.
Se for usar essa peça, gere pela moeda.

Já a Krux permite que se use a câmera, ou dados de 6 ou 20 lados, como fonte de entropia.
Segundo a documentação, ela não usa outras fontes de entropia além dos dados ou da foto em si, portanto, não usa o gerador de números aleatórios do processador.
Ainda é preciso testar.

Hardware Wallets como Trezor e Ledger usam o gerador de números aleatórios do processador junto à fontes externas de ruído.
Já a Cold Card gera um número com o processador, usa isso como seed para um algoritmo de geração de números pseudoaleatórios, passa o resultado num SHA256 e permite que você adicione a entropia dos dados na entropia que ela já gerou, fazendo com que a semente que gera a mnemonica seja de 256 bits.
FONTE: https://coldcard.com/docs/faq/#entropy

Thread original no twitter: https://twitter.com/bolsonitro_btc/status/1724938021617746269
Author Public Key
npub1fmp5rehp74ehqcct00um0x54jw3006uc4lj97wuhp7sqxmwzlkhslcudr0