Your RSA-2048 keys break in 2030. Find every one of them before attackers do.
Maven
Not in CISA KEV
HIGH severity

GHSA-fp43-vj7g-pg92

HIGHFix: omnifaces/omnifaces@59d6c51

GHSA-fp43-vj7g-pg92 is a high-severity (CVSS 7.5) vulnerability in org.omnifaces:omnifaces. O3 Security confirms whether GHSA-fp43-vj7g-pg92 is actually reachable in your code before you act, and blocks exploitation at runtime until you patch.

OmniFaces: Forged combined-resource IDs and related output/push boundaries

Published
Jul 24, 2026
Updated
Jul 24, 2026
Affected
5 pkgs
Patched
5 / 5
Exploits
None indexed
Exploitation data as of Jul 24, 2026 · OSV.dev, FIRST.org (EPSS)

Real-World Exposure

5 pkgs affected
org.omnifaces:omnifacesorg.omnifaces:omnifacesorg.omnifaces:omnifacesorg.omnifaces:omnifacesorg.omnifaces:omnifaces

Real-time download stats are indexed for npm and PyPI packages. This vulnerability affects Maven packages — download data is not available via public APIs for these ecosystems.

Description

1. Forged combined-resource IDs

CombinedResourceInfo accepts a path-derived ID without an authenticity check, inflates it without an output limit, converts it to attacker-selected resource identifiers, and retains unique IDs in an unbounded static cache. In bounded tests, 20,754 encoded bytes inflated to 16,000,000 characters (about 770:1; about 49 MB observed heap delta), and 200 unique IDs added 200 permanent cache entries. A legitimately shaped short ID remained about 1:1, while malformed input was rejected; the missing distinction is between a server-issued ID and an attacker-minted but structurally valid ID.

The minimal application also confirmed three sink tails from the same forged-ID root:

  • A wildcard CDN mapping performed a server-side fetch and relayed the exact loopback-canary body. This requires the documented combined-resource and wildcard-CDN configuration.
  • A forged inner .xhtml resource bypassed the excluded-resource boundary and returned its raw content.
  • A forged omnifaces.graphic inner resource plus a canary Host header caused an outbound GET to that host. This result is blind and deployment-dependent; I am not claiming arbitrary-scheme or arbitrary-destination SSRF.

These behaviors reproduce after the fix for CVE-2026-41883 / GHSA-vp6r-9m58-5xv8. That advisory concerned EL evaluation order in the wildcard CDN path. This report has a different root: unsigned combined IDs and missing decode/cache bounds, with separately demonstrated residual sink behavior.

2. Source-map cache

With the documented optional source-map handler above a synthetic resource handler, 40 unique missing combined-resource requests grew the process-wide source-map cache from 13 to 92 entries. It has no size or eviction bound. This has a separate cache, configuration prerequisite, and fix from family 1.

3. HashParam callback output

A URL-fragment value containing a single-quote JavaScript payload was stored by o:hashParam and later written unescaped into the Ajax callback script. On the follow-up Ajax render, real Chrome executed the canary window.__omniXss=1337. This requires a page using o:hashParam and the follow-up Ajax render.

4. Session/view push-channel replay

A fresh WebSocket client with no HTTP cookie connected using a victim's session-scoped channel ID and received the victim's subsequent push. The code checks application-wide ID existence but does not bind the handshake to the current HTTP session, despite the documented current-session guarantee. The UUID remains an unguessable bearer-token prerequisite; this is replay after token exposure, not brute force.

5. Push idle-connection and fanout behavior

Twelve independent clients joined one application-scoped channel and all 12 received the same push. Current code sets every accepted session's maximum idle timeout to zero, retains sessions in an unbounded per-channel queue, and walks the full queue on each push. I am reporting the demonstrated mechanism as a bounded design weakness: container connection limits remain an outer bound, and I am not claiming unbounded heap growth from the 12-client test.

