OGNL stricter-invocation block list bypass via java.lang.reflect reflection proxies
CVE-2026-113730 · GHSA-crwc-vw2r-qr6m
- Affected
- Maven ognl:ognl < 3.4.13
- Fixed in
- 3.4.13· Vendor fix available
- Issue
- OGNL'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. Proof of concept Under 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: ``` (#pb=new java.lang.ProcessBuilder({"/usr/bin/touch","rce-proof.txt"}),…
Recommended action: Upgrade to 3.4.13 or later, then redeploy and verify.A vendor fix does not resolve your finding until you verify it in your own systems.