Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
Digital-Signature-Forgery-Attack — CVE-2025-29774漏洞与SIGHASH_SINGLE缺陷如何通过伪造RawTX威胁多重签名钱包的操作方法 | Kitploit
工具/GitHubGitHub/demining/digital-signature-forgery-attack
漏洞分析漏洞利用密码学CTF学习与教育精选资源
GitHubdemining/digital-signature-forgery-attack

Digital-Signature-Forgery-Attack

CVE-2025-29774漏洞与SIGHASH_SINGLE缺陷如何通过伪造RawTX威胁多重签名钱包的操作方法

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
查看仓库
网站
41年前尚未审核
数字签名伪造攻击:CVE-2025-29774 漏洞与 SIGHASH_SINGLE 错误如何通过虚假 RawTX 威胁多重签名钱包操作方法

在本文中,我们将探讨数字签名伪造攻击(Digital Signature Forgery Attack)的密码学原理,其后果对比特币网络中的交易安全构成威胁,因为数字签名用于确认加密货币转账的所有权和授权。我们将根据现代研究和已识别的漏洞,分析此类攻击对比特币的影响示例。

数字签名伪造攻击(Digital Signature Forgery Attack)是指攻击者试图创建一个被比特币网络视为有效的虚假 ECDSA 数字签名。这种攻击允许在不知道所有者私钥的情况下授权交易,从而危及 BTC 币持有者加密钱包中资金的安全。


  • 教程:https://youtu.be/qbu1m_C1wyA
  • 教程:https://cryptodeeptech.ru/digital-signature-forgery-attack
  • 教程:https://dzen.ru/video/watch/68801dfc0c886621f7c1a0db
  • Google Colab:https://colab.research.google.com/drive/1TKrJ0bKsNgc72H9UvzpCnh2YPmRsyPdW

在密码学中,数字签名用于确认消息或交易的真实性。签名伪造意味着可以创建一个被系统视为有效的“RawTX”对,尽管实际上它并非由私钥持有者创建。这为欺诈、资金盗窃以及破坏区块链完整性打开了大门。数字签名伪造攻击(DSFA)作为一种密码学攻击,在软件组件中实现,这些组件使用 xml-crypto 库在 Node.js 平台上验证 XML 文档的签名。


数字签名伪造攻击:CVE-2025-29774 漏洞与 SIGHASH_SINGLE 错误如何通过虚假 RawTX 威胁多重签名钱包操作方法

https://youtu.be/qbu1m_C1wyA


首先,这涉及到企业集成解决方案、云服务和单点登录系统,例如 IBM App Connect Enterprise Certified Container 以及其他依赖 xml-crypto 进行 SAML 认证和授权的应用程序。硬件漏洞不与特定物理设备相关,而是在使用易受攻击库的软件产品中实现。

漏洞 CVE-2025-29774 和 CVE-2025-29775,称为数字签名伪造攻击,在  xml-crypto 软件库中实现,该库是一个用于在 Node.js 平台上对 XML 文档进行数字签名和加密的库。


数字签名伪造攻击:CVE-2025-29774 漏洞与 SIGHASH_SINGLE 错误如何通过虚假 RawTX 威胁多重签名钱包操作方法安全公告:IBM App Connect Enterprise Certified Container 操作数易受 XML 数据签名验证绕过漏洞影响 [CVE-2025-29774] [CVE-2025-29775]
  • IBM App Connect Enterprise Certified Container  是一种数据集成和处理软件,使用 xml-crypto 验证 XML 文档签名。这些漏洞允许绕过数字签名验证,从而导致能够伪造和修改签名消息,包括用于认证和授权的 SAML 响应。
  • 使用 Node.js 和 xml-crypto 库的系统和应用程序  ,用于验证签名的 XML 消息,特别是在 SAML 认证上下文中(例如,企业门户、单点登录系统、云服务)。该漏洞允许攻击者修改有效的签名 XML 消息,使其通过签名验证,从而导致认证和授权绕过、权限提升以及凭据伪造。

数字签名伪造攻击:CVE-2025-29774 漏洞与 SIGHASH_SINGLE 错误如何通过虚假 RawTX 威胁多重签名钱包操作方法CVE-2025-29774 和 CVE-2025-29775(SAMLStorm)的披露。
  • 这些漏洞与 xml-crypto 中不正确的密码签名验证有关,特别是对 DigestValue 节点的处理,攻击者可以在不破坏签名验证的情况下插入 XML 注释。
  • 这允许修改签名 XML 文档中的关键标识和访问控制属性,从而能够在不需要凭据或访问权限的情况下绕过安全机制。

因此,此代码实现了各种方案(RSA 与不同 SHA 哈希以及 HMAC-SHA1)的密码签名和签名验证算法,使其能够集成到需要数据数字签名的系统中。


signature-algorithms.ts 代码中的严重漏洞

数字签名伪造攻击:CVE-2025-29774 漏洞与 SIGHASH_SINGLE 错误如何通过虚假 RawTX 威胁多重签名钱包操作方法

