{"id":"GHSA-rvm3-566m-v7fv","summary":"Capacitor Android and iOS: remote content can be loaded at the app origin via the internal HTTP proxy path","details":"### Impact\n\nCapacitor's WebView navigation guard validated only the **host and scheme** of a\ntarget URL, not its **path**. Because the internal HTTP proxy path\n(`/_capacitor_http_interceptor_`) is served at the application's own origin, a\nframe navigation to it was always treated as in-app navigation and allowed.\n\nLoading that path as a document caused the native layer to fetch an arbitrary,\ncaller-specified URL and return the response body to the WebView **at the app's\nown origin**. Script in that response then ran with full same-origin trust:\naccess to `localStorage`, cookies, and every native capability the application\nexposes through its registered Capacitor plugins.\n\nThe proxy handler was additionally served **regardless of whether the\n`CapacitorHttp` plugin was enabled**, so applications that never enabled\n`CapacitorHttp` were also affected.\n\nExploitation requires a victim to activate a link inside the application's\nWebView. Any Capacitor application that renders user-controlled or unsanitized\nlinks (chat messages, comments, rich-text content) is a viable delivery surface.\n\nBoth **Android and iOS** are affected.\n\n### Patches\n\nTwo changes on each platform:\n\n1. The navigation guard now blocks frame navigations whose path is the internal\n   proxy path.\n2. The proxy handler is served only when `CapacitorHttp` is enabled, and never\n   for a document (main frame) request.\n\nLegitimate `CapacitorHttp` usage is unaffected. `fetch` and `XMLHttpRequest` are\nsubresource requests and do not pass through the navigation guard.\n\nUpgrade to a patched version, then rebuild and redistribute your application.\n\n### Workarounds\n\nIf you cannot upgrade immediately, note first that **disabling `CapacitorHttp`\nis not sufficient** on affected versions, because the proxy path is served\nregardless of that setting.\n\nRegistered plugins are consulted before the navigation guard runs, so a small\nplugin can block the path. On Android, override `shouldOverrideLoad(Uri url)` and\nreturn `true` when `url.getPath()` starts with `/_capacitor_http_interceptor_`.\nOn iOS, implement `shouldOverrideLoad(_:)` and return `true` for the same path.\nReturning `true` cancels the navigation; return `null`/`nil` for all other URLs\nso normal navigation is unchanged.\n\nIndependently, sanitize user-controlled link targets before rendering them in the\nWebView.","aliases":["CVE-2026-103922"],"modified":"2026-10-05T23:00:05.499076955Z","published":"2026-10-05T22:53:10Z","database_specific":{"cwe_ids":["CWE-346","CWE-441"],"severity":"CRITICAL","github_reviewed":true,"github_reviewed_at":"2026-10-05T22:53:10Z","nvd_published_at":"2026-10-01T18:17:12Z"},"references":[{"type":"WEB","url":"https://github.com/ionic-team/capacitor/security/advisories/GHSA-rvm3-566m-v7fv"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-103922"},{"type":"WEB","url":"https://github.com/ionic-team/capacitor/commit/430356a91e1419fc66862dc09835081aa501677e"},{"type":"WEB","url":"https://github.com/ionic-team/capacitor/commit/745b5f805bf77bc6463977cc7d718cd9de44ccbc"},{"type":"WEB","url":"https://github.com/ionic-team/capacitor/commit/80b6c5e81d062e1e158914040f49e044d95b7ccb"},{"type":"WEB","url":"https://github.com/ionic-team/capacitor/commit/85ccc44151fdd5ae5e0d806d875766ef4b84ad5d"},{"type":"WEB","url":"https://github.com/ionic-team/capacitor/commit/af9a287fef45f0ac68ce640cb42fed2d06b0f1b4"},{"type":"WEB","url":"https://github.com/ionic-team/capacitor/commit/d5e3170ba0ff155fc542b7e6d16cff5201406540"},{"type":"WEB","url":"https://github.com/ionic-team/capacitor/commit/ee586ae680887ba99d066616f976db149542d922"},{"type":"PACKAGE","url":"https://github.com/ionic-team/capacitor"},{"type":"WEB","url":"https://github.com/ionic-team/capacitor/releases/tag/8.5.1"}],"affected":[{"package":{"name":"@capacitor/android","ecosystem":"npm","purl":"pkg:npm/%40capacitor/android"},"ranges":[{"type":"SEMVER","events":[{"introduced":"6.0.0"},{"fixed":"6.2.2"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-rvm3-566m-v7fv/GHSA-rvm3-566m-v7fv.json"}},{"package":{"name":"@capacitor/android","ecosystem":"npm","purl":"pkg:npm/%40capacitor/android"},"ranges":[{"type":"SEMVER","events":[{"introduced":"7.0.0"},{"fixed":"7.6.9"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-rvm3-566m-v7fv/GHSA-rvm3-566m-v7fv.json"}},{"package":{"name":"@capacitor/ios","ecosystem":"npm","purl":"pkg:npm/%40capacitor/ios"},"ranges":[{"type":"SEMVER","events":[{"introduced":"6.0.0"},{"fixed":"6.2.2"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-rvm3-566m-v7fv/GHSA-rvm3-566m-v7fv.json"}},{"package":{"name":"@capacitor/ios","ecosystem":"npm","purl":"pkg:npm/%40capacitor/ios"},"ranges":[{"type":"SEMVER","events":[{"introduced":"7.0.0"},{"fixed":"7.6.9"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-rvm3-566m-v7fv/GHSA-rvm3-566m-v7fv.json"}},{"package":{"name":"github.com/ionic-team/capacitor-swift-pm","ecosystem":"SwiftURL","purl":"pkg:swift/github.com/ionic-team/capacitor-swift-pm"},"ranges":[{"type":"SEMVER","events":[{"introduced":"6.0.0"},{"fixed":"6.2.2"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-rvm3-566m-v7fv/GHSA-rvm3-566m-v7fv.json"}},{"package":{"name":"github.com/ionic-team/capacitor-swift-pm","ecosystem":"SwiftURL","purl":"pkg:swift/github.com/ionic-team/capacitor-swift-pm"},"ranges":[{"type":"SEMVER","events":[{"introduced":"7.0.0"},{"fixed":"7.6.9"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-rvm3-566m-v7fv/GHSA-rvm3-566m-v7fv.json"}},{"package":{"name":"com.capacitorjs:core","ecosystem":"Maven","purl":"pkg:maven/com.capacitorjs/core"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"6.0.0"},{"fixed":"6.2.2"}]}],"versions":["6.0.0","6.1.0","6.1.1","6.1.2","6.2.0","6.2.1"],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-rvm3-566m-v7fv/GHSA-rvm3-566m-v7fv.json"}},{"package":{"name":"com.capacitorjs:core","ecosystem":"Maven","purl":"pkg:maven/com.capacitorjs/core"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"7.0.0"},{"fixed":"7.6.9"}]}],"versions":["7.0.0","7.0.1","7.1.0","7.2.0","7.3.0","7.4.0","7.4.2","7.4.3","7.4.4","7.4.5","7.5.0","7.6.0","7.6.1","7.6.2","7.6.3","7.6.4","7.6.5","7.6.6","7.6.7","7.6.8"],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-rvm3-566m-v7fv/GHSA-rvm3-566m-v7fv.json"}},{"package":{"name":"@capacitor/android","ecosystem":"npm","purl":"pkg:npm/%40capacitor/android"},"ranges":[{"type":"SEMVER","events":[{"introduced":"8.5.0"},{"fixed":"8.5.1"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-rvm3-566m-v7fv/GHSA-rvm3-566m-v7fv.json"}},{"package":{"name":"@capacitor/ios","ecosystem":"npm","purl":"pkg:npm/%40capacitor/ios"},"ranges":[{"type":"SEMVER","events":[{"introduced":"8.5.0"},{"fixed":"8.5.1"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-rvm3-566m-v7fv/GHSA-rvm3-566m-v7fv.json"}},{"package":{"name":"github.com/ionic-team/capacitor-swift-pm","ecosystem":"SwiftURL","purl":"pkg:swift/github.com/ionic-team/capacitor-swift-pm"},"ranges":[{"type":"SEMVER","events":[{"introduced":"8.5.0"},{"fixed":"8.5.1"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-rvm3-566m-v7fv/GHSA-rvm3-566m-v7fv.json"}},{"package":{"name":"com.capacitorjs:core","ecosystem":"Maven","purl":"pkg:maven/com.capacitorjs/core"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"8.5.0"},{"fixed":"8.5.1"}]}],"versions":["8.5.0"],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-rvm3-566m-v7fv/GHSA-rvm3-566m-v7fv.json"}},{"package":{"name":"com.capacitorjs:core","ecosystem":"Maven","purl":"pkg:maven/com.capacitorjs/core"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"8.3.5"},{"fixed":"8.4.3"}]}],"versions":["8.4.0","8.4.1","8.4.2"],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-rvm3-566m-v7fv/GHSA-rvm3-566m-v7fv.json"}},{"package":{"name":"@capacitor/android","ecosystem":"npm","purl":"pkg:npm/%40capacitor/android"},"ranges":[{"type":"SEMVER","events":[{"introduced":"8.3.5"},{"fixed":"8.4.3"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-rvm3-566m-v7fv/GHSA-rvm3-566m-v7fv.json"}},{"package":{"name":"@capacitor/ios","ecosystem":"npm","purl":"pkg:npm/%40capacitor/ios"},"ranges":[{"type":"SEMVER","events":[{"introduced":"8.3.5"},{"fixed":"8.4.3"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-rvm3-566m-v7fv/GHSA-rvm3-566m-v7fv.json"}},{"package":{"name":"github.com/ionic-team/capacitor-swift-pm","ecosystem":"SwiftURL","purl":"pkg:swift/github.com/ionic-team/capacitor-swift-pm"},"ranges":[{"type":"SEMVER","events":[{"introduced":"8.3.5"},{"fixed":"8.4.3"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-rvm3-566m-v7fv/GHSA-rvm3-566m-v7fv.json"}},{"package":{"name":"github.com/ionic-team/capacitor-swift-pm","ecosystem":"SwiftURL","purl":"pkg:swift/github.com/ionic-team/capacitor-swift-pm"},"ranges":[{"type":"SEMVER","events":[{"introduced":"8.0.0"},{"last_affected":"8.3.4"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-rvm3-566m-v7fv/GHSA-rvm3-566m-v7fv.json"}},{"package":{"name":"com.capacitorjs:core","ecosystem":"Maven","purl":"pkg:maven/com.capacitorjs/core"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"8.0.0"},{"last_affected":"8.3.4"}]}],"versions":["8.0.0","8.0.1","8.0.2","8.1.0","8.2.0","8.3.0","8.3.1","8.3.2","8.3.3","8.3.4"],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-rvm3-566m-v7fv/GHSA-rvm3-566m-v7fv.json"}},{"package":{"name":"@capacitor/android","ecosystem":"npm","purl":"pkg:npm/%40capacitor/android"},"ranges":[{"type":"SEMVER","events":[{"introduced":"8.0.0"},{"last_affected":"8.3.4"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-rvm3-566m-v7fv/GHSA-rvm3-566m-v7fv.json"}},{"package":{"name":"@capacitor/ios","ecosystem":"npm","purl":"pkg:npm/%40capacitor/ios"},"ranges":[{"type":"SEMVER","events":[{"introduced":"8.0.0"},{"last_affected":"8.3.4"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-rvm3-566m-v7fv/GHSA-rvm3-566m-v7fv.json"}}],"schema_version":"1.9.0","severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N"}]}