Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
bitcoin-security — Estudo educacional sobre a entropia de chaves Bitcoin: enumeração de carteiras com RNG fraco (classe Milk Sad / CVE-2023-39910) vs. a inviabilidade de quebrar uma boa chave por força bruta. | Kitploit
Ferramentas/GitHubGitHub/xaxis/bitcoin-security
Análise de VulnerabilidadesCriptografiaAprendizado e Educação
GitHubxaxis/bitcoin-security

bitcoin-security

Estudo educacional sobre a entropia de chaves Bitcoin: enumeração de carteiras com RNG fraco (classe Milk Sad / CVE-2023-39910) vs. a inviabilidade de quebrar uma boa chave por força bruta.

Ver Repositório
4há 27 diasAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

bitcoin-security

Um estudo educacional sobre de onde a segurança das chaves Bitcoin realmente vem — e de onde ela não vem. Construído em torno da derivação real BIP39/BIP32, com dois experimentos que ficam em extremos opostos da mesma ideia:

ExperimentoEspaço de buscaViável?O que ensina
weak_entropy — enumerar um espaço de carteira com RNG fraco2³² (um RNG ruim)Sim, em diasUma carteira é tão forte quanto a entropia por trás dela.
blind_search — aplicar força bruta a um espaço de chaves bom2¹⁶⁰ (um RNG bom)Não, jamaisCom entropia real, o espaço de chaves é fisicamente impossível de pesquisar.

O ponto central é o contraste: chaves são roubadas atacando aleatoriedade ruim, nunca superando computacionalmente aleatoriedade boa. Ambos os experimentos derivam o mesmo tipo de endereços reais de mainnet, então a única variável é a entropia.


⚠️ Escopo e intenção

Este repositório é para educação defensiva e pesquisa de segurança: entender por que bugs de carteiras com RNG fraco (Milk Sad / CVE-2023-39910, o bug da extensão Trust Wallet de 2018 e seus semelhantes) foram catastróficos, e por que aplicar força bruta a uma chave gerada corretamente não é.

  • weak_entropy enumera um espaço sintético autocontido. Sua weak_entropy() é um modelo deliberado da classe de vulnerabilidade — um PRNG de 32 bits alimentando BIP39 — não um clone byte a byte do RNG de qualquer carteira real. Os endereços que ela produz não correspondem à carteira real de ninguém.
  • blind_search é uma consulta de saldo somente leitura contra o seu próprio nó. Ela não deriva chaves e não pode gastar nada; seu modo principal mede a futilidade da busca cega.
  • Este projeto intencionalmente não fornece, e não será estendido para fornecer, um pipeline que tenha como alvo fundos de vítimas reais (por exemplo, reproduzir o RNG de uma carteira real, ou ligar endereços com saldo encontrados de volta às chaves recuperadas). Essa é a linha entre estudar a vulnerabilidade e transformá-la em arma.

Use-o em carteiras que você controla, em testnet ou como um sandbox. Não o aponte para o dinheiro de outras pessoas.

Uso legal e responsável

Somente para educação e pesquisa de segurança autorizada. Use-o exclusivamente em chaves, carteiras e sistemas que você possui ou para os quais tem permissão explícita por escrito para testar. Acesso não autorizado a carteiras ou sistemas alheios e roubo de ativos digitais são ilegais sob leis como a CFAA dos EUA (18 U.S.C. § 1030), o Computer Misuse Act 1990 do Reino Unido e a Diretiva 2013/40/EU da UE — independentemente dos meios técnicos. Fornecido "como está", sem garantia; os autores não aceitam nenhuma responsabilidade por uso indevido. Isto não é aconselhamento jurídico. Termos completos e orientação de divulgação responsável: DISCLAIMER.md.


A lição central

A segurança de uma carteira é limitada pela entropia que entrou na sua semente, não pela força de SHA-256 / PBKDF2 / secp256k1 a jusante.

BIP39 transforma entropia em um mnemônico, PBKDF2 a estica em uma semente e BIP32 deriva uma árvore de chaves. Tudo isso é forte. Mas nada disso adiciona entropia — se a semente foi extraída de um conjunto pequeno, todo endereço que a carteira pode produzir é enumerável, e nenhuma quantidade de hash esconde isso.


Estrutura do repositório

root@kitploit:~
bitcoin-security/
├── bitcoin_security/            # the package
│   ├── derivation.py            #   shared core: BIP39 + BIP32 + P2PKH/WIF
│   ├── data/english.txt         #   BIP39 English wordlist (2048 words)
│   ├── weak_entropy/            #   Experiment 1 — enumerable weak space
│   │   ├── enumerate.py         #     recovery demo + full-space dump
│   │   └── README.md
│   └── blind_search/            #   Experiment 2 — futile brute-force search
│       ├── scan.py              #     UTXO-set balance scanner + odds
│       └── README.md
├── tests/                       # offline test suites (no node/network)
│   ├── test_blind_search_addresses.py
│   └── test_blind_search_pipeline.py
├── docs/FINDINGS.md             # benchmarks + exact full-space size derivation
├── pyproject.toml
├── requirements.txt
└── LICENSE

A árvore reflete a ideia: um núcleo derivation compartilhado, dois experimentos que o usam para chegar a conclusões opostas sobre o mesmo espaço de endereços.

Instalação

root@kitploit:~
pip install -r requirements.txt          # runtime deps
# optional — installs the package + `bsec-enumerate` / `bsec-scan` commands:
pip install -e .

