Исследование уязвимости Signature Malleability и компрометации приватного ключа в подписи Bitcoin [Часть №1]
Данное исследование криптоанализа разделена на три части. В первой части статьи мы провели большое исследование уязвимости Signature Malleability, угрожающей безопасности популярных криптовалют, таких как Bitcoin и Ethereum. Во второй части статьи мы рассмотрели на реальном примере механизмы эксплуатации CVE-2024-42461 в библиотеке Elliptic для ECDSA, используя биткоин-кошелек 1LeEbwu667oPtQC5dKiGiysUjFM3mQaxpw, на котором были потеряны монеты на сумму 21.2529214 BTC, что на ноябрь 2024 года составляет 1,744,572.51 USD. В третьей части статьи мы рассмотрим методы поиска уязвимости Signature Malleability, как предотвращение угрозы для собственного криптовалютного кошелька Bitcoin и Ethereum мы можем воспользоваться и применить на примерах различных методов машинного обучение. Также мы воспользуемся списком из “Tutorials Power AI” широко применяемая категория искусственного интеллекта для введение бизнеса в различных сферах деятельности криптоанализа и крипографии в целом.
Уязвимость, известная как Signature Malleability, представляет собой серьезную угрозу для криптовалют Bitcoin и Ethereum, использующих алгоритм цифровой подписи на эллиптических кривых (ECDSA). Эта уязвимость позволяет злоумышленникам манипулировать подписями, создавая недействительные, но приемлемые для системы подписи. В данной статье рассматриваются механизмы эксплуатации этой уязвимости, ее последствия для безопасности криптовалют и предложенные меры по ее устранению. ECDSA (Elliptic Curve Digital Signature Algorithm) — это алгоритм, который широко используется для создания цифровых подписей транзакции перевода монет BTC или ETH в криптовалютах Bitcoin и Ethereum. Подпись состоит из двух компонентов: r и s, которые зависят от случайного одноразового номера k (NONCE) и приватного ключа x (PrivKey) подписанта.
Как возникает уязвимость Signature Malleability в транзакции Bitcoin?
Уязвимость Signature Malleability возникают из-за того, что существует возможность изменить значение s в подписи, сохраняя при этом действительность подписи. Это возможно благодаря тому, что для одной и той же подписи можно получить несколько эквивалентных значений (r,s′):
(где n — порядок группы эллиптической кривой secp256k1). Таким образом, злоумышленник может создать новую подпись, которая будет принята системой как действительная. Недостаточная проверка значений: Если значения r и s не проверяются на допустимые диапазоны (например, должны находиться в пределах от 1 до n−1), это может позволить злоумышленникам использовать некорректные значения для создания поддельных подписей.
CVE-2024-42461: Signature Malleability в библиотеке Elliptic для ECDSA
Одной из таких уязвимостей является CVE-2024-42461, обнаруженная в библиотеке Elliptic, используемой для реализации алгоритма цифровой подписи ECDSA (Elliptic Curve Digital Signature Algorithm). CVE-2024-42461 затрагивает версию 6.5.6 библиотеки Elliptic для Node.js и классифицируется как уязвимость низкой степени серьезности с оценкой CVSS 5.3. Проблема заключается в том, что библиотека допускает использование подписей, закодированных в формате BER (Basic Encoding Rules). Это создает возможность для злоумышленников изменять подписи без их аннулирования, что открывает путь для различных атак.
CVE-2024-42461 представляет собой уязвимость, обнаруженную в библиотеке Elliptic, используемой для реализации алгоритма цифровой подписи ECDSA (Elliptic Curve Digital Signature Algorithm) в Node.js. Эта уязвимость связана с Ricci Flow Hidden Number Problem (Ricci Flow HNP), что делает её особенно важной для безопасности криптографических приложений. Hidden Number Problem — это математическая задача, которая заключается в нахождении скрытого числа, использованного в процессе шифрования. В контексте ECDSA, если злоумышленник может решить HNP, это может привести к компрометации приватных ключей. Уязвимость CVE-2024-42461 позволяет потенциальному атакующему извлечь информацию о приватных ключах из подписей, что ставит под угрозу целостность цифровых подписей и аутентификацию пользователей. Данная уязвимость открывает широкий спектр атак, т.к. уязвимость может быть использована в различных атаках, включая атаки на аутентификацию и целостность данных. Это может вызвать серьезные проблемы для систем, полагающихся на ECDSA для обеспечения безопасности транзакций криптовалюты Биткоин и Эфириум.
Компрометация приватных ключей : Успешное решение Ricci Flow HNP может позволить злоумышленнику получить доступ к приватным ключам, что приведет к возможности подделки подписей транзакции Биткоин и Эфириум.
Ricci Flow HNP
Ricci Flow HNP (Ricci Flow Hidden Number Problem) стал ключевым инструментом в доказательстве таких теорем, как Thurston elliptization conjecture, Geometrization conjecture и Poincaré conjecture, которые касаются топологии многообразий. Гамильтон и позже Григорий Перельман использовали этот подход для получения глубоких результатов о структуре многообразий, это может означать использование потока для выявления и анализа скрытых геометрических характеристик многообразий, что позволяет делать выводы о их топологии и других свойствах.
Поток Риччи тесно связан с теорией кривизны, поскольку он использует тензор Риччи для описания изменений римановой метрики на многообразии.
Основные связи между потоком Риччи и кривизной
Тензор Риччи: Поток Риччи основан на тензоре Риччи, который является средним значением секционных кривизны. Он отражает, как изменяется форма многообразия в зависимости от его кривизны, где формулируется как задача нахождения скрытого числа, когда известны результаты функции, примененной к комбинациям этого числа с известными элементами. Это может быть полезно в контексте криптографии, особенно в системах с публичным ключом, где важно минимизировать утечку информации о приватных ключах
Динамика кривизны: В процессе потока Риччи метрика изменяется таким образом, что кривизна может увеличиваться или уменьшаться. Это позволяет анализировать, как геометрические свойства многообразия влияют на его топологию.
Сингулярности: Поток Риччи может приводить к сингулярностям — точкам, где кривизна становится бесконечной. Изучение этих сингулярностей имеет ключевое значение для понимания долгосрочного поведения потока и его применения в решении топологических задач, таких как гипотеза Пуанкаре.
Принцип максимума: Поток Риччи сохраняет положительность скалярной кривизны, что позволяет использовать принципы максимума для анализа геометрических свойств многообразий в процессе деформации.
В контексте эллиптических кривых, потоки Риччи могут быть использованы для анализа их геометрических свойств и понимания взаимосвязей между различными структурами на этих кривых. Индикатриса кривизны, или индикатриса Дюпена, строится в касательной плоскости в данной точке поверхности по следующему правилу. Координатные оси в касательной плоскости совмещают с главными направлениями. На луче, расположенном в каждом направлении, откладывают отрезок, равный величине, обратной квадратному корню из нормальной кривизны поверхности в этом направлении
Классификация точек поверхности
Существуют поверхности, состоящие из точек одного, двух или трех типов.
это квадратное уравнение может иметь один или два корня — асимптотических направления, или не иметь корней. Наличие корня поставляет обыкновенное дифференциальное уравнение первого порядка, указание точки поверхности задает начальные условия для его решения. Теорема существования и единственности решения задачи Коши для обыкновенного дифференциального уравнения первого порядка, доказываемая в курсах математического анализа, приводит к следующему геометрическому результату. На поверхности, состоящей из эллиптических точек, действительных асимптотических линий нет; на поверхности, состоящей из гиперболических точек, имеется асимптотическая сеть; на поверхности, состоящей из параболических точек, не являющихся точками уплощения, через каждую точку проходит единственная асимптотическая линия.
Оптимизация алгоритмов
Методы, разработанные в рамках теории потоков Риччи, могут быть адаптированы для оптимизации вычислений в эллиптической криптографии, особенно в контексте операций над точками на эллиптических кривых secp256k1. Таким образом, поток Риччи не только служит инструментом для изучения изменения метрик, но и предоставляет глубокую связь между геометрией и топологией через анализ кривизны. Возьмем к примеру числа «N» и «P» которые являются важными параметрами в контексте эллиптической криптографии, особенно в стандарте secp256k1, который широко используется в блокчейне и криптовалюте Bitcoin и Ethereum.
Значение числа N
N — это порядок группы точек на эллиптической кривой. Он определяет максимальное количество точек, которые могут быть использованы для генерации ключей в криптографических алгоритмах. В случае secp256k1, значение N равно:
N = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141
Это число также указывает на то, что при работе с этой кривой все операции должны выполняться в пределах этого порядка
Значение числа P
P — это характеристика самой эллиптической кривой, представляющая собой простое число, которое определяет поле, в котором происходит работа с точками на кривой. Значение P для secp256k1:
P = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
Это число задает размер поля, что важно для определения диапазона возможных значений координат точек на кривой.
Разница между N и P
Порядок группы (N): Определяет количество точек на кривой, которые могут быть использованы для криптографических операций.
Простое число (P): Определяет поле, в котором работает кривая. Это число важно для математических операций над точками на кривой.
Таким образом, хотя оба числа играют ключевую роль в обеспечении безопасности и функциональности криптографических систем, они выполняют разные функции: N — касается структуры группы точек, а P — структуры поля.
Вертикальное положение значение N и P
Python скрипт: value_n.py
Python скрипт: value_p.py
Как реализовать уязвимость Signature Malleability в транзакции Bitcoin?
Для реализации полноценной атаки на Биткоин, с использованием уязвимости Signature Malleability необходимо изменить эквивалентное значение (s′) как это показано во втором столбце таблицы компонентов значении (R, S, Z) цифровой подписи в ECDSA.
P = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
Для успешной атаки на Биткоин достаточно 32 транзакции подписи ECDSA, где изменив две начальные цифры HEX в эквивалентном значение (s′) мы выстраиваем таблицу для определения диапазона возможных значений координат точек на кривой, а также оптимизация математических алгоритмов разработанные в рамках теории потоков Риччи. Поскольку потоки Риччи тесно связаны с теорией кривизны, мы можем воспользоваться средним значением секционной кривизны и решить проблему скрытых чисел, где применяя полученные данные к 32 транзакциям Биткоина мы извлекаем из заданных значении (R, S, Z) начальные данные для секретных ключей: (k′) NONCE для 32 транзакции Биткоина и с помощью инструмента Ricci Flow HNP (Ricci Flow Hidden Number Problem) мы находим скрытое число: (x′) PrivKey — приватный ключ.
Значения R и S являются основными компонентами цифровой подписи в ECDSA
Значение R представляет собой координату точки на эллиптической кривой, которая получается в результате математических операций, связанных с приватным ключом и случайным числом (так называемым «криптографическим случайным числом»). Это значение обеспечивает уникальность подписи для каждого сообщения, даже если оно подписывается одним и тем же приватным ключом.
Значение S вычисляется на основе дайджеста сообщения (хеш-функции) и приватного ключа. Оно связано с тем, насколько успешно подпись подтверждает подлинность сообщения. Значение S также зависит от значения R и случайного числа.
Как формируются R и S (метод проверки подписи)
Процесс генерации значений R и S включает следующие шаги:
Генерация дайджеста сообщения: Сначала создается хеш сообщения с помощью алгоритма, например SHA-256.
Выбор случайного числа: Генерируется случайное число, которое используется для создания точки на эллиптической кривой.
Вычисление R: Используя это случайное число, вычисляется координата точки на кривой, которая становится значением R.
Вычисление S: Значение S рассчитывается с учетом дайджеста сообщения и приватного ключа.
При проверке подписи получатель использует значения R и S вместе с публичным ключом отправителя и дайджестом сообщения для подтверждения подлинности подписи. Если все вычисления подтверждают соответствие, это означает, что сообщение действительно было подписано владельцем соответствующего приватного ключа.
Как получить значение R, S, Z из RawTX (метод декодирование подписи)
RawTX (сырая транзакция) представляет собой закодированное представление транзакции Биткоина в шестнадцатеричном формате. Она содержит все данные, необходимые для выполнения транзакции Биткоина.
Извлечение R, S, Z:
Подпись в ECDSA состоит из двух компонентов: R и S. После декодирования RawTX найдите поле, содержащее подпись (обычно это часть входа транзакции).
Подпись будет представлена в виде DER—кодировки. Вам нужно будет извлечь значения R и S из этой подписи. Обычно они представлены как два целых числа, которые можно выделить с помощью десериализации.
Значение Z — это хэш сообщения, которое подписывается. Для получения Z вам нужно выполнить хэширование данных транзакции (обычно с использованием SHA-256), которые были подписаны.
Декодируем RawTX с помощью инструмента decoderaw
Откроем новый блокнот в Google Colab
Сommands:
cd Broadcast-Bitcoin-Transaction/
!python setup.py
Сommands:
cd decoderaw/
!chmod +x decoderaw
ls
!./decoderaw
Сommands:
!./decoderaw 01000000010dbc696374c8d7ca61f32710e03aaedcb7a4f2428074814d0e1f4f7f5c1e5935000000008b48304502210097255916a3cc4f69d4fa16f68219d0b1798d392fb0dce5fb0a358510df8cabe002201014656120e0a6e7c8c4a79ee22b3cdd4f55435e3e9bf3ab7287ae16858dd9d50141049b4069d8237fae8f2417c71c5512ec1b0547b5597474480cc28ea1bbfeecaab8b90fdec161ad6ef4378f274a60b900452431533596bf3bd23e01202ebf679461ffffffff01d2040000000000001976a914d77522a2b18e0064aba02ca7f864a5bb2299825988ac00000000
Result: 1111,0097255916a3cc4f69d4fa16f68219d0b1798d392fb0dce5fb0a358510df8cabe0,1014656120e0a6e7c8c4a79ee22b3cdd4f55435e3e9bf3ab7287ae16858dd9d5,931a52e8610cf87b6d00875f687042224c305865fd20ecb15ef76b1277ba10fd,0000
Практическая часть
Из теории уязвимость CVE-2024-42461 известно, что злоумышленники могут использовать некорректные значения для создания поддельных подписей транзакции. Перейдем к практической части статьи и рассмотрим пример с использованием Биткоин кошелька: 1LeEbwu667oPtQC5dKiGiysUjFM3mQaxpw , где были потерянный монеты на сумму: 21.2529214 BTC на ноябрь 2024 года эта сумма составляет: 1744572,51 USD
Решение дифференциального уравнения
Решения дифференциальных уравнений помогают моделировать различные процессы, данная формула позволяет нам понять и предсказать поведение различных систем в зависимости от изменения переменных.
Общее решение дифференциального уравнения, где функция y зависит от переменной x.
Исходное уравнение:
Левую часть уравнения можно интерпретировать как производную функции y по x, которая равна произведению двух функций: g(y), зависящей от y, и h(x), зависящей от x.
Переписывание уравнения:
Уравнение можно переписать в форме, которая отделяет переменные:
После разделения переменных, мы можем в точности интегрировать обе стороны:
Левую сторону относительно y:
Правую сторону относительно x:
Исследуем взаимосвязь между переменными через интеграцию [ frac{dy}{dx} = g(y)h(x) quad Rightarrow quad frac{1}{g(y)} dy = h(x) dx ] и применим инструмент для математического анализа и решения дифференциальных уравнений.
Пример №1 с использованием инструмента DarkSignature:
Перейдем обратно в корневой каталог репозитории Broadcast Bitcoin Transaction
Сommands:
cd - ls
Сommands:
cd darksignature/
!chmod +x darksignature
ls
!./darksignature
Для получение публичного ключа к Биткоин Адресу 1LeEbwu667oPtQC5dKiGiysUjFM3mQaxpw выбираем команду:
darksignature -address <Bitcoin Address>
Вводим Биткоин адрес и получаем публичный ключ:
!./darksignature -address 1LeEbwu667oPtQC5dKiGiysUjFM3mQaxpw
Результат:
pubkey: (HEX) = 049b4069d8237fae8f2417c71c5512ec1b0547b5597474480cc28ea1bbfeecaab8b90fdec161ad6ef4378f274a60b900452431533596bf3bd23e01202ebf679461
Пример №2 с использованием инструмента Dockeyhunt Lattice Attack:
Запускаем программное обеспечение Dockeyhunt Lattice Attack и в поле "Input date" вводим Биткоин Адрес 1LeEbwu667oPtQC5dKiGiysUjFM3mQaxpw и получаем публичный ключ кошелька:
049b4069d8237fae8f2417c71c5512ec1b0547b5597474480cc28ea1bbfeecaab8b90fdec161ad6ef4378f274a60b900452431533596bf3bd23e01202ebf679461
Воспользуемся инструментом DarkSignature чтобы получить поддельные данные значение R, S, Z для транзакции алгоритма ECDSA. В поле "Input date" вводим публичный ключ Биткоин Адреса 049b4069d8237fae8f2417c71c5512ec1b0547b5597474480cc28ea1bbfeecaab8b90fdec161ad6ef4378f274a60b900452431533596bf3bd23e01202ebf679461 и получаем данные значение R, S, Z в количестве будет составлять 32 транзакции Биткоина.
Применим получение поддельные данные значение R, S, Z для транзакции алгоритма ECDSA в Google Colab
Установим модуль ECDSA:
pip install ecdsa
Для получение координат (Gx, Gy) для публичного ключа воспользуемся Python-скриптом: darksignature/coordinates.py
Воспользуемся командой darksignature -pubkey <Gx Gy>
Запускаем код Python-скрипта: darksignature/transactions.py и получаем данные значение R, S, Z в количестве будет составлять 32 транзакции Биткоина.
После генерации мы получаем файл: SignatureRSZ.txt
Также в корневом каталоге: c:\PerelmanWork\Dockeyhunt Lattice Attack\ мы получаем файл: Signatures.txt