{"schema":"threatline.record/2","record":{"id":"CVE-2026-113730","aliases":["GHSA-crwc-vw2r-qr6m"],"summary":"OGNL stricter-invocation block list bypass via java.lang.reflect reflection proxies","details":"### Summary\n\nOGNL's optional *stricter invocation* mode maintains a block list that prevents expressions from directly calling methods on dangerous classes such as `Runtime`, `ProcessBuilder`, and `ClassLoader`. The block list filters on the **declaring class of the method OGNL invokes**. Because `java.lang.reflect.Method` (and `Constructor`/`Field`) are not on the list, an expression can use reflection as a proxy — `someMethod.invoke(target, args)` — to reach a blocked method. The real call (e.g. `ProcessBuilder.start()`) then executes inside the JDK reflection machinery and never passes back through OGNL's `invokeMethod`, so the block list never sees it.\n\n### Proof of concept\n\nUnder the default OGNL context (public-only access, stricter invocation enabled), the following expression creates a file even though a direct `new ProcessBuilder(...).start()` is blocked:\n\n```\n(#pb=new java.lang.ProcessBuilder({\"/usr/bin/touch\",\"rce-proof.txt\"}),\n #methods=@java.lang.ProcessBuilder@class.getMethods(),\n #names=#methods.{ #this.getName() },\n #startIdx=#names.indexOf(\"start\"),\n #methods[#startIdx].invoke(#pb, null))\n```\n\n### Impact and scope — please read carefully\n\n**This is hardening of a defense-in-depth secondary layer, not a break of OGNL's primary security boundary.**\n\nIn OGNL the stricter-invocation block list is a *secondary* mitigation. The **primary** access-control gate is the `MemberAccess` implementation supplied by the integrating framework or application, which OGNL consults on every constructor and method call. Frameworks that evaluate untrusted expressions are expected to install a restrictive `MemberAccess` — for example, Apache Struts' `SecurityMemberAccess`, which excludes dangerous classes and the `java.lang.reflect` package. Against such a `MemberAccess` this PoC is blocked at the very first step (the `new ProcessBuilder(...)` constructor), before reflection is ever reachable.\n\nThe default context that ships with OGNL intentionally allows all public members and is **not** designed to sandbox untrusted input. An application that evaluates attacker-controlled expressions with that permissive default already has many paths to code execution, and this technique is not required to achieve it.\n\n**You are affected only if all of the following hold:** (1) your application evaluates untrusted/attacker-controlled OGNL expressions, (2) it uses OGNL's default permissive `MemberAccess` (or an equivalently permissive one that allows `java.lang.reflect`), and (3) it relies on the stricter-invocation block list as its sandbox. **Properly configured consumers — including Apache Struts with its `SecurityMemberAccess` — are not affected.** The actual protection for untrusted-expression scenarios remains a correctly configured `MemberAccess`; the block list should not be treated as a sandbox.\n\n### Fix\n\n`java.lang.reflect.Method`, `java.lang.reflect.Constructor`, and `java.lang.reflect.Field` are added to the stricter-invocation block list, so reflection objects can no longer be used as invocation proxies in stricter mode. The `java.lang.invoke.MethodHandle` path was verified not to be exploitable (its signature-polymorphic `invoke`/`invokeExact` fail through OGNL's reflection-based invocation), so no additional classes are required.\n\n### Credit\n\nReported responsibly through Tidelift by 毛锐 (youyi.mr@alibaba-inc.com).","categories":["Libraries & packages"],"product":"ognl:ognl","vendor":"orphan-oss","ecosystem":"maven","affected_ranges":[{"source":"GitHub Advisory Database","source_url":"https://github.com/advisories/GHSA-crwc-vw2r-qr6m","source_modified_at":"2026-10-21T16:31:05Z","fetched_at":"2026-10-23T18:42:43.628194Z","package":{"ecosystem":"maven","name":"ognl:ognl"},"range":"<= 3.4.12"},{"source":"CVE List","source_url":"https://www.cve.org/CVERecord?id=CVE-2026-113730","source_modified_at":"2026-10-21T15:51:56.220Z","fetched_at":"2026-10-23T18:45:31.882637Z","product":"ognl","vendor":"orphan-oss","versions":[{"version":"< 3.4.13","status":"affected"}],"defaultStatus":null},{"source":"OSV","source_url":"https://osv.dev/vulnerability/GHSA-crwc-vw2r-qr6m","source_modified_at":"2026-10-21T16:45:04.303510159Z","fetched_at":"2026-10-23T18:42:43.628194Z","package":{"ecosystem":"Maven","name":"ognl:ognl","purl":"pkg:maven/ognl/ognl"},"ranges":[{"events":[{"introduced":"0"},{"fixed":"3.4.13"}],"type":"ECOSYSTEM"}],"versions":["2.1.4","2.2.2","2.3.2","2.4.1","2.5.1","2.6.3","2.6.5","2.6.7","2.6.9","2.7","2.7.1","2.7.2","2.7.3","3.0","3.0.1","3.0.10","3.0.11","3.0.12","3.0.13","3.0.14","3.0.15","3.0.16","3.0.17","3.0.18","3.0.19","3.0.2","3.0.20","3.0.21","3.0.3","3.0.4","3.0.5","3.0.6","3.0.6.1","3.0.6.2","3.0.7","3.0.8","3.0.9","3.1","3.1.1","3.1.10","3.1.11","3.1.12","3.1.14","3.1.15","3.1.16","3.1.17","3.1.18","3.1.19","3.1.2","3.1.20"]}],"fixed_versions":[{"source":"GitHub Advisory Database","source_url":"https://github.com/advisories/GHSA-crwc-vw2r-qr6m","source_modified_at":"2026-10-21T16:31:05Z","fetched_at":"2026-10-23T18:42:43.628194Z","package":{"ecosystem":"maven","name":"ognl:ognl"},"version":"3.4.13"},{"source":"OSV","source_url":"https://osv.dev/vulnerability/GHSA-crwc-vw2r-qr6m","source_modified_at":"2026-10-21T16:45:04.303510159Z","fetched_at":"2026-10-23T18:42:43.628194Z","package":{"ecosystem":"Maven","name":"ognl:ognl","purl":"pkg:maven/ognl/ognl"},"version":"3.4.13"}],"cvss":5.6,"severity":"Medium","kev":{"listed":false},"epss":{"probability":0.00358,"percentile":0.28377,"score_date":"2026-10-23"},"published_at":"2026-10-20T21:24:24.093Z","modified_at":"2026-10-21T16:45:04.303510159Z","provenance":[{"source":"GitHub Advisory Database","url":"https://github.com/advisories/GHSA-crwc-vw2r-qr6m","fetched_at":"2026-10-23T18:42:43.628194Z","source_modified_at":"2026-10-21T16:31:05Z"},{"source":"CVE List","url":"https://www.cve.org/CVERecord?id=CVE-2026-113730","fetched_at":"2026-10-23T18:45:31.882637Z","source_modified_at":"2026-10-21T15:51:56.220Z"},{"source":"OSV","url":"https://osv.dev/vulnerability/GHSA-crwc-vw2r-qr6m","fetched_at":"2026-10-23T18:42:43.628194Z","source_modified_at":"2026-10-21T16:45:04.303510159Z"},{"source":"EPSS","url":"https://api.first.org/data/v1/epss?cve=CVE-2026-113730","fetched_at":"2026-10-23T18:42:43.628194Z","source_modified_at":"2026-10-23"}],"sources":["GitHub Advisory Database","CVE List","OSV","EPSS"],"references":[{"source":"CVE List","url":"https://github.com/orphan-oss/ognl/security/advisories/GHSA-crwc-vw2r-qr6m","tags":["x_refsource_CONFIRM"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-113730","source":"GitHub Advisory Database"},{"source":"CVE List","url":"https://github.com/orphan-oss/ognl/commit/16396fa4b560221294c2ab9ca04b76b161115e7d","tags":["x_refsource_MISC"]},{"source":"CVE List","url":"https://github.com/orphan-oss/ognl/commit/f4c17f794754d516ea799c36ed8524d1b7fb98e2","tags":["x_refsource_MISC"]},{"source":"CVE List","url":"https://github.com/orphan-oss/ognl/releases/tag/OGNL_3_4_13","tags":["x_refsource_MISC"]},{"url":"https://github.com/advisories/GHSA-crwc-vw2r-qr6m","source":"GitHub Advisory Database"}],"locations":[],"motoko_assessment":{"status":"requires_architecture_review","automatic_remediation":false},"cve_state":"PUBLISHED","ssvc":{"exploitation":"none","automatable":"no","technical_impact":"partial","assessed_at":"2026-10-21T14:24:48.869617Z"},"classification":{"method":"product-first software-layer rules","rules_version":"2.1","matched_on":"ecosystem","confidence":"heuristic","reviewed":false},"change_timestamp":"2026-10-21T16:45:04.303510159Z","content_hash":"85af4a601deb2c1c678eae0eeeb025d9804b9d63b3ef152d0d7472683cb310ce"}}
