2月10日,pyca/cryptography维护者发布46.0.5版本,修复编号CVE-2026-26007的高危漏洞。CVSS评分8.2。这个漏洞藏在椭圆曲线数学的一个冷门角落——子群约束攻击(subgroup confinement attack),能让攻击者在密钥交换过程中逐位窃取私钥。
如果你的后端用Python,这个库大概率是安全栈的核心。但它对一类遗留曲线的处理,留下了致命缝隙。
![]()
椭圆曲线密码学在有限域上运行,曲线点构成阿贝尔群。安全实现要求在大素数阶n的子群内运算。总群阶N与素数子群阶n的关系由余因子(cofactor)h定义:N = h × n。
![]()
现代曲线如NIST P-256或secp256k1,余因子恰好为1。总群阶是素数,天然免疫子群攻击。但遗留二进制曲线——常称SECT曲线,如SECT163K1或SECT283R1——余因子大于1,通常是2或4。
余因子大于1时,群包含小阶子群。若应用执行ECDH密钥交换时未验证对方公钥点是否落在正确子群,攻击者可发送恶意公钥点P,使其属于阶为r的小阶子群。
受害者计算共享密钥S = d × P时,结果点S落入该子群。由于S只有r种可能值,攻击者通过观察后续加密通信,可推导出d模r的值。用不同子群重复此操作,结合中国剩余定理,即可重构完整私钥。
漏洞根因在于46.0.4及之前版本解析公钥时的验证缺失。当应用从DER或PEM格式加载椭圆曲线公钥,或用public_key_from_numbers()构造时,库未检查该点是否属于正确的素数阶子群。
余因子为1的曲线不受影响。但二进制SECT曲线允许恶意构造的公钥通过加载阶段,使下游ECDH或ECDSA操作暴露于密钥泄露风险。
修复方案体现在Rust后端的改动中。由于pyca/cryptography用Rust封装OpenSSL以提升性能,验证逻辑被植入原生层。核心代码如下:
impl ECPublicKey {
fn check_point_is_on_correct_subgroup(&self) -> Result<(), Error> {
// 验证点阶数等于曲线素数阶n
// 或验证点乘以n等于无穷远点
![]()
具体实现采用两种等效策略之一:直接验证点阶数等于n,或验证点乘以n得到无穷远点。后者计算成本更低,成为实际选择。
补丁同时覆盖了密钥加载的多个入口:DER解码器、PEM解析器、以及public_key_from_numbers()的数值构造路径。任何未经充分验证的公钥点,现在会在触及加密操作前被拦截。
这次事件暴露了一个长期被忽视的攻击面。SECT曲线诞生于计算资源受限的年代,二进制域运算在特定硬件上曾有速度优势。但随着现代处理器对素数域优化的成熟,以及侧信道防护需求的上升,这些曲线已逐步退出主流。
然而密码学基础设施的惯性极强。遗留系统、合规要求、甚至某些嵌入式场景,仍在调用这些被认为"足够安全"的老算法。CVE-2026-26007证明,只要实现层面缺少一道验证,数学上的理论风险就会转化为实际可利用的漏洞。
对于维护者而言,这次修复的教训明确:密码学原语的封装必须假设最坏情况。不能依赖调用者"应该"使用现代曲线,而要对所有支持的算法执行同等严格的验证。一个为余因子1曲线设计的快捷路径,在余因子2或4的场景下就是后门。
对于使用者,检查依赖版本是最低行动。46.0.5之前的部署应尽快升级。更深层的问题是审计自己的密钥类型:是否仍在使用SECT163K1、SECT283R1等二进制曲线?如果是,迁移到P-256或secp256k1的优先级应当上调。
密码学漏洞的残酷之处在于,攻击往往不留痕迹。私钥泄露不会触发日志告警,伪造的签名在验证时看起来完全合法。CVE-2026-26007的CVSS 8.2评分,反映的正是"高影响、可利用"的组合。修复已发布,但漏洞窗口期内是否已被利用,无从得知。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.