
WebKit NavigateEvent.canIntercept の SOP バイパス(クロスポートインターセプション経由)— iOS 26.3.1 BSI (CVE-2026-20643)
| CVE | CVE-2026-20643 |
| 発見者 | Thomas Espach(WebKit Bugzilla 306050) |
| 対象コンポーネント | WebKit — WebCore::Navigation::innerDispatchNavigateEvent |
| 影響を受けるバージョン | iOS 26.3.1 ビルド 23D8133(iPhone18,2) |
| 分類 | SOPバイパス |
| 操作条件 | クリック / リンク操作 |
| 確認方法 | 脆弱性版と修正版の WebCore のバイナリ差分 |
NavigateEvent.canIntercept は、オリジンが異なる同一サイト内のクロスポートナビゲーションに対して、誤って true を返します。この傍受ゲートは、同一サイトチェック後に、スキーム・ホスト・ポートがすべて一致することを検証せずに、あらゆるHTTPファミリーのターゲットを受け入れてしまいます。これにより、攻撃者が制御するページが、オリジンの境界を越えるべきナビゲーションを傍受または抑止できるようになります。
// WebCore::Navigation::innerDispatchNavigateEvent — 0x1a1303304 (iOS 26.3.1 / 23D8133)
if (!isSameSite && !isSameOrigin)
return false;
if (targetURL.protocolIsInHTTPFamily())
return true; // ← no port/host/scheme component equality check
// cross-port navigations (e.g. :8000 → :8800) slip through
WebKit 本流の修正では、傍受を許可する前に、コンポーネント単位の厳密な等価性(スキーム / ユーザー / パスワード / ホスト / ポート)が追加されています。
poc_min.html をポート 8000 で配信し、影響を受けるデバイスで開きます。
python3 -m http.server 8000
# http://127.0.0.1:8000/poc_min.html
Run PoC をクリックします。ページがクロスポートナビゲーション(:8000 → :8800)をトリガーし、次のように表示されます。
Vulnerable: canIntercept=true
Patched: canIntercept=false
| ファイル | |
|---|---|
findings.md | 完全な根本原因の解説とリバースエンジニアリング(RE)による証拠 |
poc_min.html | 自己完結型の検出用 PoC |