signature-algorithms.ts 代码用于安全地创建和验证数字签名,确保数据的真实性和完整性。ECDSA 签名使用私钥提供作者验证,而 HMAC 使用密钥提供完整性和真实性验证。所使用的算法符合 XML 数字签名标准(算法 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  – 使用基于 SHA-1 的 HMAC 签名。

技术细节

  • 对于 RSA 签名,使用类  crypto.createSign 和  crypto.createVerify 以及相应的算法(“RSA-SHA1”、“RSA-SHA256”、“RSA-SHA512”)。
  • 对于 HMAC 签名,使用  crypto.createHmac 和“SHA1”算法。
  • 签名编码为 base64 以便于传输和存储。
  • 方法被包装在函数  createOptionalCallbackFunction 中,这大概允许它们与回调和 Promise 一起使用(代码中未给出详细信息)。

密码签名中使用 RSA-SHA1 算法存在与 SHA-1 哈希碰撞相关的漏洞。如果攻击者控制部分被签名数据,则允许其创建两个具有相同签名的不同消息。


具体来说,问题在于类 RsaSha1:

root@kitploit:~
const signer = crypto.createSign("RSA-SHA1");  // 易受攻击的行

数字签名伪造攻击:CVE-2025-29774 漏洞与 SIGHASH_SINGLE 错误如何通过虚假 RawTX 威胁多重签名钱包操作方法signature-algorithms.ts#L7

第二个漏洞同样出现在类 RsaSha1 中:

root@kitploit:~
const verifier = crypto.createVerify("RSA-SHA1");  // 易受攻击的行

数字签名伪造攻击:CVE-2025-29774 漏洞与 SIGHASH_SINGLE 错误如何通过虚假 RawTX 威胁多重签名钱包操作方法signature-algorithms.ts#L17

为什么这个严重的碰撞攻击允许创建具有相同哈希的不同数据?

  1. SHA-1 碰撞:SHA-1 算法已不再被认为是安全的。
  2. RSA 上下文:当与 RSA 结合时,这可能导致在不可信数据(例如证书或文档)上伪造签名。
  3. 建议:NIST 和安全社区建议使用 SHA-256/SHA-512 而非 SHA-1。

额外说明:

  • (HMAC-SHA1)类 HmacSha1不太容易受到攻击,但也已过时。HMAC 比“裸”SHA-1 更能抵抗碰撞,但首选切换到 SHA-256。
  • 代码包含现代实现(RsaSha256/RsaSha512),应使用它们代替 RsaSha1。

数字签名伪造攻击:CVE-2025-29774 漏洞与 SIGHASH_SINGLE 错误如何通过虚假 RawTX 威胁多重签名钱包操作方法

CVE-2025-29774 和 CVE-2025-29775 是 Node.js 的 xml-crypto 库中的严重漏洞,与 XML 文档中数字签名的不正确验证有关。这两个漏洞都允许攻击者修改签名的 XML 消息,而不会被签名验证发现。


数字签名伪造攻击机制

1. RSA-SHA1 算法中的漏洞

在提供的 代码 中,类 RsaSha1 使用了过时的 RSA-SHA1 算法进行签名和验证:

root@kitploit:~
const signer = crypto.createSign("RSA-SHA1");  // 易受攻击的行 №7
const verifier = crypto.createVerify("RSA-SHA1");  // 易受攻击的行 №17

SHA1 被认为在密码学上是不安全的,主要问题在于 库处理 XML 结构的逻辑:

  • 创建签名时,XML 文档经历一个 规范化 步骤(使其成为标准形式,例如删除空格和注释)。
  • 验证签名时,库 不考虑文档规范化版本和未规范化版本之间的差异。这允许攻击者修改文档(例如添加注释或更改结构)而不破坏签名。

2. 操作示例

  1. 修改 SignedInfo:
    • 攻击者在 XML 文档中添加额外的节点 <SignedInfo>,这导致验证期间哈希计算不正确。
    xml<Signature> <SignedInfo>...</SignedInfo> <!-- 原始节点 --> <SignedInfo>...</SignedInfo> <!-- 由攻击者添加 --> </Signature>
  2. 使用弱算法:
    • SHA1 算法容易受到碰撞攻击,使得为修改后的文档创建虚假签名变得容易。

3. 后果

  • 绕过认证:修改 SAML 令牌或其他与访问相关的 XML 文档中的属性。
  • 权限提升:在授权系统中将用户 ID 替换为管理员。
  • 大规模攻击:该漏洞可远程利用,无需用户交互(CVSS 9.3)。

数字签名伪造攻击:CVE-2025-29774漏洞和SIGHASH_SINGLE漏洞如何威胁多重签名钱包的操作方法(使用假RawTX)

漏洞技术细节:

CVE-2025-29774

  • 问题:签名验证期间对XML文档结构验证不足。
  • 利用方法:向文档签名部分添加额外节点或属性。

CVE-2025-29775

  • 问题:计算哈希时使用了不正确的规范化上下文。
  • 利用方法:签名后对未规范化形式的文档进行修改。

故障排除建议

  1. 库更新:
    • 对于版本 2.x → 2.1.6,3.x → 3.2.1,6.x → 6.0.1。
  2. 算法替换:typescript // Usage SHA-256 / SHA-1 const signer = crypto.createSign("RSA-SHA256");
  3. 验证XML结构:
    • 检查签名中是否恰好有一个节点 <SignedInfo>。

解决这些漏洞对于使用XML签名进行身份验证的系统(如SAML、SOAP)至关重要。


数字签名伪造攻击:CVE-2025-29774漏洞和SIGHASH_SINGLE漏洞如何威胁多重签名钱包的操作方法(使用假RawTX)

xml-crypto 库被广泛用于验证XML消息中的数字签名,包括SAML、SOAP等协议。因此,该漏洞可能影响:

  • 使用xml-crypto进行XML签名的软件和服务,包括企业集成平台和中间件(如IBM App Connect Enterprise,这些漏洞已在其中报告)。
  • 使用XML签名进行身份验证和授权的设备和系统,包括支持SAML的服务器和网关。

  • 漏洞CVE-2025-29774和CVE-2025-29775主要影响使用xml-crypto库处理XML签名的软件组件和平台。
  • 已知受害者包括IBM App Connect Enterprise以及可能其他使用xml-crypto的基于Node.js的企业解决方案。
  • 目前尚无关于受这些攻击影响的特定硬件设备品牌的公开数据。

要评估特定设备的风险,建议检查它们是否使用易受攻击版本的xml-crypto或依赖类似的XML签名机制。对于基于Node.js的加密货币钱包,IBM提供单独的解决方案,如IBM Secure Bitcoin Wallet,这是一个基于Electrum比特币客户端、使用Node.js与比特币网络交互和管理钱包的应用程序。

在该解决方案中,私钥和钱包可以使用IBM Cloud Hyper Protect Crypto Services (zHSM)进行存储和加密,该服务提供基于硬件的安全密钥存储。比特币钱包私钥的生成通常在专门的加密库中实现,如Electrum、bitcoinjs-lib等,这些库可以集成到Node.js应用程序中。IBM Secure Bitcoin Wallet使用基于Node.js的修改版Electrum后端进行密钥和交易管理,通过集成IBM Cloud Hyper Protect Crypto Services提供硬件加密和私钥安全存储。


实际部分

从漏洞CVE-2025-29775的理论可知,攻击者可以利用未更新的xml-crypto库处理不正确的交易值。让我们进入文章的实际部分,以比特币钱包为例:32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe,其中丢失了0.059672 BTC,截至2025年7月,该金额约为7,052 USD。


数字签名伪造攻击:CVE-2025-29774漏洞和SIGHASH_SINGLE漏洞如何威胁多重签名钱包的操作方法(使用假RawTX)791fe035d312dcf9196b48649a5c9a027198f623c0a5f5bd4cc311b8864dd0cf

让我们考虑Raw transaction格式:包含所有交易信息的二进制和十六进制数据。它用于在低层传输、验证或创建交易,是整个比特币网络运行的基础。普通用户很少直接接触Raw transactions,但对于开发者和加密爱好者来说,这是完全控制比特币网络所有交易的主要工具。


数字签名伪造攻击:CVE-2025-29774漏洞和SIGHASH_SINGLE漏洞如何威胁多重签名钱包的操作方法(使用假RawTX)Raw Transaction

为了在比特币网络中完全找回UTXO对象,我们将使用Dark AI工具。UTXO是区块链数据结构的主要部分,代表可由私钥持有者(控制该比特币地址)花费的BTC币数量。每个UTXO是特定过去交易的输出,且从未在后续交易中用作输入。

数字签名伪造攻击:CVE-2025-29774漏洞和SIGHASH_SINGLE漏洞如何威胁多重签名钱包的操作方法(使用假RawTX)

Google Colab

私钥调试:私钥生成不正确、系统漏洞以及椭圆曲线secp256k1顺序计算中的错误对比特币生态系统的威胁

https://colab.research.google.com/drive/1TKrJ0bKsNgc72H9UvzpCnh2YPmRsyPdW


1. 下载并安装Dark AI工具

所有终端命令和操作的详细描述

命令:

root@kitploit:~
!wget https://darkai.ru/repositories/neuralnet_tools.zip
  • wget — 用于通过HTTP、HTTPS和FTP协议从网络下载文件的命令行工具。
  • 我们通过指定URL下载neuralnet_tools.zip归档文件。
  • unzip — 解压当前目录中ZIP归档的命令。

此命令解压neuralnet_tools.zip中的所有文件。

root@kitploit:~
!unzip neuralnet_tools.zip

数字签名伪造攻击:CVE-2025-29774漏洞和SIGHASH_SINGLE漏洞如何威胁多重签名钱包的操作方法(使用假RawTX)

让我们运行ls命令以便快速查看。

ls


数字签名伪造攻击:CVE-2025-29774漏洞和SIGHASH_SINGLE漏洞如何威胁多重签名钱包的操作方法(使用假RawTX)

2. 启动Dark AI工具

root@kitploit:~
!./darkai
数字签名伪造攻击:CVE-2025-29774漏洞和SIGHASH_SINGLE漏洞如何威胁多重签名钱包的操作方法(使用假RawTX)

让我们运行命令获取指定比特币地址的所谓未花费交易输出(UTXO,解码:Unspent Transaction Output)信息。这些信息对于评估地址余额和进行新交易的可能性至关重要。

root@kitploit:~
!./darkai -bitcoinaddress 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe

结果返回了两个UTXO对象:

root@kitploit:~
[
{'output': '8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd:0', 'value': 677200},
{'output': 'bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786:0', 'value': 5000000}
]

每个UTXO包含:

  • output — 输出标识符。格式:<txid>:<n>,其中<txid>是唯一的交易哈希,<n>是该交易输出列表中的输出编号。
  • value — 以聪为单位的金额(1比特币 = 100,000,000聪)。

数据解码:

  1. 第一个UTXO
    • 输出:8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd:0
    • 金额:677,200聪
  2. 第二个UTXO
    • 输出:bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786:0
    • 金额:5,000,000聪

总余额

地址的可用总余额等于所有找到的UTXO之和:

  • 677 200 + 5 000 000 = 5 677 200聪
  • 换算为比特币:5,677,200/100,000,000 = 0.05677200 BTC
数字签名伪造攻击:CVE-2025-29774漏洞和SIGHASH_SINGLE漏洞如何威胁多重签名钱包的操作方法(使用假RawTX)

使用Dark AI进行技术解读

我们使用解读过程来处理未更新的xml-crypto库,以创建无效的交易值并发送大额金额,Dark AI算法将选择使用哪个UTXO(或组合两者)。

  • 发送资金:所有指定的UTXO都可以用作新交易形成的输入,从而允许你花费全部或部分余额。
  • 透明度:此报告确认该地址包含真实的比特币资金,可用于验证真实性和偿付能力。

比特币地址32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe有两个活跃的UTXO,共计0.05677200 BTC。这些资金可用于进行新交易;两个输出均被视为已确认且未花费。


数字签名伪造攻击:CVE-2025-29774漏洞和SIGHASH_SINGLE漏洞如何威胁多重签名钱包的操作方法(使用假RawTX)

比特币交易的反序列化

要获取比特币交易输出的信息片段,请使用以下命令,其中交易的第一个输出(outs)具有唯一标识符8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd


root@kitploit:~
!./darkai -deserialize 8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd

我们得到反序列化结果响应的结构:

root@kitploit:~
{'value': 677200, 'script': 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'}
  • value: 677200 — 此输出的金额以聪(satoshis)表示(1 BTC = 100,000,000 聪)。
  • script: a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287 — 定义了使用此输出条件的脚本。

元素详细说明:Value字段

  • value: 677,200 聪。
  • 如果满足脚本的条件,此金额可以在创建相应交易时使用。
  • 等价换算: 677,200 / 100,000,000 = 0.00677200 BTC。
数字签名伪造攻击:CVE-2025-29774 漏洞和 SIGHASH_SINGLE 缺陷如何威胁多签名钱包的伪造 RawTX 操作方法

元素详细说明:Script字段

  • 脚本含义: a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287
  • 这是一个**“scriptPubKey”类型的脚本** – 交易输出结构的一部分,用于指定谁可以花费这些资金。最重要的目的是确保资金处置的安全性和控制权。

解码脚本

  • 脚本以前缀 a914...87 开头,对应于 P2SH(Pay to Script Hash) 格式:
    • a9— OP_HASH160 (哈希操作符)
    • 14— 下一个值的长度 (20字节 = 40个十六进制字符)
    • 06612b7cb2027e80ec340f9e02ffe4a9a59ba762— Bitcoin 钱包地址本身的 hash160,BTC 币存储在其中。
    • 87— OP_EQUAL (一种基本的比特币脚本命令操作符,用于比较两段数据以验证其一致性)
  • 这意味着接收方必须提供一个脚本,其哈希值与提供的值匹配,并为该脚本提供有效的签名,才能使用这些资金。

结果的实际意义

  • 指定交易的此输出包含 677,200 聪(0.00677200 BTC),由 P2SH 类型脚本保护。
  • 要花掉此输出的资金,需要知道原始脚本并提供正确的签名——这是多签名钱包、智能合约和其他高级安全方案的典型情况。
  • 此信息对于分析交易结构、验证资金用途以及理解后续使用要求很重要。

通过标识符反序列化交易

通过标识符 8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd 反序列化交易的结果中,获得了第一个输出,包含 677,200 聪(0.00677200 BTC),由 P2SH 脚本保护。要管理这些资金,需要出示目标脚本并正确签署满足指定哈希条件的解锁交易。


数字签名伪造攻击:CVE-2025-29774 漏洞和 SIGHASH_SINGLE 缺陷如何威胁多签名钱包的伪造 RawTX 操作方法

第二个比特币交易的反序列化

要获取比特币交易原始数据(output)的输出信息片段,请应用以下命令,其中唯一标识符 bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786 的交易的第一个输出(outs)

root@kitploit:~
!./darkai -deserialize bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786

通过解释过程,借助 Dark AI 使用反序列化函数,我们随后获得了标识符为 bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786 的第二个交易第一个输出元素(output)的结构信息。



结果:

root@kitploit:~
{'value': 5000000, 'script': 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'}

1. 元素详细说明:Value字段

  • 内容: 5000000
  • 此值以聪(satoshis)表示,比特币最小的不可分割单位;1 BTC = 100,000,000 聪。
  • 用途:
    此金额与指定在 'outs' 数组元素中的特定交易输出相关联。只有在满足 'script' 字段中定义的脚本条件时,才能使用此金额。
  • 比特币换算: 5,000,000 聪 = 0.05 BTC
数字签名伪造攻击:CVE-2025-29774 漏洞和 SIGHASH_SINGLE 缺陷如何威胁多签名钱包的伪造 RawTX 操作方法

2. 元素详细说明:Script字段

  • 内容: 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'
  • 这就是所谓的 锁定脚本,或者换句话说,scriptPubKey – 一个指定此输出使用条件的脚本。

解码脚本

指定值对应于比特币网络中的标准脚本类型:

  • a9— 操作码 OP_HASH160(对下一行数据进行 SHA-256 然后 RIPEMD-160 操作)。
  • 14— 后续字段长度:20 字节(40 个十六进制字符)。
  • 06612b7cb2027e80ec340f9e02ffe4a9a59ba762— 一个 20 字节的哈希,标识比特币钱包地址或脚本。
  • 87— 操作码 OP_EQUAL。

合在一起,此条目表示 P2SH 地址(Pay-to-Script-Hash)。在这种情况下,资金被分配给某个脚本组合,要提取它们,需要公开其哈希记录在此处的脚本,并出示满足该脚本条件的签名(或其他数据)。


此方案最常见的用途包括多签名、简单和复杂智能合约、双边多签名、有条件的安全方案以及其他高级场景。


3. 结果的实际意义:资金规模与用途。

  1. 所讨论的交易(哈希值 bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786)有一个输出,其中 0.05 BTC(5,000,000 聪)“锁定”在与哈希 06612b7cb2027e80ec340f9e02ffe4a9a59ba762 对应的 P2SH 地址中。
  2. 使用条件:
    要在形成使用交易时使用这些资金,不仅需要像直接转账那样出示标准签名,还需要出示脚本本身(其哈希嵌入此输出中),再加上满足脚本条件的数据 (例如,一组数字签名)。
  3. 安全性和灵活性:
    此方法允许实现比直接发送到普通比特币地址更复杂的逻辑。

4. 输出注册以达到与支持 P2SH 的各种服务和钱包的兼容性。

  • 交易 ID
    bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786
    包含一个输出,其中
    0.05 BTC (5,000,000 聪)
    被安全锁定到 P2SH 脚本(Pay-to-Script-Hash)中,其哈希为
    06612b7cb2027e80ec340f9e02ffe4a9a59ba762。
  • 要使用这些资金,必须公开原始脚本并满足其条件(例如,在多签名中出示所有签名)。

因此,反序列化结果报告了在条件性(P2SH)地址中存在一定数量的比特币,并定义了严格的支出规则,这在比特币网络中的资金管理和核算中起关键作用。


数字签名伪造攻击:CVE-2025-29774 漏洞和 SIGHASH_SINGLE 缺陷如何威胁多签名钱包的伪造 RawTX 操作方法

比特币网络中 P2SH(Pay-to-Script-Hash)锁定脚本。此脚本有何含义?

脚本 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287' 被选择并用于此交易输出,因为它代表了比特币网络中典型的 P2SH(Pay-to-Script-Hash) 锁定脚本。


让我们逐部分分析:

  • a9— OP_HASH160:一种哈希操作,先对后续数据应用 SHA-256,然后应用 RIPEMD-160。
  • 14— 哈希长度为 20 字节(十六进制格式)。
  • 06612b7cb2027e80ec340f9e02ffe4a9a59ba762— 脚本的 20 字节哈希,称为 脚本哈希。
  • 87— OP_EQUAL:检查栈上两个值是否相等的操作符。

因此,此脚本要求在使用时(花费资金)出示一个哈希值与 06612b7cb2027e80ec340f9e02ffe4a9a59ba762 匹配的脚本,并满足该脚本的条件。


为什么选择此特定脚本?

  • 便利性和安全性: P2SH 允许将复杂的资金管理逻辑(例如多签名或条件支付)隐藏在哈希中,从而为发送方和接收方简化界面。
  • 行业标准: P2SH 已成为广泛接受的标准,因为它简化了复杂安全方案的设置,并与大多数钱包和服务兼容。
  • 紧凑性: 区块只存储复杂脚本的哈希,而不是整个脚本——这节省了空间并提高了效率。
  • 灵活性: 资金所有者可以创建任意的支出条件——例如要求多签名、时间延迟或其他规则——这些条件的哈希就存储在这里。

脚本 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'是一个 P2SH 锁定脚本,它表明要花费 0.05 BTC,需要提供具有哈希 06612b7cb2027e80ec340f9e02ffe4a9a59ba762 的原始脚本,并满足其中指定的条件。这在便利性、安全性和功能性之间取得了平衡——这也是在此交易中选择此特定脚本的主要原因。P2SH 脚本中的哈希 06612b7cb2027e80ec340f9e02ffe4a9a59ba762 是原始脚本(redeem script)特定哈希的结果,该脚本定义了从此输出花费资金的条件。


为什么是这个哈希而不是其他?

  1. 哈希是定义支出规则的脚本的数字指纹。
    创建 P2SH 地址或输出时,首先显式编写脚本(比特币的支出条件),然后应用两个哈希算法:
    • 对脚本进行 SHA-256,
    • 然后对 SHA-256 的结果进行 RIPEMD-160。
      生成的 20 字节哈希是 06612b7cb2027e80ec340f9e02ffe4a9a59ba762。此哈希唯一标识生成它的确切脚本。
  2. 唯一性和不可变性
    加密哈希函数具有“雪崩效应”特性,即对原始脚本进行哪怕是最小的更改,也会生成完全不同的哈希。因此,此哈希在原始脚本的上下文中是唯一且不可伪造的。
  3. 使用哈希的目的是确保紧凑性和安全性。
    与其在每个输出中存储完整脚本(可能很复杂且占用大量空间),不如只在区块中存储其哈希。这节省了空间并提高了隐私性——脚本本身只在花费资金时公开,并且只对满足条件的人公开。
  4. 哈希选择是地址或钱包创建者定义的特定脚本的结果。
    开发者或资金所有者创建具有所需条件的脚本(例如多签名、时间延迟、其他逻辑条件)。指定的脚本被哈希,并将此哈希绑定到交易输出。因此,没有任意的哈希选择——它由原始脚本的内容和加密算法决定。

  • 此哈希严格与地址所有者安装的用于保护其资金的特定脚本相关联。
  • 它是通过加密哈希函数(SHA-256 + RIPEMD-160)从原始赎回脚本(redeem script)生成的,因此不可能随机或任意选择不同的哈希。
  • 此哈希是唯一支出条件组合的反映,这就是为什么它最终出现在交易输出脚本 a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287 中。

因此,选择此特定哈希是由输出与特定支出条件的准确和安全链接的需求决定的,这些条件控制着区块链中资金的使用权限。所有这些都通过加密哈希函数的特性、其唯一性以及无法逆向恢复原始数据来保证。


P2SH 机制:在比特币网络中的意义、工作原理和安全性

比特币开发者已将 P2SH(Pay-to-Script-Hash) 机制写入代码,作为一项关键创新,确保安全并扩展区块链网络的能力。我们来考虑该脚本的结构和工作原理、它与经典交易的区别,以及选择这种存储和保护数字资产方法的原因。

传统上,比特币交易使用 Pay-to-Pubkey-Hash (P2PKH) 方案运作——资金通过接收者的公钥哈希“锁定”。要花费这些资金,用户必须提供其数字签名和公钥,由网络进行验证。

然而,除 P2PKH 之外,接口是有限的,因为比特币脚本允许更复杂的支出条件,从多重签名到时间锁以及其他智能合约协议。问题在于,冗长且复杂的脚本不可避免地增加了交易大小,降低了可用性。


正是为了简化与这些复杂场景的交互,P2SH 概念于 2012 年引入,由 Gavin Andresen 在 BIP 16 中标准化。P2SH 的本质在于将 scriptPubKey 中完整的支出条件脚本替换为其 加密哈希 ——即所谓的脚本哈希。


数字签名伪造攻击:CVE-2025-29774 漏洞与 SIGHASH_SINGLE 漏洞如何通过虚假 RawTX 威胁多重签名钱包的操作方法


P2SH 输出脚本结构如何工作?

我们来看反序列化后指定的脚本:

root@kitploit:~
OP_HASH160 06612b7cb2027e80ec340f9e02ffe4a9a59ba762 OP_EQUAL

该脚本与标准 P2PKH 的不同之处在于,它不存储公钥哈希,而是存储 redeemScript 的哈希——一组资金可被花费的条件。

  • OP_HASH160 – 对数据(此处为 redeemScript)先使用 SHA-256 算法哈希,再使用 RIPEMD-160 哈希。
  • 06612b7cb2027e80ec340f9e02ffe4a9a59ba762 — 20 字节的 redeemScript 哈希。
  • OP_EQUAL – 检查提供的 redeemScript 是否与此哈希相等。

通过 P2SH 输出花费资金的过程

要花费此类资金,需要在引用此输出的交易输入(scriptSig)中传输:

  1. 序列化的 redeemScript – 其条件编码在哈希中的原始脚本。
  2. 解锁数据 – 满足 redeemScript 条件的签名或其他证据。

处理交易时,网络节点:

  • 哈希 redeemScript 并将其与输出中指定的哈希进行比较。
  • 如果哈希匹配(即 OP_EQUAL 返回 true),则反序列化并执行 redeemScript。
  • 如果 redeemScript 正确执行,即满足所有支出条件,则交易被视为有效。

因此,P2SH 将呈现和验证支出条件的责任从发送者(创建所需脚本)转移到花费者。


选择此种机制的优势与重要性

1. 灵活性与复杂场景

P2SH 允许创建具有任意、通常多级条件的地址——例如,多重签名要求(2/3、3/5 等)、时间限制、分配逻辑等。此时,发送者只需将资金发送到紧凑的哈希地址,无需了解技术细节。


2. 节省空间

无需在区块链中存储完整脚本,交易中仅存储其哈希。这减轻了网络负担,减小了区块大小,并加快了交易验证速度。


3. 增强安全性

由于 redeemScript 仅在花费时才会揭示和验证,增加了条件的机密性,使得未经授权的访问尝试更加困难。使用加密哈希函数保证了对伪造和篡改的保护——脚本的任何微小偏差都会导致不同的哈希,网络将拒绝接受该交易。


4. 对用户和程序员的便利性

P2SH 标准化并简化了比特币中复杂智能合约的使用,简化了集成,提高了与各种钱包和服务的兼容性。


使用示例:多重签名钱包

一个经典示例是需要五个参与者中两个签名才能完成交易的钱包。使用 P2SH:

  • 输出包含相应脚本的哈希。
  • 要花费资金,需要在 scriptSig 中传递完整的包含签名的多重签名启用脚本。
  • 网络检查哈希一致性和签名的有效性。

这使得 P2SH 成为企业账户、合资企业以及其他需要访问控制的场景的理想选择。 Pay-to-Script-Hash (P2SH) 机制是比特币架构的基础部分,在以下方面提供了平衡:

  • 安全性 (通过严格条件和密码学保护资金),
  • 效率 (仅存储哈希,而非所有细节),
  • 灵活性 (支持任意、甚至复杂的支出条件),
  • 便利性 (简单的地址格式和访问标准)。

数字签名伪造攻击:CVE-2025-29774 漏洞与 SIGHASH_SINGLE 漏洞如何通过虚假 RawTX 威胁多重签名钱包的操作方法


提取第一个交易输入( ins)的密码分析

我们执行命令获取哈希为 6102bfd4bad33443bcb99765c0751b6b8e4e65f4db4e3b65324c5e9e3dac8132 的交易的一个输入的信息。对此输入的分析对于理解脚本层面资金花费的授权机制非常重要。

root@kitploit:~
!./darkai -scriptsig 6102bfd4bad33443bcb99765c0751b6b8e4e65f4db4e3b65324c5e9e3dac8132

提取交易第一个输入( ins)的结果如下:

root@kitploit:~
{
'script': '00483045022100e5d7c59ea1fb5d0285e755dfc09634e1e3af36d12950b9b5d5f92b136021b3d202202c181129443b08dcfb8d9ced30187186c57c96f9cdb3f3914e0798682ea35d2b03493046022100e1f8dbad16926cfa3bf61b66e23b3846323dcabf6c75748bcfad762fc50bfaf402210081d955160b5f8d2b9d09d8838a2cf61f5055009d9031e0e106e19ebab234d949034c695221023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d4f9f359e37e39f05611962103d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b802103ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df53ae',
'outpoint': {
'index': 1,
'hash': 'ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577'
},
'sequence': 4294967295
}

1. ScriptSig 组件( script)的详细分析

  • 字段 script 的值是 scriptSig ,用于解锁相应的上一个交易输出。
  • 内容是一长串十六进制格式的字节序列。
  • 在此例中,它是一个五部分组成的脚本,包括:
    • 根据 ECDSA 协议的标准数字签名,通常用于确认私钥的所有权。
    • 验证签名所需的公钥。
    • 可能存在表示多重签名操作的结构(多个公钥和签名)。

脚本结构分析:

  • 以 00 开头,在 scriptSig 上下文中可表示 OP_0 ,传统上用于多重签名场景(例如,在 Pay-to-Script-Hash 多重签名标准中需要占位符)。
  • 接下来是 DER 格式的签名(例如 3045...),通常由包含签名细节的一系列字节组成。
  • 签名之后是公钥(按长度和结构,很可能是压缩格式,因为约 33 字节),用于确认签名属于正确的所有者。
  • 总体上,脚本格式对应于 redeemScript 或 P2SH 多重签名交易中典型的结构。

2. 前向输出(outpoint)

  • 包含此输入使用的上一个输出的数据:
    • 'hash': 'ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577'— 是上一个交易的哈希。
    • 'index': 1— 指示用于解锁的第二个输出(从零开始编号)。
  • 因此,输入引用了上一个交易的特定输出,证明交易作者有权花费它。

3. 序列号(sequence)

  • 值 4294967295 (0xFFFFFFFF) 是 32 位最大数。
  • 在比特币中,此字段用于指示输入未参与 Replace-By-Fee (RBF) 机制,或没有时间/相对时间锁。
  • 通常用于固定输入的默认值。

scriptSig 在安全上下文中的重要性

  • ScriptSig 是 用于解锁资金的数据 ,这些资金受到前一个输出的锁定脚本保护。
  • 对于 P2SH 交易(通常用于多重签名),scriptSig 包含:
    • 参与者的签名,确认花费资金的权利。
    • 原始 redeemScript,其哈希在前一个输出的锁定脚本中指定。
  • 成功的 scriptSig 检查确保交易作者确实拥有管理资金的必要权限。

对给定交易哈希的第一个交易输入( ins)提取的密码分析表明:


  • 第一个交易的输入包含复杂的解锁脚本,包括数字签名和公钥。
  • 引用了另一个交易的特定输出 ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577:1。
  • 最大序列值表示没有特殊锁定或 RBF。
  • 推测这是一个 P2SH 多重签名交易,需要多个签名来确认资金的花费。

因此,获取的数据有助于更深入地理解检查资金花费权利的机制,用于确保比特币网络的安全性,以及在基于比特币脚本的智能合约开发与审计中。


数字签名伪造攻击:CVE-2025-29774 漏洞与 SIGHASH_SINGLE 漏洞如何通过虚假 RawTX 威胁多重签名钱包的操作方法

提取第二个输出( outs)结果的详细分析

我们执行命令获取标识符为 ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577 的交易的一个输出的信息。

root@kitploit:~
!./darkai -redeemscript ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577

具体提取了该交易的第二个输出(outs),索引为 1 的元素。


获取的结果:

root@kitploit:~
{
'value': 350000,
'script': 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'
}

1. 收到的数据字段 value 的详细分析

  • 大小: 350,000 聪。
  • 此金额位于指定交易的第二个输出中,如果满足相应脚本中指定的条件,即可被花费。
  • 转换为 BTC: 350,000 聪 = 0.0035 BTC
数字签名伪造攻击:CVE-2025-29774 漏洞与 SIGHASH_SINGLE 漏洞如何通过虚假 RawTX 威胁多重签名钱包的操作方法

2. 字段 script 的值

  • 特征:
    脚本 a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287 是经典的 P2SH(Pay-to-Script-Hash) 格式的锁定脚本(scriptPubKey)。
  • 脚本解读:
    • a9— OP_HASH160 运算符,先对输入数据应用 SHA-256,再应用 RIPEMD-160。
    • 14— 下一个值的长度(20 字节),即哈希大小。
    • 06612b7cb2027e80ec340f9e02ffe4a9a59ba762— 20 字节的哈希,也称为 脚本哈希 ,是控制这些资金花费的赎回脚本的唯一标识。
    • 87— OP_EQUAL 运算符,比较两个值,若相等则返回 true。

因此,该脚本要求:要解锁(花费资金),用户必须提供一个赎回脚本,其哈希与此值匹配。


P2SH 中赎回脚本的含义与作用

  • 赎回脚本 是设定资金花费条件的原始脚本,例如多重签名、带时间限制的复杂场景等。
  • 交易输出只存储赎回脚本的哈希值,从而节省空间并保护条件的细节。
  • 要使用锁定在此输出中的资金,用户在创建新交易时,必须在 scriptSig 中提供一个序列化的赎回脚本,该脚本将被正确解码并由网络验证。

结果的总体含义

  • 交易 ID ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577 关联到一个包含 0.0035 BTC 的输出。
  • 这些资金被锁定在一个由脚本控制的 P2SH 地址中,该脚本的哈希值为 06612b7cb2027e80ec340f9e02ffe4a9a59ba762。
  • 要花费这些资金,必须提供与此哈希对应的赎回脚本,并满足其中列出的条件。

数字签名伪造攻击:CVE-2025-29774 漏洞和 SIGHASH_SINGLE 缺陷如何威胁多重签名钱包使用虚假 RawTX 的操作方法

所获信息在更广泛背景下的意义

  • 此结果使我们能够确认资金确实存在于具有 Pay-to-Script-Hash 条件的输出中。
  • 理解此类输出的结构对于安全分析、开发复杂分配场景以及验证花费条件非常重要。
  • 使用 P2SH 提供了一种安全高效的机制来管理比特币网络中的资金,允许创建智能合约和安全钱包。

收到的信息确认,第二个交易输出记录 ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577 存储了 0.0035 BTC,该输出由标准 P2SH 脚本控制,其 hash160 值为 06612b7cb2027e80ec340f9e02ffe4a9a59ba762。要管理这些资金,必须提供相应的赎回脚本,这为比特币管理提供了高水平的安全性和灵活性。


让我们确认 scriptSig 解密:

root@kitploit:~
OP_FALSE 304502... 304602... 5221023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d4f9f359e37e39f05611962103d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b802103ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df53ae

让我们运行命令来获取 HASH160。比特币开发者设定了一个 20 字节哈希(十六进制)的标准,该标准在其他流行加密货币(如比特币(BTC)、以太坊(ETH)、泰达币(USDT)、币安币(BNB)、Solana(SOL)、瑞波币(XRP)、卡尔达诺(ADA)、狗狗币(DOGE)、USDC(USDC)、波卡(DOT)、Avalanche(AVAX)、Shiba Inu(SHIB)、恒星币(XLM)、波场(TRX)、Chainlink(LINK)、莱特币(LTC)、比特币现金(BCH)、门罗币(XMR))中被广泛使用,以表示脚本和公钥的缩短标识符。


让我们运行命令:

root@kitploit:~
!./darkai -hexdata 5221023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d4f9f359e37e39f05611962103d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b802103ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df53ae

处理过程:

  1. 以十六进制格式表示的原始字符串被转换为一串字节(从十六进制解码为二进制格式)。该序列是一个序列化脚本(赎回脚本)或类似的比特币脚本结构。
  2. 接收到的字节使用 SHA-256(单次哈希)算法进行哈希处理,然后通过 RIPEMD-160 加密函数处理结果。
  3. 得到的 RIPEMD-160 哈希(对 SHA-256 二进制数据)以字符串形式呈现:
root@kitploit:~
06612b7cb2027e80ec340f9e02ffe4a9a59ba762

这个 20 字节哈希(十六进制)称为 HASH160,在比特币中广泛用于表示脚本和公钥的缩短标识符。


结果的含义与上下文

  • RIPEMD-160(SHA-256(data)) 哈希过程,即 HASH160,是在比特币中创建地址和脚本的标准方法,包括 P2SH。HASH160 提供了唯一且紧凑的标识符,节省了区块链上的空间。
  • 使用双重哈希(先 SHA-256,再 RIPEMD-160)结合了两者的强密码学特性:抗碰撞性、单向性和抗攻击性。
  • 得到的哈希对应于赎回脚本的脚本哈希——即控制锁定在 P2SH 地址中资金的脚本。
  • 具体来说,这个 HASH160 出现在特定交易输出的锁定脚本(scriptPubKey)中,要求在花费时提供具有相同哈希和正确签名的原始赎回脚本本身。

技术细节与解释

  • 比特币采用 SHA-256 和 RIPEMD-160 双重哈希的概念来保护地址和脚本。
  • 使用 HASH160 代替简单的 256 位 SHA-256 输出,将哈希长度从 32 字节减少到 20 字节,从而减少了网络上的存储和数据大小。
  • HASH160 用于生成 主要 P2SH 地址 和传统的 P2PKH 地址。

使用加密哈希函数处理比特币脚本的关键步骤。
将序列化脚本或公钥转换为 HASH160 可以实现比特币区块链上数据的高效识别、索引和保护。

收到的哈希:

root@kitploit:~
{'06612b7cb2027e80ec340f9e02ffe4a9a59ba762'}

团队生成了精确的哈希值,该哈希值充当了复杂脚本与比特币网络上用于存储和验证交易的紧凑格式之间的桥梁。


数字签名伪造攻击:CVE-2025-29774 漏洞和 SIGHASH_SINGLE 缺陷如何威胁多重签名钱包使用虚假 RawTX 的操作方法

为什么中本聪选择双重 SHA-256 以及它如何影响密码学强度

中本聪选择在比特币的哈希算法中使用 SHA-256 双重哈希(即连续应用两次 SHA-256)有以下几个重要原因,这些原因增强了网络的密码学强度和安全性。

选择双重 SHA-256 的原因

  1. 提高对各种攻击的抵抗能力
    单一应用 SHA-256 已经具有很高的密码学强度,能抵抗碰撞和原像攻击。然而,对哈希函数进行双重应用——首先对原始数据进行 SHA-256,然后对结果再次进行 SHA-256——进一步增加了分析和攻击哈希的难度。
    这降低了成功选择碰撞或反向恢复原始数据的概率,使选择各种选项的工作量更大,并防止算法特定实现中可能存在的弱点。
  2. 防止输入数据长度问题
    双重 SHA-256 通过考虑内部哈希构造的行为和数据标记中的填充位处理,提供了额外的预防性安全层。这最小化了与数据格式化相关的潜在攻击。
  3. 遵循良好的密码学实践
    双重哈希是许多密码协议中成熟的安全技术。例如,校验和和数字签名使用双重加密或双重哈希。这增强了安全链的强度。
  4. 经过验证的安全性和广泛支持
    SHA-256 是由美国国家安全局(NSA)开发并由美国国家标准与技术研究院(NIST)发布的 SHA-2 家族的一员。该算法被认为是当今最安全的算法之一,其双重使用提供了最大的安全性。

这如何影响密码学强度?

  • 抗碰撞性和原像抗性
    SHA-256 的每一轮都具有很高的抗碰撞性——极难找到两个输入具有相同的哈希。双重哈希增强了这一保证,因为攻击者必须找到连续两个 SHA-256 的碰撞,这显著增加了计算复杂度。
  • 具有雪崩效应的单向函数
    双重应用增强了“雪崩效应”,即输入数据中最微小的变化都会导致输出哈希的巨大变化,使得很难发现模式或进行逆向工程。
  • 增强的密码分析抵抗力
    双重 SHA-256 可以防止在单次迭代中可能发现的潜在实现弱点或意外漏洞,从而最大限度地降低使用量子或经典计算工具进行攻击的风险。
  • 适用于工作量证明和区块链安全
    比特币中的 PoW 机制依赖于计算必须满足一定难度的区块哈希。双重哈希为区块伪造创造了额外障碍,增加了区块链的可靠性和信任度 5。

双重使用 SHA-256 是中本聪的刻意选择,旨在为整个比特币系统提供额外的安全层和强大的密码学强度。这种设计最小化了碰撞风险,增强了单向性,并安全地保护了区块链网络上的数据,为交易安全和系统共识奠定了坚实基础。因此,双重 SHA-256 是比特币架构的关键元素,结合了先进的密码学技术和分布式系统。


数字签名伪造攻击:CVE-2025-29774 漏洞和 SIGHASH_SINGLE 缺陷如何威胁多重签名钱包使用虚假 RawTX 的操作方法


比特币中的多重签名:redeemScript 的作用与 OP_CHECKMULTISIG 指令

现代比特币交易的安全性和灵活性基于脚本系统,该系统允许实现复杂的资金花费条件。其中一个关键机制是 多重签名(multisig),即只有在多个有效数字签名(来自一组可能的签名者)存在时才能花费资金。在本文中,我们将详细探讨比特币中如何实现这一机制,什么是 redeemScript、OP_CHECKMULTISIG 指令如何工作,以及为什么这种方案如此受欢迎。

什么是 redeemScript?

在比特币的上下文中,赎回脚本(redeemScript) 是一个包含资金花费条件的脚本,这些条件以 Pay-to-Script-Hash(P2SH)格式存储在交易输出中。与将完整脚本存储在区块链上不同,输出中存储的是赎回脚本的哈希值,从而节省空间并在花费之前隐藏条件的细节。


RedeemScript 可以包含例如多个公钥和一个门限签名数——这正是多重签名钱包的实现方式。


OP_CHECKMULTISIG 如何工作?

让我们考虑 OP_CHECKMULTISIG 指令:目的和操作,其中实现多重签名检查的主要元素是 OP_CHECKMULTISIG。

  • 该指令从栈中接收两组数据作为输入:
    • N 个公钥(例如三个公钥)
    • M 个签名(例如两个签名),其中 M ≤ N 是确认交易所需的签名门限。
  • 为了验证交易,OP_CHECKMULTISIG 会检查每个 M 签名是否由 N 个公钥中的任意一个正确签署。
  • 如果所有签名均有效且与 redeemScript 中的密钥匹配,则指令返回 true,允许花费资金。

特性与从栈中移除元素的 Bug

由于 OP_CHECKMULTISIG 实现中的一个历史性 Bug,在执行期间会从栈中多移除一个元素,即一个未使用的值。为避免此问题,scriptSig 在开头使用一个特殊元素 OP_FALSE(值为 0),以补偿此 Bug 并防止潜在漏洞。


  • 接下来我们将关注 OP_CHECKMULTISIG 的实现,它从栈中多移除一个元素。攻击者利用此 Bug 将 OP_CHECKMULTISIG 作为潜在漏洞进行补偿。
  • 因此,多重签名的 scriptSig 结构大致如下: 其中脚本的第一个元素是一个占位符 。OP_FALSE <signature1> <signature2> ... <redeemScript>OP_FALSE

实际示例:2/3 多重签名

基于 redeemScript 代码:

root@kitploit:~
023927... 03d2c0... 03ec01... 3 OP_CHECKMULTISIG
  • 此处声明了 3 个公钥。
  • 门限为 2 个签名,即需要这三个中的两个才能成功验证。
  • 操作 OP_CHECKMULTISIG 检查提供的两个签名(在 scriptSig 中)是否对应于三个密钥中的两个并且有效。
  • OP_FALSE 在 scriptSig 中用于补偿移除额外值的 Bug。

多重签名钱包的重要性与优势

  • 增强安全性。 钱包所有者可以在多个人或设备之间分配对资金的控制权,消除了单一未经授权花费的可能性。
  • 灵活性。 可以实现各种方案,例如“2/3”、“3/5”以及不同的条件。
  • 法律效率: 多重签名常用于企业环境,以确保共享资产管理。

技术与实践背景

  • 多重签名场景广泛用于 P2SH 和 SegWit 交易。
  • OP_CHECKMULTISIG 指令是区块链中最耗资源的操作之一,因为它需要检查多个签名。协议层对每个区块的签名操作数量(sigops)有限制。
  • 尽管有 OP_FALSE 的历史,该机制已证明其可靠性并得到广泛应用。

RedeemScript 配合 OP_CHECKMULTISIG 指令是比特币武器库中一个复杂而强大的工具,它允许用户创建带有签名阈值的多重签名钱包,为资金提供高水平的安全性和控制力。该机制已成为组织、用户和服务在去中心化、安全环境中实现资产共享管理的基石。因此,通过 redeemScript 和 OP_CHECKMULTISIG 实现的多重签名不仅仅是一项技术,更是一种扩展经典加密货币模型功能的功能。


数字签名伪造攻击:CVE-2025-29774 漏洞与 SIGHASH_SINGLE 错误如何通过伪造 RawTX 威胁多重签名钱包操作方式

比特币使用 OP_CHECKMULTISIG 和 redeemScript 的多重签名验证机制如何工作

比特币的多重签名验证机制基于使用带有 OP_CHECKMULTISIG 和 redeemScript 指令的特殊脚本,从而实现阈值签名匹配,提供更高的安全性和资金共享管理。

多重签名机制基础

多重签名是一种系统,其中需要来自给定公钥集合的多个有效签名才能完成交易。典型方案表示为 m of n,例如“2 of 3”,其中需要任意两个来自三个密钥的签名才能授权支出。

在比特币中,该逻辑通过以下方式实现:

  • redeemScript — 描述资金支出条件的脚本。它包含公钥列表和阈值参数 (m)。
  • scriptSig — 解锁脚本,包含验证所需的签名以及 redeemScript 本身。

redeemScript 如何工作

指令 OP_CHECKMULTISIG 检查提供的 scriptSig 签名是否有效并与 redeemScript 中发布的公钥匹配。

RedeemScript 的结构大致如下:

root@kitploit:~
OP_M <pubkey1> <pubkey2> ... <pubkeyN> OP_N OP_CHECKMULTISIG
  • OP_M 和 OP_N — 分别指定所需签名数量和公钥总数的指令(例如 OP_2 和 OP_3)。
  • <pubkeyX> — 参与者的公钥。
  • OP_CHECKMULTISIG — 实现多重签名验证的操作符。

  • 它接收多个签名和一组公钥作为输入。
  • 要成功验证,每个签名必须正确匹配指定的公钥之一。
  • 如果有效签名数量达到阈值 m,则操作返回 true。

一个重要技术特性是 OP_CHECKMULTISIG 存在历史实现错误,导致会从栈中移除一个额外的、未使用的元素。为补偿此错误,在 scriptSig 开头放置一个 OP_FALSE(代码 0)值以“锁定”栈偏移。


scriptSig 结构如何工作

对于“2 of 3”多重签名钱包,在花费资金前,会按如下方式构建 scriptSig:

root@kitploit:~
OP_FALSE <signature1> <signature2> <redeemScript>
  • OP_FALSE — 用于补偿 OP_CHECKMULTISIG 错误的虚拟值。
  • <signature1> 和 <signature2> — 由对应私钥所有者授权的两个数字签名。
  • <redeemScript> — 包含公钥和验证参数的脚本本身。

节点验证交易时:

  1. 从 scriptSig 中提取 redeemScript。
  2. 对其进行哈希处理,并与之前输出(P2SH 格式 – OP_HASH160 <redeemScript hash> OP_EQUAL)锁定脚本 (scriptPubKey) 中存储的哈希进行比较。
  3. 如果哈希匹配,则反序列化 redeemScript。
  4. 执行 OP_CHECKMULTISIG 语句,比较签名和密钥是否匹配。
  5. 如果检查成功,则返回 true。

如果交易的所有输入都通过此检查,则交易被视为有效。凭借此有效性,通过执行此错误操作符,攻击者将 OP_CHECKMULTISIG 作为潜在漏洞进行补偿。


通过 redeemScript 和 OP_CHECKMULTISIG 的多重签名机制

  • 增强安全性: 多个私钥持有者必须同意才能进行交易,降低了单个密钥泄露时的盗窃风险。
  • 灵活性和可扩展性: 可以设置任意签名阈值(从 1 到 15),以及参与者列表——从 2 到 15 个公钥。
  • 集体资产管理: 适用于企业账户、联合钱包、DAO,实现强大的访问控制。
  • 透明度和可验证性: 所有必要数据和条件都在区块链中,交易验证是自动、去中心化和透明的。

使用 OP_CHECKMULTISIG 指令和 redeemScript 的比特币多重签名验证机制允许设置复杂的阈值签名方案,并且通过执行此错误操作符,攻击者将 OP_CHECKMULTISIG 作为比特币分布式网络中受控交易中的潜在漏洞进行补偿。


当 OP_CHECKMULTISIG 检查多个签名时,有哪些特性和限制?让我们看看关键方面和限制:

  1. 签名验证阈值
    OP_CHECKMULTISIG 允许指定所需签名数量 T 与公钥总数 N(“T out of N”方案)。例如 2 out of 3。交易有效只需 T 个有效签名。
  2. 在一次操作中验证多个签名
    与单签名验证 (OP_CHECKSIG) 不同,OP_CHECKMULTISIG 一次验证多个签名,将它们与对应的公钥关联,从而提高了多重签名钱包实现的效率和便利性。
  3. 使用 redeemScript 作为支出条件
    在 P2SH 格式中,多重签名方案隐藏在 redeemScript 哈希之下——一个包含公钥和参数的完整脚本。要花费资金,用户必须提供 redeemScript 和相应的签名。
  4. 历史错误——栈中的额外元素
    OP_CHECKMULTISIG 在执行时会移除一个额外的、未使用的栈元素(“off-by-one”实现错误)。为补偿,在 scriptSig 开头添加一个虚拟元素 OP_FALSE 以正确对齐栈。这是社区认可并接受的一个特性。

OP_CHECKMULTISIG 限制

  1. 密钥和签名的最大数量
    比特币对 redeemScript 中的公钥数量限制为 15 个,相应地签名也最多 15 个。这是由于脚本大小限制(约 520 字节)和每块允许验证的操作次数限制(sigops 限制)。
  2. 交易大小和费用增加
    多重签名交易由于公钥、签名和额外 redeemScript 数据较多而体积更大。这增加了交易本身的大小,从而增加了处理费用。
  3. 脚本大小限制
    每个脚本(输入或输出)的最大大小限制为 520 字节。当密钥数量较多时,redeemScript 变得臃肿,影响多重签名的便利性和效率。
  4. 仅在使用 P2SH 时才隐藏支出条件
    如果不使用 P2SH,包含公钥和 OP_CHECKMULTISIG 的正确脚本会公开存储在交易输出中,提前暴露公钥,降低隐私性。
  5. 缺乏对复杂逻辑的原生支持
    比特币脚本不完整且功能有限,没有循环和递归,因此复杂的政治或合约多重签名条件实现受限。

数字签名伪造攻击:CVE-2025-29774 漏洞与 SIGHASH_SINGLE 错误如何通过伪造 RawTX 威胁多重签名钱包操作方式


比特币中的签名类型:SIGHASH 标志的特性和作用

比特币使用数字签名来授权交易,允许资金所有者确认其处置资金的权利。特别之处在于,签名可以将其作用范围限制在交易的一部分,而非整个交易。这是通过使用特殊标志——SIGHASH 来实现的,该标志确定哪些交易数据确切地属于签名范围内。让我们考虑签名哈希的类型、它们的用途、使用示例,以及在非标准情况下出现的特性。

在对比特币交易进行签名时,会创建一个数字签名,该签名基于交易数据的一个特定片段生成。正是通过 SIGHASH 标志来指示该签名应覆盖数据的哪一部分。签名哈希类型由签名本身的最后一个字节传输,并确定包含在哈希中、从而包含在已签名部分中的区域。这使得可以灵活地形成关于签名者批准交易中哪些具体操作的条件。


主要的三种 SIGHASH 类型

1. SIGHASH_ALL (0x01)

这是大多数钱包和客户端的默认签名类型。签名覆盖交易的 所有输入和所有输出,这意味着:

  • 签名者确认此特定的输入和接收方组合。
  • 签名后对输入或输出的任何更改都会使签名失效。
  • 提供最高级别的交易安全性和可预测性。

2. SIGHASH_NONE (0x02)

使用此签名类型,所有输入都被签名,但没有任何输出被签名:

  • 签名者同意使用列出的输入,但不承诺特定的输出。
  • 这允许更改交易的输出而无需重新签名输入。
  • 这种方法对于单输入并不安全,更常用于特定场景,例如复杂的智能合约或协作交易。

3. SIGHASH_SINGLE (0x03)

此签名类型对所有输入进行签名,但仅对一个输出进行签名——该输出与输入具有相同的序号:

  • 即签名限制在“输入 N – 输出 N”这一对。
  • 允许签名者控制特定的输入输出对,同时忽略其余部分。
  • 有助于创建部分或有条件的资金处置。
  • 但是,如果不存在与输入索引对应的输出,则可能存在问题——这种情况下,会返回值为 1 的哈希(这是一个已知的错误,如下所述)。

实际交易示例

考虑一个包含三个输入的交易,其中从两个输入的签名脚本 (scriptSig) 中提取出了以指向 SIGHASH_SINGLE 的字节 0x03 结尾的签名——即仅对相应输入输出对进行签名的签名。然而,我们在这里观察到一种情况:索引为 2 的输入没有对应索引相同的输出。


数字签名伪造攻击:使用各种漏洞评估方法来防止加密货币事件并提高加密货币平台的网络安全

791fe035d312dcf9196b48649a5c9a027198f623c0a5f5bd4cc311b8864dd0cf


数字签名伪造攻击:使用各种漏洞评估方法来防止加密货币事件并提高加密货币平台的网络安全

原始交易


如果输入索引没有对应输出会发生什么?

由于历史上的比特币错误,在这种情况下,用于签名的交易哈希会返回一个固定数字——1(int 1)。这与正在签名的交易的有效哈希不符,并可能导致安全性和兼容性问题。

额外的标志和修饰符

除了三种基本的 SIGHASH 值外,还可以与 SIGHASH_ANYONECANPAY 标志组合使用,该标志允许只签名一个输入,而将其他输入保持开放以供修改。这扩展了创建复杂协作协议和多参与方交易的可能性,其中不同参与者只签名他们自己的部分。


实际意义和应用

  • SIGHASH_ALL 提供了最完整的交易确认,用于标准钱包。
  • SIGHASH_NONE 和 SIGHASH_SINGLE 允许更灵活和部分签名,用于复杂场景:多重签名、智能合约、受托交易。
  • 理解这些类型对于创建自定义交易或调查错误/漏洞的开发者和分析师至关重要。

SIGHASH 类型是 Bitcoin 中一个巧妙的管理交易内数字签名控制级别和范围的机制。它们在安全性、灵活性和兼容性之间取得了平衡。历史问题包括意外复杂性,例如当没有对应输出时 SIGHASH_SINGLE 的错误,这凸显了深入理解技术细节对于在高级别成功使用比特币的重要性。


SIGHASH_ALL、SIGHASH_NONE 和 SIGHASH_SINGLE 之间的差异如何影响比特币交易的安全性?

SIGHASH_ALL、SIGHASH_NONE 和 SIGHASH_SINGLE 签名类型之间的差异对比特币交易的安全性有重大影响,因为它们决定了交易中的哪些部分被包含在数字签名中,从而免受篡改。


1. SIGHASH_ALL – 最高安全性

  • 描述: 签名覆盖交易的所有输入和所有输出。
  • 对安全性的影响:
    • 确保签名后没有输入或输出可以被修改。
    • 消除了替换接收方或支付金额的可能性。
    • 签署者对交易的最终结果拥有完全控制权。
  • 风险: 刚性高——如果需要更改任何内容(例如添加输出或增加手续费),则需要重新签名。

2. SIGHASH_NONE – 输出开放,输入封闭

  • 描述: 所有输入被签名,而所有输出未签名。
  • 对安全性的影响:
    • 签名输入受到保护,但输出在签名后可由任何人更改。
    • 潜在的滥用可能性:攻击者可以在签名后更改转账的地址和金额。
  • 用途: 很少使用,主要用于受信任的协作协议和合作场景。
  • 风险: 如果攻击者获得签名访问权,他们可以在未经签署者同意的情况下将资金发送到自己的地址。

3. SIGHASH_SINGLE – 签名对应的输入和输出

  • 描述: 签署所有输入,但仅签署与输入签名具有相同索引的输出。
  • 对安全性的影响:
    • 允许签署者仅控制一个特定的输出,而其他输出保持可修改状态。
    • 如果输出数量少于输入数量,则会出现错误:对于缺失的输出,哈希值为1,这可能导致漏洞。
    • 允许更灵活地分配资金管理权,但这种灵活性伴随着安全支出保障的降低。
  • 风险:
    • 可能替换或移除未覆盖的输出。
    • 不适用于需要保持整个支付逻辑不变的情况。

最终影响


SIGHASH 类型的选择直接影响了比特币加密货币网络中交易的信任程度:

  • SIGHASH_ALL 提供了最高级别的安全性,因此被广泛应用于大多数交易。
  • SIGHASH_NONE 和 SIGHASH_SINGLE 提供了灵活性和部分签名,在某些情况下可能有用,但也增加了伪造和滥用的风险。
  • 理解这些差异对于设计多重签名方案、复杂协议和比特币智能合约至关重要,在这些场景中,必须仔细平衡灵活性和安全性。

SIGHASH_ALL 的误用如何导致交易漏洞

在比特币交易签名中错误使用或未正确实现 SIGHASH_ALL 可能导致严重漏洞,影响资金安全和系统完整性。这些漏洞的关键方面如下:


  1. 签名可塑性:
    尽管 SIGHASH_ALL 意味着交易的所有输入和输出都被签名,但由于 ECDSA 算法的特性,同一交易可能存在多个不同但有效的签名。这是因为签名组件 s 可以取等价的值。攻击者可以在不改变交易内容的情况下修改签名,从而导致交易标识符(txid)发生变化。这使得跟踪交易变得困难,增加了重放攻击的难度,并可能被用于欺诈或双重花费。
  2. 反序列化签名错误:
    如果签名验证函数(包括 SIGHASH_ALL)没有正确处理签名结构,例如检查 r 和 s 是否在允许范围内且非零,那么攻击者可以创建无效但被接受的签名。这种伪造签名可用于授权未经授权的交易、窃取资金、双重花费以及破坏区块链。
  3. 签名参数验证不足:
    对带有SIGHASH_ALL 标志的签名进行不正确或不完整的验证,例如忽略或错误处理尾随字节,可能导致具有错误签名元素覆盖范围(输入和输出)的交易被验证通过。这为攻击者操纵交易部分以禁用保护或提升权限打开了大门。
  4. 重放攻击和交易冲突:
    由于可以在不改变交易内容的情况下更改签名(参见签名可塑性),同一笔交易可能被重复使用或产生冲突,从而产生双重花费或财务损失的风险。

数字签名伪造攻击:CVE-2025-29774 漏洞与 SIGHASH_SINGLE 缺陷如何通过伪造 RawTX 威胁多重签名钱包的操作方法


因此,错误使用SIGHASH_ALL 或在其实施验证中出现错误会严重削弱比特币网络的安全性,使攻击者能够操纵签名和交易。为了应对这些漏洞,正在实施严格的签名格式和范围检查,使用改进的协议(例如SegWit 消除了部分签名可变性问题),并标准化安全的签名和交易验证方法。


带有 SIGHASH_ALL 类型的无效签名会增加比特币中双重花费的风险,原因如下:

当使用 SIGHASH_ALL 时,签名覆盖交易的所有输入和输出,确保交易中的任何元素在签名后都不能被更改。然而,如果签名形成不当,例如由于随机数生成或签名参数(r, s)本身出现错误,可能导致部分交易可以在不使签名无效的情况下被更改。特别是,出现一种漏洞,攻击者可以更改交易的个别字段或结构,创建网络接受的变体,但与原始交易不同。


这种签名可塑性允许攻击者创建一个具有不同标识符(txid)的交易替代版本,使追踪和确认支付变得困难,并在某些情况下导致同一输入被重复使用——即双重花费。


此外,如果SIGHASH_ALL 的签名验证实现没有严格检查签名参数的正确性和数据格式,攻击者可以发布伪造签名或利用协议漏洞绕过检查。这为操纵和创建冲突交易留下了开放的机会。

因此,为了降低双重花费的风险,正确生成和验证带有SIGHASH_ALL 的签名、应用签名可塑性防护方法(例如SegWit),以及更新软件并遵循安全建议至关重要。这确保了签名与整个交易结构绑定,保证其不可篡改性和抗滥用能力。


让我们获取与比特币地址 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe 相关的公钥信息。以下是对所获数据的详细分析。


root@kitploit:~
!./darkai -pubkey 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe

获取的公钥:

该命令的输出结果是一个包含三个公钥的列表,以压缩格式(compressed public key) 呈现,十六进制形式:

root@kitploit:~
pubkey = [
'023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d9f359e37e39f0561196',
'03d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b80',
'03ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df'
]

  • 公钥:每个元素是用户以压缩公钥格式呈现的公钥,长度为 33 字节。压缩钥通常以前缀02 或03 开头,指示椭圆曲线上点的 Y 坐标符号,后跟 32 字节的 X 坐标。
  • 与地址的关联:比特币地址是脚本或公钥的哈希值。在本例中,地址32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe 对应某个 P2SH(Pay-to-Script-Hash)或多重签名地址,其特点是在 redeemScript 中存储多个公钥。公钥列表对应于该保险库中嵌入的集合。

多个公钥的集合是多重签名钱包的典型情况。在这种情况下,花费资金需要来自相应私钥的多个签名:


  • 该公钥列表允许确定哪些密钥有权对该地址的交易进行签名。
  • 通常,多重签名按照 M-of-N 方案形成,例如 2-of-3,其中N 是密钥总数,M 是花费所需的最小签名数量。

  • 使用多个密钥提高了安全性,因为单密钥泄露不会导致资金控制权丧失。
  • 每个公钥可以单独或组合验证,以确认签名的有效性。

数字签名伪造攻击:CVE-2025-29774 漏洞与 SIGHASH_SINGLE 缺陷如何通过伪造 RawTX 威胁多重签名钱包的操作方法

压缩公钥

  • 压缩原理允许将公钥长度从 65 字节(非压缩格式)减少到 33 字节,从而节省交易和区块中的空间。
  • 压缩钥包含椭圆曲线上点的 X 坐标信息以及 Y 坐标的符号。

在 redeemScript 中的使用

  • 在多重签名的上下文中,这些公钥通常包含在redeemScript 中,用于 P2SH 场景。
  • 为了确认花费资金的权限,必须提供对应于该集合中最低所需密钥数量的签名。

比特币地址 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe 与三个以压缩格式呈现的特定公钥相关联。这是比特币多重签名地址的典型特征,为了授权花费,必须提供使用这些密钥中的部分或全部生成的签名,从而提供高水平的安全性和资金管理的灵活性。


为了进行更深入的分析和理解参数,可以进一步研究:

  • 这组私钥和公钥关联的特定 redeemScript 格式。
  • 签名策略(需要这三个签名中的多少个)。
  • 与该地址关联的交易历史。

公钥 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe

公钥 023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d4f9f359e37e39f0561196 是用于 BitPay Copay 多重签名钱包的元素之一,该钱包曾受到涉及 SIGHASH_SINGLE 签名类型处理漏洞的攻击影响。

此公钥以及其他两个(03d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b80 和 03ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df)都是 Copay 钱包 redeemScript 的一部分,该钱包是一个 2-of-3 多重签名钱包。要从这样的地址花费资金,必须提供两个有效签名和 redeemScript。

赎回脚本(RedeemScript)包含这三个公钥,解码后得到以下指令:2 <pubkey1> <pubkey2> <pubkey3> 3 OP_CHECKMULTISIG。这意味着需要三个可能密钥中的两个签名来验证多重签名。OP_CHECKMULTISIG检查每个签名/公钥对的有效性,确保所有签名都与其中一个公钥匹配。scriptSig中的OP_FALSE指令是由于一个已知错误而必需的,即OP_CHECKMULTISIG会从栈中移除一个多余未使用的值。


Copay钱包由BitPay开发,曾遭到攻击,细节由Coinspect披露。该攻击利用了SIGHASH_SINGLE签名类型,该类型仅对相应的输入和输出(与输入索引相同的输出)进行签名。如果不存在该索引的输出,则整数值“1”将作为交易哈希返回,这是一个已知错误,OP_CHECKMULTISIG会检查三个公钥中的两个签名的真实性。


这个多重签名集因Coinspect发现的漏洞而备受关注。该漏洞与交易使用签名类型SIGHASH_SINGLE (0x03)的方式有关,在该类型下,签名覆盖所有输入以及交易中恰好一个与输入索引匹配的输出。需要注意的是,如果不存在该索引的输出(在某些情况下输出数量少于输入),由于Bitcoin的一个错误,签名的哈希将作为整数“1”返回。这使得可以在不知道私钥的情况下创建花费输出的交易,从而打开了从多重签名钱包盗取资金的大门。


数字签名伪造攻击:CVE-2025-29774漏洞和SIGHASH_SINGLE错误如何威胁多重签名钱包——使用假RawTX的操作方法BitPay Copay多重签名钱包成为攻击目标,说明了数字签名伪造攻击的重要性

因此,公钥03d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b80是易受攻击的Copay多重签名钱包的关键组成部分,它在复合赎回脚本中的参与提供了某些安全优势,但也成为了实验和攻击的主题,说明了在Bitcoin中正确处理所有签名类型的重要性。


赎回脚本和多重签名的重要作用

公钥03d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b80是赎回脚本的一部分,该脚本指定了从特定交易输出中花费资金的条件,并具有以下通用格式:

root@kitploit:~
2 <pubkey1> <pubkey2> <pubkey3> 3 OP_CHECKMULTISIG

其中该密钥占据<pubkeyN>中的一个位置。指令OP_CHECKMULTISIG检查花费资金时提供的签名是否正确,并且至少匹配三个公钥中的两个。


该公钥与另外两个公钥一起,定义了Copay多重签名钱包中联合管理资金的授权所有者列表,该钱包展示了与签名类型SIGHASH_SINGLE处理不当相关的已知漏洞。该漏洞允许攻击者创建具有不正确哈希的交易,这是由于Bitcoin协议中当没有与某个索引输入对应的输出时的一个错误引起的。这导致了对钱包(包括Copay)的可能攻击。


公钥03ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df是Copay多重签名钱包安全性和灵活性的关键元素。它用于联合控制资金,并需要与集合中的其他密钥共同确认交易。同时,所讨论的漏洞成为了一个重要的例子,说明需要在加密货币系统中严格验证和更新签名机制。


让我们执行命令,获取两个与指定Bitcoin地址关联的DER格式处理过的数字签名:

root@kitploit:~
!./darkai -decodesig 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe

结果如下:

root@kitploit:~
decodesig = [der_decode_sig('3045022100dfcfafcea73d83e1c54d444a19fb30d17317f922c19e2ff92dcda65ad09cba24022001e7a805c5672c49b222c5f2f1e67bb01f87215fb69df184e7c16f66c1f87c2903'), der_decode_sig('304402204a657ab8358a2edb8fd5ed8a45f846989a43655d2e8f80566b385b8f5a70dab402207362f870ce40f942437d43b6b99343419b14fb18fa69bee801d696a39b3410b803')]

数字签名伪造攻击:CVE-2025-29774漏洞和SIGHASH_SINGLE错误如何威胁多重签名钱包——使用假RawTX的操作方法

解密数字签名

变量sigs存储了两个通过函数der_decode_sig从DER编码形式解密得到的签名:

  1. 第一个签名:
root@kitploit:~
3045022100dfcfafcea73d83e1c54d444a19fb30d17317f922c19e2ff92dcda65ad09cba24022001e7a805c5672c49b222c5f2f1e67bb01f87215fb69df184e7c16f66c1f87c2903
  1. 第二个签名:
root@kitploit:~
304402204a657ab8358a2edb8fd5ed8a45f846989a43655d2e8f80566b385b8f5a70dab402207362f870ce40f942437d43b6b99343419b14fb18fa69bee801d696a39b3410b803

DER(区分编码规则)格式是Bitcoin中ECDSA签名编码的标准方式,它保证了签名参数r和s的唯一且正确的表示。


用于验证的哈希

用于验证签名的哈希是:


Read more

下载工具
Sighash 类型签名内容安全级别可能的风险应用场景
SIGHASH_ALL交易的所有输入和输出最高——完全不可更改需要更改时需重新签名大多数支付的标准
SIGHASH_NONE所有输入,不包含输出中等——输出不受保护输出被替换,失去对接收方的控制合作场景,多重签名
SIGHASH_SINGLE所有输入,与输入索引对应的输出低——仅有一个输出受到保护缺少对应输出时的错误,部分替换部分支付,复杂场景