CVE-2026-44714bitcoinj是一个Java实现的比特币协议库。在0.17.1版本之前,其ScriptExecution.correctlySpends()方法中存在两个针对标准P2PKH和原生P2WPKH交易的快速路径验证漏洞。在这两个分支中,bitcoinj虽然验证了攻击者控制的签名和公钥对,但未能验证该公钥是否确实是正在被花费的输出所承诺的公钥。因此,任何攻击者密钥对都可以满足bitcoinj对任意P2PKH和P2WPKH输出的本地验证。该漏洞已在0.17.1版本中修复。
该漏洞位于bitcoinj库的`core/src/main/java/org/bitcoinj/script/ScriptExecution.java`文件中的`ScriptExecution.correctlySpends()`方法内。具体而言,问题出在对标准P2PKH(Pay-to-Public-Key-Hash)和原生P2WPKH(Pay-to-Witness-Public-Key-Hash)交易的快速路径验证逻辑中。在正常且安全的比特币交易验证流程中,系统必须验证签名不仅要在数学上与提供的公钥匹配,还必须确认该公钥的哈希值与被花费输出中锁定脚本所承诺的哈希值一致。然而,在0.17.1之前的版本中,bitcoinj的快速路径代码存在逻辑缺陷。它仅验证了攻击者提供的签名和公钥对在密码学上是匹配的,却完全省略了对公钥所有权归属的校验。这意味着攻击者可以生成任意一个新的密钥对,使用该私钥对交易签名,然后提交给bitcoinj验证。由于缺少公钥哈希比对环节,bitcoinj会错误地返回验证通过。这允许攻击者绕过本地交易验证机制,针对任意P2PKH和P2WPKH输出构造虚假的有效交易,可能导致双重支付攻击或钱包余额显示异常。