CVE-2026-42440Apache 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。由于攻击者无需填充后续的大量数据即可触发错误,攻击载荷非常微小,难以被常规的文件大小限制机制拦截。