Intentionally excluded leads

  • A duplicate-Range response-amplification lead was disproved. Twenty-four ranges produced only one response body because the stream wrapper closes after the first range. I am not reporting it as a security issue.
  • The older Servlets.facesRedirect XML issue is fixed on the current branch. I am not reporting it as a new current-upstream issue.

Expected invariants

  • Only server-issued combined IDs should be accepted; decoding and caches should be bounded; excluded resources and dynamic handlers should not become attacker-selected inner resources.
  • Dynamic URLs should not derive an outbound destination from an untrusted Host header.
  • Source-map lookups should not create unbounded process-lifetime state.
  • HashParam values must be escaped for a JavaScript string inside an XML CDATA callback.
  • Session/view push subscriptions should be bound to the owning HTTP session or authenticated principal; idle limits and per-channel caps should remain operator-controllable.

Suggested fixes and available evidence

  • Authenticate generated combined IDs with a per-deployment secret, cap inflated output, bound the combined cache, and avoid caching failed loads.
  • Require an existing/registered inner resource before wildcard remapping and reject excluded resource types at serve time.
  • Derive dynamic-resource origins from trusted configuration rather than the request Host value.
  • Bound or evict the source-map cache.
  • Apply JavaScript-string plus CDATA-safe encoding to HashParam callback values.
  • Capture and verify HTTP-session or principal ownership during the WebSocket handshake; retain a finite idle timeout and configurable per-channel limits.

Daniel Birtwhistle

Affected Packages

5 total 5 fixed
EcosystemPackageVulnerable rangeFix
Mavenorg.omnifaces:omnifacesall versions1.14.3
Mavenorg.omnifaces:omnifaces2.0.0&&< 2.7.332.7.33
Mavenorg.omnifaces:omnifaces3.0.0&&< 3.14.233.14.23
Mavenorg.omnifaces:omnifaces4.0.0&&< 4.7.124.7.12
Mavenorg.omnifaces:omnifaces5.0.0&&< 5.4.25.4.2

Detection & mitigation playbook

Open-source dependency
  1. Detect

    Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for org.omnifaces:omnifaces. O3's reachability analysis confirms whether the vulnerable code path is actually invoked in your application, so you act on real exposure instead of every transitive match.

  2. Fix

    Update org.omnifaces:omnifaces to 1.14.3 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms GHSA-fp43-vj7g-pg92 is resolved across your whole dependency graph.

  3. Workarounds

    If you can't upgrade right away: gate or disable the affected feature, validate untrusted input at the boundary, and avoid passing attacker-controlled data into the vulnerable path. O3's runtime protection blocks exploitation in production as an interim safeguard until the upgrade lands.

  4. How O3 protects you

    O3 pinpoints whether GHSA-fp43-vj7g-pg92 is reachable in your code and exactly where to fix it, then blocks exploitation in production at runtime until the patched version is deployed.

Tailored to GHSA-fp43-vj7g-pg92. Runtime protection reduces exposure until a permanent patch is applied and verified — it complements patching, it doesn't replace it.

Frequently Asked Questions

## 1. Forged combined-resource IDs `CombinedResourceInfo` accepts a path-derived ID without an authenticity check, inflates it without an output limit, converts it to attacker-selected resource identifiers, and retains unique IDs in an unbounded static cache. In bounded tests, 20,754 encoded bytes inflated to 16,000,000 characters (about 770:1; about 49 MB observed heap delta), and 200 unique IDs added 200 permanent cache entries. A legitimately shaped short ID remained about 1:1, while malformed input was rejected; the missing distinction is between a server-issued ID and an attacker-minted b
O3 Security · Impact-Aware SCA

Is GHSA-fp43-vj7g-pg92 in your dependencies?

O3 detects GHSA-fp43-vj7g-pg92 across Maven dependencies and uses function-level reachability to confirm whether the vulnerable code path is actually reachable — not just present. No false positives.

GHSA-fp43-vj7g-pg92: omnifaces Server-Side… | O3 Security