首页 网络安全 正文

BC-FJA finalizer 密钥擦除驻留缺陷CVE-2026-13505

摘要

栋科技漏洞库关注到 BC-FJA finalizer 密钥擦除驻留缺陷,依靠终结器机制在垃圾回收时清空敏感密钥数据,追踪为CVE-2026-13505。

BC-FJA 的全称为 Bouncy Castle FIPS Java API,它是 Bouncy Castle 推出、通过美国 NIST FIPS 140 安全认证 的 Java 加密组件库。

一、基本情况

BC-FJA 是 VMware 旗下软件加密模块,旨在为各类 VMware 应用程序提供符合 ‌FIPS 140-2‌ 标准的加密函数与服务,遵循 FIPS 规范。

BC-FJA finalizer 密钥擦除驻留缺陷CVE-2026-13505

BC-FJA 专供金融、政务、军工等需要合规加密的系统使用,它能够对接 Java 原生 JCA 安全框架,可直接替换 JDK 默认加密提供者。

栋科技漏洞库关注到 BC-FJA finalizer 密钥擦除驻留缺陷,依靠终结器机制在垃圾回收时清空敏感密钥数据,追踪为CVE-2026-13505。

二、漏洞分析

CVE-2026-13505是 BC-FJA 中漏洞,影响版本号为 bc-fips 1.0.2.7、2.0.2、2.1.3 之前的 BC-FJA,影响Java 9 及以上版本运行平台。

BC-FJA 中持有敏感密钥的 AES 与 DESede 引擎、SP 800-90A DRBG、SymmetricSecretKey、PBKD 与 scrypt 参数类,

通过重写 Object.finalize 在 GC 时擦除密钥字节,

Java 9 之后 Finalizer 调度被弱化使密钥长时间驻留堆中并可能引发 OutOfMemoryError,

本地进程或堆 dump 访问者可恢复这些密钥字节。

由于BC-FJA 在 1.0.X 系列早于 1.0.2.7、2.0.X 系列早于 2.0.2、2.1.X 系列早于 2.1.3 时持有敏感密钥的上述类重写 Object.finalize,

由单 Finalizer 线程异步调度擦除;

当对象分配速率高于该线程回收速率,pending-finalization 队列无界增长,

密钥字节在堆中持续驻留直至被 OOM 触发或被本地访问者从堆或堆 dump 中恢复。

Java 版 Bouncy Castle(bcprov)与长期支持版 Java Bouncy Castle 不受影响,二者并未采用这套基于终结器的密钥清零方案。

1、漏洞原理

AES、三重 DES 加密引擎、SP 800-90A 随机数生成器、对称密钥类、PBKD 与 scrypt 参数类中的敏感密钥,

原本通过重写 Object.finalize() 方法,打算在对象被垃圾回收时自动清零密钥。

终结器的执行时机、执行顺序均不受控制,且 JVM 仅用单独一条终结器线程处理所有终结任务。

若创建带终结器的对象速度超过该线程的处理速度,待终结队列会无限制膨胀:

密钥对象的销毁流程严重滞后,高负载场景下还会引发内存溢出错误。

密钥会长期驻留在堆内存中,违背了设计清零逻辑、尽快销毁密钥的初衷。

Java 8、Java 11 环境下该问题并未显现;Java 13 之后的 JVM 逐步废弃、弱化终结器机制,该缺陷才暴露出来。

2、修复方式

现已基于多版本适配的 jdk1.9 适配层注册 java.lang.ref.Cleaner 机制执行销毁逻辑。

在 Java 9 及更高版本中,上述类的密钥清零不再依赖终结器调度。

3、风险说明

想要读取滞留在堆中的密钥,攻击者必须能够本地访问进程或者获取进程内存转储文件,漏洞评级也以此为依据。

而对于符合 FIPS 标准的加密模块,无论对象是否可达,都要求及时完成密钥清零。

三、影响范围

BC-FJA<2.0.2

BC-FJA<2.1.3

BC-FJA<1.0.2.7

四、修复建议

BC-FJA ≥ 2.0.2

BC-FJA ≥ 2.1.3

BC-FJA ≥ 1.0.2.7

五、参考链接

管理员已设置登录后刷新可查看



扫描二维码,在手机上阅读
评论
更换验证码
友情链接