Данная статья посвящена рассмотрению возможности внедрения злоумышленником скрытого списка уязвимостей через обновление модулей, что может привести к компрометации устройств ESP32 и получению несанкционированного доступа к приватным ключам, что затрагивает миллиарды устройств, использующих данный микроконтроллер. Одной из ключевых проблем является уязвимость CVE-2025-27840, обнаруженная в архитектуре ESP32. Для обеспечение безопасности для сети Биткоин мы выявили следующие уязвимости, где возможность использования недействительных приватных ключей из-за отсутствия проверки нижней границы в функции has_invalid_privkey; уязвимость подделки подписей транзакций в функции electrum_sig_hash из-за несовместимости с BIP-137; проблема слабого PRNG в генерации ключей функцией random_key, делающая личные приватные ключи для криптовалютных кошельков предсказуемыми ; отсутствие проверки точек на кривой ECC в функции multiply, что может привести к invalid curve attacks; уязвимость в функции ecdsa_raw_sign при восстановлении Y-координаты, потенциально приводящая к подмене публичного ключа; и уязвимости, связанные с устаревшими API хеширования в функции bin_ripemd160.
В начале марта 2025 года компания Tarlogic Security выявила уязвимость в микроконтроллере ESP32, который широко используется для подключения устройств через WiFi и Bluetooth. Эта уязвимость была зарегистрирована под номером CVE-2025-27840. Злоумышленники могут несанкционированно получать доступ к данным Биткоин-кошельков, используя чип ESP32 в качестве точки для криптографических атак на устройства, работающие в сетях популярных криптовалют, таких как Биткоин и Эфириум. Данная проблема затрагивает миллионы IoT-устройств, которые используют этот микроконтроллер. Использование этой уязвимости позволит злоумышленникам осуществлять атаки, маскируясь под легитимных пользователей, и навсегда заражать уязвимые устройства. Это угрожает безопасности IoT-устройств, основанных на микроконтроллере ESP32, и может привести к краже приватных ключей Биткоин-кошельков.
ESP32 — это микроконтроллер, который широко применяется в IoT-устройствах для обеспечения соединений по Wi-Fi и Bluetooth. Злоумышленники могут применять различные методы для получения доступа к данным приватного ключа Биткоин-кошельков через ESP32.
Угрозы безопасности, связанные с микроконтроллером ESP32, могут привести к краже приватных ключей Биткоин-кошельков. Основные проблемы включают наличие бэкдоров и уязвимостей. Используя такие уязвимости, они могут манипулировать памятью, подменять MAC-адреса и внедрять вредоносный код, что создает серьезные риски для безопасности.
Злоумышленники могут осуществлять атаки на устройства IoT с микроконтроллером ESP32, используя уязвимости в соединениях Bluetooth и Wi-Fi может стать инструментом для атак на другие устройства в сети, связанной с Биткоином, а также для кражи конфиденциальной информации, включая приватные ключи Биткоин-кошельков.
Скрытый список уязвимостей:
Злоумышленник может обновить модули и внедрить в код список различных уязвимостей, среди которых:
Уязвимость в функции has_invalid_privkey, которая может быть использована для получения приватного ключа.
Уязвимость в функции electrum_sig_hash, позволяющая подделывать подписи транзакций Биткоина.
Уязвимость в функции random_key, связанная со слабым генератором псевдослучайных чисел (недетерминированный PRNG).
Уязвимость в функции multiply, где отсутствует проверка точки на кривой ECC.
Уязвимости в функциях ecdsa_raw_sign и bin_ripemd160.
Эти уязвимости могут быть использованы для внедрения поддельных обновлений на устройства ESP32, что предоставит злоумышленникам низкоуровневый доступ к системе. Это позволит им обойти средства контроля аудита кода и получить доступ к приватным ключам. В настоящее время миллиарды устройств могут оказаться уязвимыми из-за скрытых особенностей одного компонента в их архитектуре, что обозначено как CVE-2025-27840.
Уязвимость для получение приватного ключа в функция has_invalid_privkey
Данная уязвимость обнаружена в коде проверки приватных ключей Биткоин, позволяющая использовать недействительные ключи (меньше или равные 0) из-за отсутствия проверки нижней границы. Это может привести к потере средств. Для исправления необходимо добавить проверку, чтобы приватный ключ был больше 0. Код представлен в демонстрационных целях.
Эта ошибка позволяет использовать плохие приватные ключи, что может привести к серьезным проблемам, включая потерю денег.
Чтобы исправить это, нужно добавить проверку, чтобы приватный ключ был больше 0.
Представьте, что кто-то пытается «взломать» сеть Биткоин. Он находит слабое место в проверке приватных ключей, используемых для доступа к криптовалюте.
Проблема заключается в том, что код проверяет только, не слишком ли большой приватный ключ. Если ключ очень большой, он отвергается. Но код забывает проверить, не слишком ли ключ маленький (меньше или равен нулю).
Участок кода, где это происходит:
...
...
if privkey >= N: # Checking only the upper bound
raise Exception("Invalid privkey")
if privkey <= 0: # Lower bound is not checked properly
return True
...
...
Из-за этой ошибки можно использовать недействительные (очень маленькие) приватные ключи. Эта уязвимость находится в функции has_invalid_privkey.
Чтобы всё это работало, нужно установить библиотеку ecdsa (она нужна для работы с криптографией):
Импорт библиотеки ecdsa: Хотя в данном примере она не используется напрямую, в реальных сценариях работы с Биткоином и ECDSA (Elliptic Curve Digital Signature Algorithm) эта библиотека может понадобиться для выполнения криптографических операций.
Функция has_invalid_privkey(privkey: int) -> bool:
Принимает на вход приватный ключ privkey в виде целого числа.
Определяет константу N, которая представляет собой порядок эллиптической кривой secp256k1, используемой в Биткоине.
Проверяет, что privkey больше или равен N. Если это так, вызывает исключение, указывающее на невалидность приватного ключа.
Проверяет, что privkey меньше или равен 0. Если это так, возвращает True, что указывает на невалидность приватного ключа из-за отсутствия проверки нижней границы.
Если обе проверки не выявили невалидность, возвращает False.
Пример использования:
Устанавливает значение privkey = 0, что является невалидным приватным ключом.
Вызывает функцию has_invalid_privkey для проверки privkey.
В зависимости от результата выводит сообщение о том, является ли приватный ключ валидным или нет.
В коде присутствует уязвимость, связанная с недостаточной проверкой приватного ключа. А именно, отсутствует проверка нижней границы (privkey <= 0). Это позволяет использовать невалидные приватные ключи, что может привести к непредсказуемым последствиям, включая потерю средств.
Необходимо добавить проверку нижней границы приватного ключа, чтобы убедиться, что он больше 0.
Уязвимость подделки подписей транзакции Биткоин в функция electrum_sig_hash
Функция electrum_sig_hash в Electrum использует нестандартный метод хеширования сообщений, что делает её уязвимой для атак подделки подписи из-за несовместимости с BIP-137.
Атакующий, нацеленный на сеть Биткоин, может обнаружить нестандартный метод хеширования сообщений, применяемый Electrum, через функцию electrum_sig_hash. Эта функция создает хеш сообщения таким образом, что это может привести к атакам подделки подписи из-за несовместимости с BIP-137. Предоставленный скрипт Python демонстрирует, как злоумышленник может сгенерировать хеш сообщения, используемый Electrum, чтобы воспользоваться уязвимостью из-за несовместимости с BIP-137. Функция electrum_sig_hash подготавливает сообщение, добавляя к нему префикс и кодируя его длину, прежде чем выполнить двойное хеширование SHA256.
Скрипт Python, демонстрирующий, как злоумышленник может найти нестандартный хеш сообщения, используемый Electrum, чтобы выполнить атаки подделки подписи из-за несовместимости BIP-137.
num_to_var_int(i): преобразует целое число в формат переменной длины, используемый в Bitcoin.
from_string_to_bytes(s): кодирует строку в байты, используя кодировку UTF-8.
bin_dbl_sha256(s): выполняет двойное хеширование SHA256 на входных данных.
electrum_sig_hash(message): имитирует нестандартный способ хеширования сообщений в Electrum, подверженный несовместимости с BIP-137.
Уязвимость в функция random_key Слабый PRNG в генерации ключей (Недетерминированный PRNG)
Проблема возникает, когда для создания ключей в сети Биткоин используется функция random_key, которая полагается на модуль random. Модуль random не предназначен для криптографических целей, так как он не генерирует достаточно случайные числа, что делает личные приватный ключи предсказуемыми для злоумышленников. В связи с этим, сеть Биткоин становится уязвимой.
Скрипт Python, в котором сеть Биткоин уязвима из-за использования random вместо secrets или os.urandom, что делает личные приватные ключи предсказуемыми для злоумышленника сети Биткоин:
В этом скрипте модуль random используется для генерации ключей, что делает его уязвимым. Использование модуля random не подходит для криптографических целей, поскольку он не генерирует достаточно случайные числа.
Чтобы создать более безопасный ключ, вы можете использовать модуль secrets или os.urandom. Вот пример использования модуля secrets:
В этом примере модуль secrets используется для генерации случайного числа с достаточной энтропией. Затем случайное число хэшируется для создания личного приватного ключа. Этот метод гораздо безопаснее, чем использование модуля random.
Уязвимость в функции ecdsa_raw_sign
Уязвимость в функции ecdsa_raw_sign при восстановлении Y-координаты может привести к подмене публичного ключа в сети Биткоин. Существует большой риск, когда злоумышленник может воспользоваться особенностью восстановления Y-координаты при работе с эллиптической кривой. Эта неоднозначность может привести к тому, что публичный ключ будет восстановлен неверно.
В примере кода, представленном с использованием библиотеки pycryptodome, демонстрируется, как можно смоделировать эту ситуацию, подменив Y-координату, чтобы получить другой, недействительный публичный ключ. Важно отметить, что пример кода упрощен и не является полноценной реализацией атаки, а лишь показывает её принцип.
Злоумышленник может использовать неоднозначность восстановления Y-координаты в сети Биткоин, что может привести к ошибкам при восстановлении публичного ключа. Вот пример того, как это можно сделать с помощью побитовой операции XOR.
Этот скрипт демонстрирует, как можно изменить Y-координату, чтобы получить неверный публичный ключ.
Обратите внимание, что это всего лишь пример, и реальная атака может быть гораздо сложнее.
Помимо представленного выше скрипта, вот несколько дополнительных моментов, которые следует учитывать:
Frey-Rück Attack: Эта атака использует уязвимости в подписи ECDSA для извлечения секретного ключа «K» (nonce), что в конечном итоге может привести к восстановлению Биткоин-кошелька.
Побитовые операции: XOR является ценным инструментом для шифрования данных и может использоваться в сочетании с другими операциями для повышения безопасности.
Атака 51%: Хотя это и не связано напрямую с восстановлением Y-координат, важно понимать, что злоумышленник, контролирующий более 50% вычислительной мощности сети, может потенциально манипулировать блокчейном.
Манипуляции с координатами кривой Jacobian: Злоумышленники могут манипулировать математическими свойствами координат Jacobian для создания поддельных цифровых подписей.
Обновление ПО: Крайне важно всегда обновлять программное обеспечение и использовать только проверенные устройства, чтобы предотвратить потенциальную потерю монет BTC из-за критических уязвимостей.
Уязвимость в функции bin_ripemd160
Устаревшие API хеширования в сети Биткоин, особенно при отсутствии RIPEMD-160, могут быть уязвимы. Злоумышленники могут выявлять и использовать слабые реализации, что подчеркивает важность использования актуальных криптографических библиотек и регулярных обновлений безопасности
Атакующий в сети Биткоин может найти уязвимость в устаревшем API хеширования, особенно если в некоторых системах отсутствует реализация RIPEMD-160. Проблема заключается в функции bin_ripemd160, которая пытается использовать hashlib для хеширования, но при неудаче переключается на собственную, потенциально слабую реализацию.
В предоставленном Python-скрипте демонстрируется, как злоумышленник может проверить узел сети Биткоин на наличие такой слабой реализации API. Если hashlib не поддерживает RIPEMD-160, используется упрощенная реализация, что может привести к коллизиям хешей и другим уязвимостям. Скрипт имитирует атаку, хешируя данные и выводя предупреждение, если используется слабая реализация.
Риски включают возможность подделки транзакций и использование известных уязвимостей в устаревших API. Для защиты рекомендуется использовать актуальные и проверенные криптографические библиотеки, регулярно обновлять программное обеспечение Биткоин и проверять выходные данные криптографических операций.
Python-скрипт, в котором атакующий в сети Биткоин находит устаревший API хеширования и рассматривает риск отсутствия реализации RIPEMD-160 в определенных средах:
Подробное объяснение:
Реализация RIPEMD160 (при отсутствии в hashlib):
Функция bin_ripemd160(string):
Пытается хешировать входную строку с помощью RIPEMD160.
Сначала пытается использовать реализацию hashlib, а при необходимости возвращается к пользовательской реализации.
Если hashlib не поддерживает RIPEMD160, она захватывает исключение ValueError и использует пользовательскую реализацию.
Функция check_for_weak_api(data):
Эта функция имитирует злоумышленника, проверяющего узел сети Биткоин на наличие слабых реализаций API.
Выводит, что злоумышленник проверяет узел на наличие слабого API.
Кодирует данные в формат utf-8.
Вызывает bin_ripemd160 для хеширования данных.
Выводит, что данные были хешированы, и показывает значение хеша.
Если хеш представляет собой фиктивный хеш (20 байт нулей), выводит предупреждение о том, что узел использует слабую или пользовательскую реализацию RIPEMD160, что может привести к коллизиям хешей или другим уязвимостям.
Пример использования:
Как это работает:
Имитация атаки:
Проверка реализации RIPEMD160:
Идентификация слабых мест:
Возможные риски:
Коллизии хешей: Слабая реализация хеша RIPEMD160 может быть подвержена коллизиям хешей. Злоумышленник может использовать это, чтобы подделать транзакции или данные.
Уязвимости безопасности: Устаревшие API могут содержать известные уязвимости, которые злоумышленник может использовать.
Как смягчить:
Использование актуальных библиотек:
Убедитесь, что вы используете актуальные и проверенные библиотеки для криптографических операций.
Если RIPEMD160 необходим, используйте надежную и актуальную реализацию.
Регулярные обновления:
Валидация:
Уязвимость в функции multiply Отсутствие проверки точки на кривой ECC
В Биткоин существует потенциальная уязвимость в функции multiply из-за недостаточной проверки точек на кривой ECC. Это может позволить злоумышленнику проводить invalid curve attacks, хотя современные криптографические библиотеки, такие как pycryptodome, затрудняют такую эксплуатацию. Атака возможна через манипулирование кривой Jacobian, что может привести к поддельным подписям и манипуляциям в сети.
В сети Биткоин злоумышленник может найти уязвимость в функции multiply, которая заключается в отсутствии полной проверки, что точка находится на эллиптической кривой (ECC). В коде проверка выполняется только для ненулевых точек, что открывает возможность для атак с использованием недействительных кривых (invalid curve attacks).
Пример кода для атакующего показывает, как можно использовать эту уязвимость. В нем демонстрируется функция multiply, где отсутствует надежная проверка точки на кривой, и функция invalid_curve_attack, которая пытается использовать эту слабость. В коде также используются библиотеки pycryptodome для криптографических операций.
Используя уязвимость в функции multiply, злоумышленник может провести invalid curve attack, чтобы скомпрометировать секретные ключи в сети Bitcoin. Ниже представлен примерный скрипт на Python, демонстрирующий эту атаку.
Уязвимость: Функция multiply проверяет, что точка находится на кривой ECC, только если она не является точкой в бесконечности. Это позволяет использовать точки, которые не находятся на основной кривой, но находятся на «скрученной» кривой (twist curve).
Invalid Curve Attack: Атака заключается в использовании точки на другой кривой (malformed curve), чтобы получить информацию о секретном ключе. Поскольку проверка кривой не выполняется для всех точек, можно передать точку с другой кривой и использовать результат для восстановления части секретного ключа.
Функция invalid_curve_attack: Эта функция принимает публичный ключ и параметры malformed curve. Она создает точку на malformed curve и использует уязвимую функцию multiply для выполнения умножения.
Как работает атака малой подгруппы (Small Subgroup Attack):
Выбор точки малого порядка: Злоумышленник выбирает точку Q малого порядка на кривой или на twist кривой.
Отправка точки: Злоумышленник отправляет эту точку Q жертве, выдавая её за свой публичный ключ.
Вычисление общего секрета: Жертва вычисляет nQ , где n — секретный ключ жертвы.
Перебор вариантов: Поскольку Q имеет малый порядок, существует небольшое количество возможных значений для nQ . Злоумышленник может перебрать все эти значения и проверить, какое из них соответствует зашифрованным данным, раскрывая n по модулю порядка Q .
Всегда проверяйте, что входные точки действительно находятся на кривой ECC.
Используйте библиотеки, которые обеспечивают надежную проверку кривой и защиту от invalid curve attacks.
Small Subgroup Attack
Декодируем уязвимую RawTX транзакцию с помощью функции сервиса SMALL SUBGROUP ATTACK
Результат значение K секретного ключа Nonce в формате HEX
K = 6bd261bd25ac54807552dfeec6454d6719ec8a05cb11ad5171e1ad68abb0acb2
Для получение всех остальных значении из уязвимой RawTX транзакции воспользуемся сервисом RSZ Signature Decoder
Результат значении для R, S, Z в формате HEX
R = 5013dbed340fed00b6cb9778a713e1456b8138d00c3bcf6e7ff117be723335d0
S = 5018ddd352a6bc61b86afee5001a3e25d26a328a833c8f3812a15465f542c1c9
Z = 396ebf23dbcccce2a389ccb26198e25118bf7f72c38d2a4ab8d9e4648f2385f8
Для получение значении X приватного ключа из формулы: priv_key = ((((S * K) - Z) * modinv(R, N)) % N) воспользуемся программным обеспечением Dockeyhunt Private Key Calculator
В результате мы получаем значение X приватный ключ в формате HEX
X = 0x12d3428123e4262d6890e0ef149ce3c1335229b3f44ed6026bdec2921e796d34
Проверим полученный результат приватного ключа с помощью машинного обучения
Apply the SMALL SUBGROUP ATTACK function to extract the private key from a vulnerable RawTX transaction in the Bitcoin cryptocurrency
В конечном итоге модуль BitcoinChatGPT выдает ответ в файл: KEYFOUND.privkey сохранив приватный ключ в двух наиболее используемых форматах HEX & WIF
Для реализации кода установим пакет Bitcoin. Эта библиотека позволяет создавать кошельки, взаимодействовать с блокчейном, создавать и подписывать транзакции, а также работать с различными форматами адресов и приватных ключей криптовалюты Биткоин.
Запустим код для проверки соответствие Биткоин Адреса:
__________________________________________________ Private Key WIF: 12d3428123e4262d6890e0ef149ce3c1335229b3f44ed6026bdec2921e796d34 Bitcoin Address: 1GSrCrtjZ6nk3Yn2wuY2qyXo8qPLGgAMqQ total_received = 10.00000000 Bitcoin __________________________________________________
Все верно! Приватный ключ соответствует Биткоин Кошельку.
Откроем bitaddress и проверим:
ADDR: 1GSrCrtjZ6nk3Yn2wuY2qyXo8qPLGgAMqQ WIF: 5HxaSsQFK9TDeNfTnNyXAzHXZe3hq3UzZ977GzdjSwEVVeEcDmZ HEX: 12d3428123e4262d6890e0ef149ce3c1335229b3f44ed6026bdec2921e796d34
Итоги и шаги по уменьшению угрозы
В современной цифровой среде критически важным становится обеспечение безопасности устройств и сетей. Данная статья посвящена анализу ряда уязвимостей, обнаруженных в различных компонентах, включая устройства ESP32 и программное обеспечение для работы с криптовалютами, таким как Биткоин. Рассматриваются недостатки в коде проверки приватных ключей, методах хеширования транзакций, генерации случайных ключей, проверке точек на кривой ECC, восстановлении Y-координаты, а также в устаревших API хеширования.
Актуальность
В настоящее время миллиарды устройств могут оказаться уязвимыми из-за скрытых особенностей в архитектуре одного компонента, что обозначено как CVE-2025-27840. Обнаруженные уязвимости позволяют злоумышленникам подменять MAC-адреса, получать несанкционированный доступ к памяти устройства и проводить атаки через Bluetooth.
Уязвимости и их анализ
Уязвимость для получения приватного ключа в функции has_invalid_privkey: Отсутствие проверки нижней границы приватных ключей Биткоин позволяет использовать недействительные ключи (меньше или равные 0), что может привести к потере средств.
Уязвимость подделки подписей транзакции Биткоин в функции electrum_sig_hash: Использование нестандартного метода хеширования сообщений в Electrum делает её уязвимой для атак подделки подписи из-за несовместимости с BIP-137.
Уязвимость в функции random_key (Слабый PRNG в генерации ключей): Использование модуля random для создания ключей в сети Биткоин делает личные ключи предсказуемыми для злоумышленников, так как этот модуль не предназначен для криптографических целей.
Уязвимость в функции multiply (Отсутствие проверки точки на кривой ECC): Недостаточная проверка точек на кривой ECC может позволить злоумышленнику проводить invalid curve attacks, что может привести к поддельным подписям и манипуляциям в сети.
Уязвимость в функции ecdsa_raw_sign: Некорректное восстановление Y-координаты может привести к подмене публичного ключа в сети Биткоин.
Уязвимость в функции bin_ripemd160: Устаревшие API хеширования, особенно при отсутствии RIPEMD-160, могут быть уязвимы для атак, что подчеркивает важность использования актуальных криптографических библиотек и регулярных обновлений безопасности.
Преимущества выявления и устранения уязвимостей
Предотвращение финансовых потерь: Устранение уязвимостей, связанных с приватными ключами и подделкой подписей, помогает предотвратить потерю средств пользователей криптовалют.
Защита конфиденциальных данных: Устранение уязвимостей в устройствах ESP32 предотвращает несанкционированный доступ к памяти и подмену MAC-адресов, что защищает конфиденциальные данные пользователей.
Повышение безопасности сети: Устранение уязвимостей в криптографических функциях, таких как random_key и ecdsa_raw_sign, повышает общую безопасность сети Биткоин и предотвращает возможные атаки на транзакции и подписи.
Укрепление доверия пользователей: Своевременное выявление и устранение уязвимостей способствует укреплению доверия пользователей к устройствам и программному обеспечению, что особенно важно в сфере криптовалют и IoT.
Соблюдение стандартов безопасности: Регулярное обновление криптографических библиотек и API, а также следование современным стандартам безопасности помогает предотвратить использование устаревших и уязвимых компонентов.
Заключение
Выявление и анализ уязвимостей, представленные в данной статье, подчеркивают необходимость постоянного мониторинга и улучшения безопасности устройств и программного обеспечения. Устранение этих уязвимостей не только предотвращает возможные атаки и финансовые потери, но и способствует укреплению доверия пользователей и соблюдению стандартов безопасности.
References:
Данный материал создан для портала CRYPTO DEEP TECH для обеспечения финансовой безопасности данных и криптографии на эллиптических кривых secp256k1 против слабых подписей ECDSA в криптовалюте BITCOIN. Создатели программного обеспечения не несут ответственность за использование материалов.