Capacitor (Android および iOS): リモートコンテンツは、アプリのオリジン経由で、内部のHTTPプロキシパスを通じて読み込まれる可能性があります。
### 影響
CapacitorのWebViewナビゲーションガードは、ターゲットURLの**ホストとスキーム**のみを検証し、**パス**は検証していませんでした。内部のHTTPプロキシパス (`/_capacitor_http_interceptor_`) がアプリケーション自身のオリジンで提供されるため、そのパスへのフレームナビゲーションは常にアプリ内ナビゲーションとして扱われ、許可されていました。
そのパスをドキュメントとして読み込むと、ネイティブレイヤーが任意の、呼び出し元が指定したURLを取得し、そのレスポンスボディをWebViewに**アプリケーション自身のオリジン**で返していました。そのレスポンスに含まれるスクリプトは、完全な同一オリジンポリシーに基づいて実行され、`localStorage`、Cookie、およびアプリケーションが登録されたCapacitorプラグインを通じて公開するすべてのネイティブ機能にアクセスできました。
プロキシハンドラーは、`CapacitorHttp`プラグインが有効になっているかどうかに関係なく提供されていたため、`CapacitorHttp`を有効にしていなかったアプリケーションも影響を受けました。
この脆弱性を悪用するには、被害者がアプリケーション内のWebViewにあるリンクをアクティブにする必要があります。ユーザーが制御するリンクや、サニタイズされていないリンク(チャットメッセージ、コメント、リッチテキストコンテンツなど)を表示するCapacitorアプリケーションは、攻撃を受ける可能性があります。
**AndroidとiOSの両方**が影響を受けます。
### 修正
各プラットフォームで以下の2つの変更が加えられました。
1. ナビゲーションガードは、パスが内部プロキシパスであるフレームナビゲーションをブロックするようになりました。
2. プロキシハンドラーは、`CapacitorHttp`が有効になっている場合にのみ提供され、ドキュメント(メインフレーム)リクエストには提供されません。
`CapacitorHttp`の正当な使用には影響はありません。`fetch`や`XMLHttpRequest`は、サブリソースリクエストであり、ナビゲーションガードを通過しません。
修正されたバージョンにアップグレードし、アプリケーションを再ビルドして再配布してください。
### 対策
すぐにアップグレードできない場合は、影響を受けるバージョンでは、`CapacitorHttp`を無効にしても不十分であることに注意してください。なぜなら、プロキシパスは設定に関係なく提供されるからです。
登録されたプラグインは、ナビゲーションガードが実行される前に参照されます。そのため、小さなプラグインでもパスをブロックする可能性があります。Androidでは、`shouldOverrideLoad(Uri url)`をオーバーライドし、`url.getPath()`が`/_capacitor_http_interceptor_`で始まる場合に`true`を返します。iOSでは、`shouldOverrideLoad(_:)`を実装し、同じパスに対して`true`を返します。`true`を返すことでナビゲーションがキャンセルされます。他のすべてのURLに対しては、`null`/`nil`を返すようにしてください。これにより、通常のナビゲーションは変更されません。
また、WebViewでレンダリングする前に、ユーザーが制御するリンクのターゲットを検証してください。
影響を受けるパッケージ:
- npm (JavaScript) @capacitor/android: 影響を受けるバージョン >= 6.0.0、< 6.2.2、修正済みバージョン 6.2.2
- npm (JavaScript) @capacitor/android: 影響を受けるバージョン >= 7.0.0、< 7.6.9、修正済みバージョン 7.6.9
- npm (JavaScript) @capacitor/ios: 影響を受けるバージョン >= 6.0.0、< 6.2.2、修正済みバージョン 6.2.2
- npm (JavaScript) @capacitor/ios: 影響を受けるバージョン >= 7.0.0、< 7.6.9、修正済みバージョン 7.6.9
- swift github.com/ionic-team/capacitor-swift-pm: 影響を受けるバージョン >= 6.0.0、< 6.2.2、修正済みバージョン 6.2.2
- swift github.com/ionic-team/capacitor-swift-pm: 影響を受けるバージョン >= 7.0.0、< 7.6.9、修正済みバージョン 7.6.9
- maven com.capacitorjs:core: 影響を受けるバージョン >= 6.0.0、< 6.2.2、修正済みバージョン 6.2.2
- maven com.capacitorjs:core: 影響を受けるバージョン >= 7.0.0、< 7.6.9、修正済みバージョン 7.6.9
- npm (JavaScript) @capacitor/android: 影響を受けるバージョン >= 8.5.0、< 8.5.1、修正済みバージョン 8.5.1
- npm (JavaScript) @capacitor/ios: 影響を受けるバージョン >= 8.5.0、< 8.5.1、修正済みバージョン 8.5.1
- swift github.com/ionic-team/capacitor-swift-pm: 影響を受けるバージョン >= 8.5.0、< 8.5.1、修正済みバージョン 8.5.1
- maven com.capacitorjs:core: 影響を受けるバージョン >= 8.5.0、< 8.5.1、修正済みバージョン 8.5.1
- maven com.capacitorjs:core: 影響を受けるバージョン >= 8.3.5、< 8.4.3、修正済みバージョン 8.4.3
- npm (JavaScript) @capacitor/android: 影響を受けるバージョン >= 8.3.5、< 8.4.3、修正済みバージョン 8.4.3
- npm (JavaScript) @capacitor/ios: 影響を受けるバージョン >= 8.3.5、< 8.4.3、修正済みバージョン 8.4.3
- swift github.com/ionic-team/capacitor-swift-pm: 影響を受けるバージョン >= 8.3.5、< 8.4.3、修正済みバージョン 8.4.3
- swift github.com/ionic-team/capacitor-swift-pm: 影響を受けるバージョン >= 8.0.0、<= 8.3.4、修正済みバージョン なし
- maven com.capacitorjs:core: 影響を受けるバージョン >= 8.0.0、<= 8.3.4、修正済みバージョン なし
- npm (JavaScript) @capacitor/android: 影響を受けるバージョン >= 8.0.0、<= 8.3.4、修正済みバージョン なし
- npm (JavaScript) @capacitor/ios: 影響を受けるバージョン >= 8.0.0、<= 8.3.4、修正済みバージョン なし