Description
Arbitrary Class Instantiation via Model Manifest in Apache OpenNLP ExtensionLoader





Versions Affected: before 2.5.9, before 3.0.0-M3





Description: 

The ExtensionLoader.instantiateExtension(Class, String) method loads a class by its fully-qualified name via Class.forName() and invokes its no-arg constructor, with the class name sourced from the manifest.properties entry of a model archive. The existing isAssignableFrom check correctly rejects classes that are not subtypes of the expected extension interface (BaseToolFactory for factory=, ArtifactSerializer for serializer-class-*), but the check runs after Class.forName() has already loaded and initialized the named class.

Class.forName() with default initialization semantics executes the target class's static initializer before returning, so an attacker who can supply a crafted model archive can cause the static initializer of any class on the classpath to run during model loading, regardless of whether that class passes the subsequent type check.

Exploitation requires a class with attacker-useful side effects in its static initializer (for example, JNDI lookup, outbound network I/O, or filesystem access) to be present on the classpath, so this is not a drop-in remote code execution; however, the attack surface grows as third-party model distribution becomes more common (community model repositories, Hugging Face-style sharing), where users routinely load model files from origins they do not control. A secondary, narrower vector affects deployments that ship legitimate BaseToolFactory or ArtifactSerializer subclasses with side-effecting no-arg constructors: a malicious manifest can name such a class and force its constructor to run during model load.





Mitigation: 



* 2.x users should upgrade to 2.5.9.
* 3.x users should upgrade to 3.0.0-M3.




Note: The fix introduces a package-prefix allowlist that is consulted before Class.forName() is invoked, so the static initializer of a disallowed class is never executed. Classes under the opennlp. prefix remain permitted by default. Deployments that load models referencing factories or serializers outside opennlp.* must opt those packages in, either programmatically via ExtensionLoader.registerAllowedPackage(String) before the first model load, or by setting the OPENNLP_EXT_ALLOWED_PACKAGES system property to a comma-separated list of allowed package prefixes.

Users who cannot upgrade immediately should ensure that all model files are sourced from trusted origins and should audit their classpath for classes with side-effecting static initializers or constructors, particularly any that perform JNDI lookups, network requests, or filesystem operations during class initialization.
Published: 2026-05-04
Score: n/a
EPSS: n/a
KEV: No
Impact: n/a
Action: n/a
AI Analysis

Impact

The vulnerability allows an attacker to provide a crafted model archive whose manifest.properties specifies the fully‑qualified name of a class. The ExtensionLoader.instantiateExtension method loads that class with Class.forName(), executing its static initializer before verifying that it inherits the expected interface. If the attacker supplies a class that performs side‑effecting actions—such as JNDI lookups, outbound network traffic, or filesystem access—in its static initializer, those actions will run during model loading. The vulnerability does not automatically provide remote code execution unless the attacker can supply a class with side‑effecting code on the classpath, but the risk grows as users load models from untrusted or community‑shared repositories.

Affected Systems

Apache OpenNLP, released by the Apache Software Foundation, is affected when used in versions earlier than 2.5.9 (2.x line) and earlier than 3.0.0-M3 (3.x line). Systems that load external model archives from untrusted sources using these versions are impacted.

Risk and Exploitability

The vulnerability cannot be exploited for arbitrary code execution without a side‑effecting class already on the classpath; however, if such a class exists, the static initializer will run during model loading, potentially leaking information or performing malicious operations. Attackers who can craft a model archive represent the primary attack vector. Since the EPSS score is not available and there is no KEV listing, the observed exploit frequency is uncertain, but the potential impact remains significant for systems that load untrusted models or contain classes with unsafe static initialization.

Generated by OpenCVE AI on May 4, 2026 at 18:57 UTC.

Remediation

No vendor fix or workaround currently provided.

OpenCVE Recommended Actions

  • Upgrade Apache OpenNLP to 2.5.9 for 2.x users or to 3.0.0-M3 for 3.x users.
  • If a package upgrade is not immediately possible, configure ExtensionLoader to restrict allowed packages by calling registerAllowedPackage on trusted prefixes or setting the system property OPENNLP_EXT_ALLOWED_PACKAGES to a comma‑separated list before any model load occurs.
  • Ensure that all downloaded model files originate from trusted sources, audit the application classpath for classes with side‑effecting static initializers or constructors, and account for any JNDI lookups, network requests, or filesystem operations performed during class initialization.

Generated by OpenCVE AI on May 4, 2026 at 18:57 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Mon, 04 May 2026 19:00:00 +0000

Type Values Removed Values Added
First Time appeared Apache
Apache opennlp
Vendors & Products Apache
Apache opennlp

Mon, 04 May 2026 18:30:00 +0000

Type Values Removed Values Added
References

Mon, 04 May 2026 17:15:00 +0000

Type Values Removed Values Added
Description Arbitrary Class Instantiation via Model Manifest in Apache OpenNLP ExtensionLoader Versions Affected: before 2.5.9, before 3.0.0-M3 Description:  The ExtensionLoader.instantiateExtension(Class, String) method loads a class by its fully-qualified name via Class.forName() and invokes its no-arg constructor, with the class name sourced from the manifest.properties entry of a model archive. The existing isAssignableFrom check correctly rejects classes that are not subtypes of the expected extension interface (BaseToolFactory for factory=, ArtifactSerializer for serializer-class-*), but the check runs after Class.forName() has already loaded and initialized the named class. Class.forName() with default initialization semantics executes the target class's static initializer before returning, so an attacker who can supply a crafted model archive can cause the static initializer of any class on the classpath to run during model loading, regardless of whether that class passes the subsequent type check. Exploitation requires a class with attacker-useful side effects in its static initializer (for example, JNDI lookup, outbound network I/O, or filesystem access) to be present on the classpath, so this is not a drop-in remote code execution; however, the attack surface grows as third-party model distribution becomes more common (community model repositories, Hugging Face-style sharing), where users routinely load model files from origins they do not control. A secondary, narrower vector affects deployments that ship legitimate BaseToolFactory or ArtifactSerializer subclasses with side-effecting no-arg constructors: a malicious manifest can name such a class and force its constructor to run during model load. Mitigation:  * 2.x users should upgrade to 2.5.9. * 3.x users should upgrade to 3.0.0-M3. Note: The fix introduces a package-prefix allowlist that is consulted before Class.forName() is invoked, so the static initializer of a disallowed class is never executed. Classes under the opennlp. prefix remain permitted by default. Deployments that load models referencing factories or serializers outside opennlp.* must opt those packages in, either programmatically via ExtensionLoader.registerAllowedPackage(String) before the first model load, or by setting the OPENNLP_EXT_ALLOWED_PACKAGES system property to a comma-separated list of allowed package prefixes. Users who cannot upgrade immediately should ensure that all model files are sourced from trusted origins and should audit their classpath for classes with side-effecting static initializers or constructors, particularly any that perform JNDI lookups, network requests, or filesystem operations during class initialization.
Title Apache OpenNLP: Arbitrary Class Instantiation via Model Manifest in ExtensionLoader
Weaknesses CWE-470
References

cve-icon MITRE

Status: PUBLISHED

Assigner: apache

Published:

Updated: 2026-05-04T17:36:56.492Z

Reserved: 2026-04-23T14:21:25.317Z

Link: CVE-2026-42027

cve-icon Vulnrichment

No data.

cve-icon NVD

Status : Received

Published: 2026-05-04T17:16:24.123

Modified: 2026-05-04T18:16:29.927

Link: CVE-2026-42027

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-05-04T19:00:07Z

Weaknesses