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

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

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

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

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

Категории

Все категории
Loading categories
profanity-verifier — Проверяемое доказательство для CVE-2022-40769: лежит ли приватный ключ EOA в пространстве ключей, достижимых через Profanity? | Kitploit
Инструменты/GitHubGitHub/artsbykriss/profanity-verifier
Взлом паролейСканеры уязвимостейАнализ уязвимостейЭксплуатацияКриптографияСтатьи и Исследования
GitHubartsbykriss/profanity-verifier

profanity-verifier

Проверяемое доказательство для CVE-2022-40769: лежит ли приватный ключ EOA в пространстве ключей, достижимых через Profanity?

Репозиторий
119 ч 27 мин назадЕщё не проверено

Популярное

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

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

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

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

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

profanity-verifier

Доказуемая проверка CVE-2022-40769: лежит ли приватный ключ EOA в пространстве ключей, достижимом генератором красивых адресов Profanity? Если да, ключ восстановим, и счёт (и всё, что он контролирует) может быть опустошён кем угодно.

Никаких эвристик. Результат — булево значение, подкреплённое полным перебором точного пространства ключей, воспроизводимым при повторном запуске того же шарда.

Баг, из исходного кода

Dispatcher.cpp, createSeed():

root@kitploit:~
std::random_device rd;
std::mt19937_64 eng(rd());                 // seeded with only 32 bits  <- CVE-2022-40769
std::uniform_int_distribution<cl_ulong> distr;
cl_ulong4 r;
r.s[0] = distr(eng); r.s[1] = distr(eng);  // 256-bit seed, used directly
r.s[2] = distr(eng); r.s[3] = distr(eng);  // as the private key

Затем ядро OpenCL берёт G^k для этого ключа и идёт вперёд, увеличивая ключ на единицу за раунд, пока адрес не совпадёт с запрошенным шаблоном. Таким образом, всё достижимое пространство ключей таково:

root@kitploit:~
key(x, i) = mt19937_64(x) as a 256-bit scalar + i
x ∈ [0, 2^32)    the 32-bit seed (four billion possibilities)
i ∈ [0, depth]   rounds the generator ran

Что делает эта программа

  1. Идёт вниз от публичного ключа кандидата: P_j = P − j·G для j ≤ depth. Если ключ был создан Profanity, одна из этих точек является публичным ключом сида.
  2. Сканирует сиды в своём шарде; для каждого x выводит mt19937_64(x) и его адрес.
  3. Совпадение означает, что P_j — это публичный ключ сида, поэтому приватный ключ кандидата равен seed(x) + j — восстановим, следовательно, счёт можно опустошить.

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

Проверено

  • MT19937-64 в точности совпадает с libstdc++. Сырые выборки std::mt19937_64 для сидов 0, 1, 12345 и 4294967295 были сравнены лимб за лимбом с программой на g++, использующей std::mt19937_64 + std::uniform_int_distribution<unsigned long long>; идентичны.
  • Две независимые библиотеки кривых согласуются. Одни и те же тестовые векторы были получены с помощью k256 (чистый Rust) и secp256k1 (привязки libsecp256k1): сид 0 → 0xfef2583edde5637dad990bc5d05d52c8247019cf, сид 12345 → 0x7712c45360f5dfa3a622a815b6073f0351050f13.
  • --selftest проверяет вывод ключа, адрес, обход цепочки, восстановление обходом вниз и сквозное сканирование сидов, которое находит известный сид.

Запустите сами:

root@kitploit:~
cargo run --release -- --selftest

Использование

root@kitploit:~
profanity-verifier --address 0x... [--pubkey 0x...] --shard i/n [--depth 16777216]
  • --pubkey — несжатый публичный ключ кандидата (64 байта x||y, с префиксом 0x04 или без него). Восстановите его из любой транзакции, подписанной адресом. Без него можно проверить только позицию 0 в цепочке.
  • --shard i/n — срез 32-битного пространства сидов для поиска, чтобы работу можно было распараллелить между машинами.
  • --depth — насколько далеко по цепочке генератора искать. 2^24 покрывает шестисимвольный красивый адрес с запасом; большая глубина стоит памяти и времени.

Вывод — одна строка JSON, например:

root@kitploit:~
{"address":"0x...","shard":"0/64","depth":16777216,"seeds_checked":67108864,"seconds":833.4,"match":true}

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

Запуск в масштабе

.github/workflows/verify.yml распределяет поиск по матрице заданий (candidate, shard) на публичных раннерах.

Измеренная пропускная способность: ~20 000 сидов/с на 2 ядрах (libsecp256k1). Полное пространство сидов 2^32 — это ~59 ядро-часов, поэтому 64 шарда × 4 ядра ≈ 14 минут реального времени на кандидата — бесплатно в публичном репозитории.

Запуск со списком кандидатов:

root@kitploit:~
gh workflow run profanity-verify -f candidates='[{"address":"0x...","pubkey":"0x..."}]' -f shards=64

Ограничения

  • Предполагает, что генератор использовал std::mt19937_64 из libstdc++, что покрывается сравнением лимб за лимбом. Сборки с другой стандартной библиотекой имели бы другое отображение.
  • depth ограничивает поиск. Кандидат, сгенерированный после необычно долгого поиска (очень длинные шаблоны красивых адресов), может находиться за его пределами.
  • Полное покрытие требует публичного ключа. Без подписи от адреса проверяема только позиция 0 в цепочке.
  • Отрицательный результат говорит «не в пространстве Profanity» — он ничего не говорит о любой другой слабости.
Скачать инструмент