coincurve (libsecp256k1 nativa) torna a derivação ~5× mais rápida, mas é opcional — derivation.py recorre ao ecdsa puro em Python com saída idêntica. Nada aqui toca a rede, exceto pela flag opt-in --check-balance e pelo blind_search (que precisa de um nó Bitcoin local).

Tudo roda como módulo a partir da raiz do repositório; nenhuma instalação é necessária:

root@kitploit:~
python3 -m bitcoin_security.weak_entropy --help
python3 -m bitcoin_security.blind_search --help

Experimento 1 — weak_entropy: entropia fraca é enumerável

Os 16 bytes "aleatórios" de entropia BIP39 da carteira na verdade vêm de uma semente de 32 bits. A derivação completa é real e verificada contra vetores de especificação.

root@kitploit:~
seed32 ──MT19937──▶ 16-byte entropy ──BIP39──▶ mnemonic ──PBKDF2(2048)──▶ 64-byte seed
                                                                              │
                            address ◀──hash160──── pubkey ◀──BIP32 m/44'/0'/0'/0/0
root@kitploit:~
# Recovery: derive a victim wallet from a weak seed, then recover its full
# mnemonic + private key knowing only the public address.
python3 -m bitcoin_security.weak_entropy

# Expand one seed into every form.
python3 -m bitcoin_security.weak_entropy --show 3571

# Materialize the whole 2**32 space to sharded, resumable files.
python3 -m bitcoin_security.weak_entropy --dump-all --out-dir space_dump --max-file-mb 1000

As linhas são mínimas (address <TAB> seed32) porque toda outra forma é uma função determinística de seed32, regenerada sob demanda com --show. Os dumps são retomáveis na granularidade de shard (verificados para reproduzir cobertura contígua, sem lacunas e sem duplicatas). Referência completa das flags em weak_entropy/README.md.

Aviso de escala. O dump completo de 2³² tem ~196 GB (mínimo) ou ~1.05 TB (--full) e leva dias mesmo com o backend nativo — veja docs/FINDINGS.md. Você quase nunca precisa do conjunto inteiro; faça o dump de uma fatia limitada para inspeção.


Experimento 2 — blind_search: você não consegue aplicar força bruta a uma chave boa

Um scanner de saldo real e funcional sobre o conjunto UTXO de um nó local (compatível com pruning) via scantxoutset. Seu propósito é o resultado nulo: buscar no espaço de endereços às cegas, constatar que nada é encontrado e imprimir a aritmética mostrando que sempre será assim.

root@kitploit:~
python3 -m bitcoin_security.blind_search --odds-only            # just the math, no node
python3 -m bitcoin_security.blind_search --random 200000 --odds # search 200k random addrs, then the math
python3 -m bitcoin_security.blind_search --control             # verify the pipeline finds known-funded addrs

O resultado: o espaço é 2¹⁶⁰ ≈ 1.46×10⁴⁸; ~55M endereços possuem saldo; portanto, um endereço aleatório tem saldo com probabilidade ~3.8×10⁻⁴¹. Mesmo a um bilhão de endereços/segundo, você esperaria ~8×10²³ anos — ~61 trilhões de vezes a idade do universo. Não é um problema de hardware: pelo limite de Landauer, meramente contar até 2¹⁶⁰ excede a produção de energia restante do sol. Configuração do nó em blind_search/README.md.


A síntese

Ambos os experimentos derivam o mesmo tipo de endereço. A única diferença é o tamanho do conjunto do qual a semente foi extraída:

  • Entropia boa → 2¹⁶⁰, impossível de pesquisar pela física. (Experimento 2)
  • Entropia fraca → 2³², exaurível em dias em um laptop. (Experimento 1)

Essa lacuna — 128 bits — é a questão toda. Todo roubo real desta classe viveu nela.


Testes

root@kitploit:~
python3 tests/test_blind_search_addresses.py     # BIP-173/350/380 address vectors
python3 tests/test_blind_search_pipeline.py       # scan pipeline, RPC stubbed
python3 -m bitcoin_security.derivation            # derivation self-test (spec vectors)

Resultados experimentais (resumo)

Detalhes completos, métodos e especificações da máquina em docs/FINDINGS.md.

  • Correção: derivação verificada contra vetores de especificação BIP39/BIP32/BIP-173/350/380; o scanner acompanha suítes de teste offline e um endereço de controle obrigatório com saldo conhecido a cada execução.
  • Desempenho: substituir o ecdsa puro em Python por coincurve (libsecp256k1) reduziu a derivação por carteira de 3.02 ms → 0.591 ms (~5.1×) em um Apple M3 Max; o piso restante é PBKDF2-HMAC-SHA512 ×2048 a 0.463 ms/carteira.
  • Tamanho do espaço completo (exato): 196.3 GB mínimo / ~1.05 TB --full, a partir de uma forma fechada exata para os dígitos de seed32 mais um comprimento médio de endereço medido.
  • Tempo do espaço completo: ~29 dias de CPU single-core; ~2–3 dias nos núcleos de desempenho do M3 Max; piso rígido de PBKDF2 ~1.6 dias. "Horas" exigiriam uma GPU.

Referências

  • CVE-2023-39910 — "Milk Sad", libbitcoin-explorer bx seed (MT19937 de 32 bits semeado a partir do tempo). Fundos reais roubados. https://milksad.info/
  • Entropia fraca da extensão de navegador Trust Wallet (2018).
  • BIPs: 39 (mnemônicos), 32 (carteiras HD), 44 (caminhos), 173/350 (bech32/bech32m), 380 (descritores).

Licença

MIT — veja LICENSE. Termos de uso e orientação de divulgação responsável: DISCLAIMER.md. Relato de problemas: SECURITY.md.

Baixar ferramenta