Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
bitcoin-security — Учебное исследование энтропии ключей Bitcoin: энумерация кошельков со слабым RNG (класс Milk Sad / CVE-2023-39910) против неосуществимости брутфорса надёжного ключа. | Kitploit
Инструменты/GitHubGitHub/xaxis/bitcoin-security
Анализ уязвимостейКриптографияОбучение и Образование
GitHubxaxis/bitcoin-security

bitcoin-security

Учебное исследование энтропии ключей Bitcoin: энумерация кошельков со слабым RNG (класс Milk Sad / CVE-2023-39910) против неосуществимости брутфорса надёжного ключа.

Репозиторий
8 дней назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

bitcoin-security

Образовательное исследование того, откуда на самом деле берётся безопасность ключей Bitcoin, — и откуда она не берётся. Построено на реальной деривации BIP39/BIP32, с двумя экспериментами на противоположных концах одной и той же идеи:

ExperimentSearch spaceFeasible?What it teaches
weak_entropy — перебор пространства кошелька со слабым ГСЧ2³² (плохой ГСЧ)Да, за дниКошелёк настолько же силён, насколько сильна энтропия, стоящая за ним.
blind_search — полный перебор хорошего ключевого пространства2¹⁶⁰ (хороший ГСЧ)Нет, никогдаПри реальной энтропии ключевое пространство физически невозможно перебрать.

Весь смысл — в контрасте: ключи похищают, атакуя плохую случайность, а не превосходя хорошую случайность вычислениями. Оба эксперимента деривируют одни и те же реальные адреса мейннета, так что единственная переменная — энтропия.


⚠️ Область применения и назначение

Этот репозиторий предназначен для оборонительного образования и исследований в области безопасности: понимания того, почему ошибки слабого ГСЧ в кошельках (Milk Sad / CVE-2023-39910, ошибка расширения Trust Wallet 2018 года и им подобные) были катастрофическими, и почему полный перебор корректно сгенерированного ключа — нет.

  • weak_entropy перебирает самодостаточное синтетическое пространство. Его weak_entropy() — намеренная модель класса уязвимостей — 32-битный ГПСЧ, питающий BIP39, — а не побайтовая копия ГСЧ какого-либо реального кошелька. Создаваемые им адреса не соответствуют ничьему реальному кошельку.
  • blind_search — это доступный только для чтения поиск баланса через ваш собственный узел. Он не деривирует ключи и не может ничего потратить; его основной режим измеряет бесполезность слепого поиска.
  • Этот проект намеренно не предоставляет и не будет расширен для предоставления конвейера, нацеленного на средства реальных жертв (например, воспроизведения ГСЧ реального кошелька или связывания найденных финансируемых адресов с восстановленными ключами). Это грань между изучением уязвимости и превращением её в оружие.

Используйте его на кошельках, которыми вы управляете, в тестнете или как песочницу. Не направляйте его на чужие деньги.

Правовое и ответственное использование

Только для образования и санкционированных исследований в области безопасности. Используйте его исключительно на ключах, кошельках и системах, которыми вы владеете или на тестирование которых у вас есть явное письменное разрешение. Несанкционированный доступ к чужим кошелькам или системам и хищение цифровых активов незаконны согласно таким законам, как CFAA США (18 U.S.C. § 1030), Закон Великобритании о неправомерном использовании компьютеров 1990 года и Директива ЕС 2013/40/EU, — независимо от технических средств. Предоставляется «как есть», без каких-либо гарантий; авторы не несут ответственности за неправомерное использование. Это не юридическая консультация. Полные условия и рекомендации по ответственному раскрытию уязвимостей: DISCLAIMER.md.


Главный урок

Безопасность кошелька ограничена энтропией, которая попала в его сид, а не стойкостью SHA-256 / PBKDF2 / secp256k1 ниже по цепочке.

BIP39 превращает энтропию в мнемонику, PBKDF2 растягивает её в сид, а BIP32 деривирует дерево ключей. Всё это стойко. Но ничто из этого не добавляет энтропии: если сид был выбран из малого множества, каждый адрес, который кошелёк когда-либо сможет породить, перечислим, и никакое хеширование этого не скроет.


Структура репозитория

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

Дерево отражает идею: одно общее ядро derivation и два эксперимента, которые используют его, чтобы прийти к противоположным выводам об одном и том же адресном пространстве.

Установка

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

