{"items":[{"id":"NVI-00015358","kind":"vulnerability","title":"Apache OpenNLP ExtensionLoader Vulnerable to Arbitrary Class Instantiation via Model Manifest","revision":1,"unknowns":["Customer inventory, deployment, reachability and exploitation have not been inspected."],"lifecycle":"active","identifiers":["GHSA-cx4m-2p55-rw7j","CVE-2026-42027"],"plain_summary":"GitHub lists this reviewed advisory for org.apache.opennlp:opennlp-tools, org.apache.opennlp:opennlp-tools, org.apache.opennlp:opennlp-tools. Published version ranges and source prerequisites are shown below; this is not an inspection of a visitor’s application.","review_status":"source_listed","control_topics":[],"public_actions":[{"summary":"Identify the exact component and deployed version, examine the linked publisher’s conditions, and retain evidence of any mitigation.","source_ids":["sr-5f0a4655539dd48aecbfe70809a46114"],"action_type":"investigate","limitations":"Confirm current vendor support, compatibility and deployment evidence. This report has not tested a fix in your system.","current_supported_target":null}],"schema_version":"1.1.0","source_metrics":[{"kind":"CVSS","as_of":"2026-09-09T15:33:41.000Z","value":"9.8 critical","meaning":"GitHub source severity; exploitability and local consequence require separate evidence.","source_id":"sr-5f0a4655539dd48aecbfe70809a46114"}],"why_it_matters":"Published affected context helps an owner decide what evidence to gather. This report has not examined your application.","related_sources":[{"id":"sr-5f0a4655539dd48aecbfe70809a46114","url":"https://github.com/advisories/GHSA-cx4m-2p55-rw7j","basis":"vendor_advisory","notes":"GitHub Advisory Database; CC-BY-4.0. Each advisory links its original attribution. Null normalizes fields.","title":"GHSA-cx4m-2p55-rw7j","publisher":"GitHub Advisory Database","observed_at":"2026-11-01T22:54:12.705Z"}],"affected_context":[{"certainty":"source_listed","source_ids":["sr-5f0a4655539dd48aecbfe70809a46114"],"technology":"org.apache.opennlp:opennlp-tools","known_exclusions":[],"conditions_summary":"Versions Affected: before 1.9.5, before 2.5.9, before 3.0.0-M3\n\nDescription: \n\nThe 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. \n\nClass.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. \n\nExploitation 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","public_affected_ranges":[">= 3.0.0-M1, < 3.0.0-M3"]},{"certainty":"source_listed","source_ids":["sr-5f0a4655539dd48aecbfe70809a46114"],"technology":"org.apache.opennlp:opennlp-tools","known_exclusions":[],"conditions_summary":"Versions Affected: before 1.9.5, before 2.5.9, before 3.0.0-M3\n\nDescription: \n\nThe 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. \n\nClass.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. \n\nExploitation 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","public_affected_ranges":[">= 2.0.0, < 2.5.9"]},{"certainty":"source_listed","source_ids":["sr-5f0a4655539dd48aecbfe70809a46114"],"technology":"org.apache.opennlp:opennlp-tools","known_exclusions":[],"conditions_summary":"Versions Affected: before 1.9.5, before 2.5.9, before 3.0.0-M3\n\nDescription: \n\nThe 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. \n\nClass.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. \n\nExploitation 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","public_affected_ranges":["< 1.9.5"]}],"null_published_at":"2026-11-03T10:03:31.351Z","source_updated_at":"2026-09-09T15:33:41.000Z","source_disclosed_at":"2026-05-04T18:30:31.000Z","is_synthetic_fixture":false,"null_last_reviewed_at":null,"public_change_summary":"First indexed by Null; source disclosure date is shown separately.","null_first_observed_at":"2026-11-01T22:54:12.705Z"}],"next_cursor":null,"snapshot_revision":"42594"}