GHSA-rvm3-566m-v7fv
Capacitor Android and iOS: remote content can be loaded at the app origin via the internal HTTP proxy path
At a glance
- Published
- Updated
- CVE
- CVE-2026-103922
- CVSS_V3
- CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N
Description
### Impact Capacitor's WebView navigation guard validated only the **host and scheme** of a target URL, not its **path**. Because the internal HTTP proxy path (`/_capacitor_http_interceptor_`) is served at the application's own origin, a frame navigation to it was always treated as in-app navigation and allowed. Loading that path as a document caused the native layer to fetch an arbitrary, caller-specified URL and return the response body to the WebView **at the app's own origin**. Script in that response then ran with full same-origin trust: access to `localStorage`, cookies, and every native capability the application exposes through its registered Capacitor plugins. The proxy handler was additionally served **regardless of whether the `CapacitorHttp` plugin was enabled**, so applications that never enabled `CapacitorHttp` were also affected. Exploitation requires a victim to activate a link inside the application's WebView. Any Capacitor application that renders user-controlled or unsanitized links (chat messages, comments, rich-text content) is a viable delivery surface. Both **Android and iOS** are affected. ### Patches Two changes on each platform: 1. The navigation guard now blocks frame navigations whose path is the internal proxy path. 2. The proxy handler is served only when `CapacitorHttp` is enabled, and never for a document (main frame) request. Legitimate `CapacitorHttp` usage is unaffected. `fetch` and `XMLHttpRequest` are subresource requests and do not pass through the navigation guard. Upgrade to a patched version, then rebuild and redistribute your application. ### Workarounds If you cannot upgrade immediately, note first that **disabling `CapacitorHttp` is not sufficient** on affected versions, because the proxy path is served regardless of that setting. Registered plugins are consulted before the navigation guard runs, so a small plugin can block the path. On Android, override `shouldOverrideLoad(Uri url)` and return `true` when `url.getPath()` starts with `/_capacitor_http_interceptor_`. On iOS, implement `shouldOverrideLoad(_:)` and return `true` for the same path. Returning `true` cancels the navigation; return `null`/`nil` for all other URLs so normal navigation is unchanged. Independently, sanitize user-controlled link targets before rendering them in the WebView.
Affected packages
| Package | Versions |
|---|---|
| npm · @capacitor/android | introduced 6.0.0, fixed 6.2.2 |
| npm · @capacitor/android | introduced 7.0.0, fixed 7.6.9 |
| npm · @capacitor/ios | introduced 6.0.0, fixed 6.2.2 |
| npm · @capacitor/ios | introduced 7.0.0, fixed 7.6.9 |
| SwiftURL · github.com/ionic-team/capacitor-swift-pm | introduced 6.0.0, fixed 6.2.2 |
| SwiftURL · github.com/ionic-team/capacitor-swift-pm | introduced 7.0.0, fixed 7.6.9 |
| Maven · com.capacitorjs:core | introduced 6.0.0, fixed 6.2.2 |
| Maven · com.capacitorjs:core | introduced 7.0.0, fixed 7.6.9 |
| npm · @capacitor/android | introduced 8.5.0, fixed 8.5.1 |
| npm · @capacitor/ios | introduced 8.5.0, fixed 8.5.1 |
| SwiftURL · github.com/ionic-team/capacitor-swift-pm | introduced 8.5.0, fixed 8.5.1 |
| Maven · com.capacitorjs:core | introduced 8.5.0, fixed 8.5.1 |
| Maven · com.capacitorjs:core | introduced 8.3.5, fixed 8.4.3 |
| npm · @capacitor/android | introduced 8.3.5, fixed 8.4.3 |
| npm · @capacitor/ios | introduced 8.3.5, fixed 8.4.3 |
| SwiftURL · github.com/ionic-team/capacitor-swift-pm | introduced 8.3.5, fixed 8.4.3 |
| SwiftURL · github.com/ionic-team/capacitor-swift-pm | introduced 8.0.0, last affected 8.3.4 |
| Maven · com.capacitorjs:core | introduced 8.0.0, last affected 8.3.4 |
| npm · @capacitor/android | introduced 8.0.0, last affected 8.3.4 |
| npm · @capacitor/ios | introduced 8.0.0, last affected 8.3.4 |
References
- https://github.com/ionic-team/capacitor/security/advisories/GHSA-rvm3-566m-v7fv WEB
- https://nvd.nist.gov/vuln/detail/CVE-2026-103922 ADVISORY
- https://github.com/ionic-team/capacitor/commit/430356a91e1419fc66862dc09835081aa501677e WEB
- https://github.com/ionic-team/capacitor/commit/745b5f805bf77bc6463977cc7d718cd9de44ccbc WEB
- https://github.com/ionic-team/capacitor/commit/80b6c5e81d062e1e158914040f49e044d95b7ccb WEB
- https://github.com/ionic-team/capacitor/commit/85ccc44151fdd5ae5e0d806d875766ef4b84ad5d WEB
- https://github.com/ionic-team/capacitor/commit/af9a287fef45f0ac68ce640cb42fed2d06b0f1b4 WEB
- https://github.com/ionic-team/capacitor/commit/d5e3170ba0ff155fc542b7e6d16cff5201406540 WEB
- https://github.com/ionic-team/capacitor/commit/ee586ae680887ba99d066616f976db149542d922 WEB
- https://github.com/ionic-team/capacitor PACKAGE
- https://github.com/ionic-team/capacitor/releases/tag/8.5.1 WEB
Sources
| Source | Licence |
|---|---|
| OSV.dev | CC-BY 4.0 — GitHub Advisory Database |