coincurve (нативная libsecp256k1) ускоряет деривацию примерно в 5 раз, но опционален: derivation.py откатывается к чисто-Python ecdsa с идентичным выводом. Ничто здесь не касается сети, кроме подключаемого флага --check-balance и blind_search (которому нужен локальный узел Bitcoin).

Всё запускается как модуль из корня репозитория; установка не требуется:

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

Эксперимент 1 — weak_entropy: слабая энтропия перечислима

«Случайные» 16 байт энтропии BIP39 кошелька на самом деле берутся из 32-битного сида. Полная деривация реальна и проверена по векторам из спецификаций.

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

Строки минимальны (address <TAB> seed32), поскольку любая другая форма — детерминированная функция от seed32, заново генерируемая по запросу через --show. Дампы возобновляемы с точностью до шарда (проверено: покрытие воспроизводится непрерывным, без пропусков и дубликатов). Полная справка по флагам — в weak_entropy/README.md.

Предупреждение о масштабе. Полный дамп 2³² — это ~196 ГБ (минимальный) или ~1.05 ТБ (--full), и он занимает дни даже с нативным бэкендом — см. docs/FINDINGS.md. Полный объём почти никогда не нужен; сбросьте ограниченный фрагмент для изучения.


Эксперимент 2 — blind_search: хороший ключ невозможно перебрать

Реальный, работающий сканер балансов по множеству UTXO локального узла (pruning допустим) через scantxoutset. Его назначение — нулевой результат: искать по адресному пространству вслепую, убедиться, что вы ничего не находите, и вывести арифметику, показывающую, что так будет всегда.

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

Результат: пространство — 2¹⁶⁰ ≈ 1.46×10⁴⁸; баланс есть примерно на 55M адресах; значит, случайный адрес финансируется с вероятностью ~3.8×10⁻⁴¹. Даже при миллиарде адресов в секунду вам пришлось бы ждать ~8×10²³ лет — примерно в 61 триллион раз больше возраста Вселенной. Это не проблема оборудования: по пределу Ландауэра один лишь счёт до 2¹⁶⁰ превышает оставшуюся энерговыработку Солнца. Настройка узла — в blind_search/README.md.


Синтез

Оба эксперимента деривируют адреса одного вида. Единственное различие — размер множества, из которого был взят сид:

  • Хорошая энтропия → 2¹⁶⁰, физически невозможно перебрать. (Эксперимент 2)
  • Слабая энтропия → 2³², исчерпывается за дни на ноутбуке. (Эксперимент 1)

Этот разрыв — 128 бит — и есть вся суть. Каждая реальная кража этого класса находилась именно в нём.


Тесты

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)

Экспериментальные результаты (кратко)

Полные подробности, методики и характеристики машин — в docs/FINDINGS.md.

  • Корректность: деривация проверена по векторам спецификаций BIP39/BIP32/BIP-173/350/380; сканер поставляется с автономными наборами тестов и обязательным контрольным адресом с известным балансом на каждый запуск.
  • Производительность: замена чисто-Python ecdsa на coincurve (libsecp256k1) сократила деривацию на один кошелёк с 3.02 мс до 0.591 мс (~5.1×) на Apple M3 Max; оставшийся минимум — PBKDF2-HMAC-SHA512 ×2048 на уровне 0.463 мс/кошелёк.
  • Размер полного пространства (точно): минимум 196.3 ГБ / ~1.05 ТБ (--full); получен из точной замкнутой формулы для цифр seed32 плюс измеренной средней длины адреса.
  • Время перебора полного пространства: ~29 CPU-дней на одном ядре; ~2–3 дня на производительных ядрах M3 Max; жёсткий минимум PBKDF2 — ~1.6 дня. «Часы» потребовали бы GPU.

Ссылки

  • CVE-2023-39910 — «Milk Sad», libbitcoin-explorer bx seed (32-битный MT19937, сидируемый временем). Реальные средства были похищены. https://milksad.info/
  • Слабая энтропия браузерного расширения Trust Wallet (2018).
  • BIP: 39 (мнемоника), 32 (HD-кошельки), 44 (пути), 173/350 (bech32/bech32m), 380 (дескрипторы).

Лицензия

MIT — см. LICENSE. Условия использования и рекомендации по ответственному раскрытию уязвимостей: DISCLAIMER.md. Сообщения об уязвимостях: SECURITY.md.

Скачать инструмент