ブラウザサンドボックスとサイト分離の原理
悪意あるページを踏んでも端末が乗っ取られない理由が分かる。レンダラの権限剥奪と OS サンドボックス、そして Spectre すら防ぐサイト分離の信頼境界を原理から解説。
- 1.ブラウザはレンダラプロセスを「権限を捨てた箱」に閉じ込める。HTML/CSS/JS のパースや JIT という攻撃面の広い処理を、ファイルもネットワークも直接触れないプロセスで動かし、特権操作はすべて IPC でブラウザプロセス(ブローカ)に依頼させる。
- 2.閉じ込めは OS のサンドボックス機構で強制する。Linux は seccomp-bpf でシステムコールを許可リスト化し、Windows は AppContainer と低 integrity トークンで権限を剥奪する。レンダラが乗っ取られても、できる操作の集合そのものが狭い。
- 3.Site Isolation は「1サイト=1プロセス」を徹底し、プロセス境界を信頼境界に昇格させる。Spectre のようにメモリ読み取りを完全には防げない攻撃に対し、そもそも他サイトの秘密を同一アドレス空間に置かないことで漏洩を構造的に断つ。
なぜブラウザは「敵のコードを実行する前提」で設計されるのか
ブラウザは特異なソフトウェアです。ユーザーがアクセスするだけで、見知らぬサーバーから届いた HTML・CSS・JavaScript・画像・フォント・WebAssembly を毎秒のように実行します。これらは事実上「信頼できない入力」であり、パーサや JIT コンパイラには毎年のように脆弱性が見つかります。前提を「いつかレンダラは乗っ取られる」と置き、乗っ取られても被害を封じ込める多層防御を敷くのが現代ブラウザの設計思想です。中核がプロセス分離とサンドボックス、そして**サイト分離(Site Isolation)**です。
Chromium 系では役割でプロセスを分けます。**ブラウザプロセス(broker)**は唯一の特権プロセスで、ファイル I/O・ネットワーク・UI・ユーザー認証を扱う。レンダラプロセスは Blink(DOM/レイアウト)と V8(JS)を動かすが、ほぼ全権限を剥奪される。GPU プロセスやネットワークサービスも分離される。攻撃者がまず到達するのは攻撃面の広いレンダラであり、ここを「最も権限の弱い箱」にするのが鍵です。
レンダラの権限剥奪:何もできないプロセスにする
サンドボックスの本質は「やれることを足す」ではなく**「やれることを奪う」**ことです。レンダラは起動直後の初期化(フォントの列挙やライブラリのロード)を終えた瞬間に、自らの権限を能動的に絞り込みます。これを sandbox lockdown と呼びます。剥奪後のレンダラは、ファイルを開けず、任意のネットワーク接続を張れず、他プロセスを生成できず、新しい実行可能メモリを勝手に確保することも制限されます。
ではページの表示に必要な操作(ネットワークから次のリソースを取る、Cookie を読む、ファイルをダウンロードする)はどうするのか。すべてブローカへの IPC 依頼に置き換わります。レンダラは「この URL を取得したい」「この origin の Cookie が欲しい」とメッセージを送り、ブローカがポリシーを照合してから代行する。ここでブローカが行うチェックこそが Same-Origin Policy や Cookie のセキュリティモデルの最終的な強制点です。レンダラ内の JS がいくら細工をしても、境界の判断はレンダラの外で下されます。
[レンダラ:権限ゼロ] [ブローカ:唯一の特権]
fetch("https://api.example/x")
│ IPC: "URLLoaderに取得依頼"
▼
── メッセージ ──────────────▶ origin/CSP/Cookie ポリシー検査
許可なら実際にソケットを開く
◀─ レスポンスのバイト列だけ返す ─┘
この設計の含意は重要です。レンダラのメモリ破壊バグ(メモリ破壊系のエクスプロイト)で攻撃者が任意コードを得ても、得られるのは権限を奪われたプロセスの制御にすぎない。端末を本当に掌握するには、さらにサンドボックスを脱出する第二の脆弱性(ブローカや OS カーネルのバグ)が要る。攻撃の難度が一段跳ね上がります。
OS サンドボックス機構:境界を OS に強制させる
権限剥奪を「お願い」で終わらせず、OS のメカニズムで強制するのがサンドボックスの肝です。プラットフォームごとに使う機構が違います。
Linux:seccomp-bpf。 seccomp(secure computing)モードは、プロセスが発行できるシステムコールを許可リストで絞る仕組みです。seccomp-bpf では、システムコール番号と引数を BPF プログラムで検査し、許可・拒否(SIGSYS で kill、または EPERM 返却)を決めます。レンダラはカーネルとの接点であるシステムコール自体を狭めるため、たとえコード実行を奪われても open connect ptrace clone といった危険な呼び出しがそもそも通らない。Chromium はこれに加え、unprivileged user namespace を使った namespace サンドボックスでファイルシステムや PID 空間を隔離し、二重の壁を作ります。
seccomp-bpf フィルタの考え方(擬似コード):
allow_syscalls = `{read, write, mmap(PROT_EXEC無し), futex, ...}`
if syscall in allow_syscalls and 引数が条件を満たす:
ALLOW
elif syscall in `{open, connect, execve, ptrace, ...}`:
KILL_PROCESS // 即座に SIGSYS で終了
else:
ERRNO(EPERM)
Windows:AppContainer と低 integrity。 Windows は複数の機構を重ねます。古くからの integrity level(プロセスに付くラベル)でレンダラを Low 以下に落とし、より高い integrity のオブジェクトへの書き込みを禁じる。さらに restricted token で SID を無効化し、job object で子プロセス生成やハンドル操作を縛る。近年の主力が AppContainer で、プロセスに専用の SID を与え、明示的に capability を付与されたリソース以外へのアクセスを既定で全拒否します。発想は seccomp と同じ「許可リスト型」で、OS のアクセス制御リスト(ACL)評価のレベルで境界が効きます。
| 観点 | Linux: seccomp-bpf / namespace | Windows: AppContainer / token |
|---|---|---|
| 主な縛りの単位 | システムコールと引数 | オブジェクトへのアクセス権(SID/ACL) |
| 既定の方針 | 許可リスト外は kill / EPERM | capability 外は既定で全拒否 |
| 違反時の挙動 | SIGSYS でプロセス終了 | アクセス拒否(STATUS_ACCESS_DENIED) |
| 補助機構 | user namespace でFS/PID隔離 | 低 integrity・restricted token・job |
| 守る対象 | カーネル攻撃面の縮小 | OSオブジェクトとファイルの隔離 |
サンドボックスは攻撃を不可能にするのではなく、コストを跳ね上げる装置です。レンダラを取った攻撃者は、許可された数少ない IPC・システムコール経由でブローカや OS カーネルのバグを探す。実際の本格的な攻撃チェーンは「レンダラ RCE → サンドボックス脱出 → 権限昇格」と複数の脆弱性を連鎖させます。だからこそ攻撃面を狭め、許可リストを最小に保つことが本番の防御になります。
Site Isolation:プロセス境界を信頼境界に昇格させる
ここまでは「レンダラと OS のあいだ」の壁でした。Site Isolation が守るのはサイト同士のあいだの壁です。導入の直接の引き金が Spectre でした。
問題はこうです。従来のブラウザは効率のため、複数のサイトの文書を同一のレンダラプロセスに同居させることがありました。Same-Origin Policy は JS のセマンティクス上のアクセスを禁じますが、Spectre 系の攻撃は投機的実行の副作用としてプロセスのアドレス空間内の任意バイトを読み出すため、論理的な禁止を飛び越えます。つまり攻撃サイトの JS が、同居する別サイトの Cookie やパスワードを同じプロセスのメモリから盗める。これは サイドチャネル攻撃であり、ソフトのアクセスチェックでは原理的に塞げません。
Site Isolation の答えは単純かつ強力です。「異なるサイトは異なるプロセスに置く」。Spectre でメモリを読めても、読めるのは自プロセス内だけ。他サイトの秘密がそもそも同じアドレス空間に存在しないなら、漏れようがない。プロセス境界(OS が保証する仮想アドレス空間の分離)を、Web の信頼境界として再利用するわけです。
分離の単位は厳密なオリジン(scheme+host+port)ではなく、サイト = scheme + eTLD+1(実効的トップレベルドメイン+1ラベル)です。a.example.com と b.example.com は同じサイトと見なされ同一プロセスに入り得ます。これは document.domain による緩和など既存の Web 仕様との互換のため。より厳密な分離が要る場面では Origin-Agent-Cluster ヘッダでオリジン単位の隔離を要求できます。
実装の難所は、1つのタブが複数サイトを含むクロスサイト iframe です。Site Isolation はこれを out-of-process iframe(OOPIF) として扱い、親フレームと別プロセスでレンダリングしつつ、合成(コンポジット)で1枚の画面に見せます。さらに Spectre が「投機実行で読めてしまうデータ」を減らすため、Cross-Origin Read Blocking(CORB)/ORB がクロスサイトで取得した JSON や HTML をレンダラに渡す前にブローカ側で遮断します。データがレンダラのメモリに載らなければ、投機実行でも読めません。攻撃面を「アクセスチェック」から「データの物理的不在」へ移すのが核心です。
多層防御としての全体像
これら三層は独立ではなく入れ子の信頼境界を成します。最内に JS の論理的境界(Same-Origin Policy)、その外にプロセスとサンドボックス(seccomp/AppContainer)の境界、最外に OS のプロセス分離(Site Isolation が利用)。ある層が破られても次の層が残る設計です。Spectre のように一層を原理的に貫通する攻撃が現れたとき、より外側の物理境界に守りを移せたのは、この層構造があったからです。
(1) レンダラは権限剥奪された箱で、特権操作は IPC でブローカに依頼し、ブローカがポリシーを強制する。(2) 剥奪を OS が強制:Linux=seccomp-bpf(システムコール許可リスト)+ namespace、Windows=AppContainer+低 integrity/restricted token。いずれも許可リスト型。(3) Site Isolation=1サイト1プロセスで、単位はeTLD+1。クロスサイト iframe は OOPIF。(4) 目的は Spectre 緩和:他サイトの秘密を同一アドレス空間に置かない、CORB/ORB でデータをレンダラに載せない。(5) 全体はプロセス境界を信頼境界に昇格させる多層防御。
セキュリティ Article
ブラウザサンドボックスとサイト分離の原理を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
ブラウザセキュリティ
比較で見る軸
難易度: advanced / カテゴリ: セキュリティ / タグ数: 6
導入後に効く点
閉じ込めは OS のサンドボックス機構で強制する。Linux は seccomp-bpf でシステムコールを許可リスト化し、Windows は AppContainer と低 integrity トークンで権限を剥奪する。レンダラが乗っ取られても、できる操作の集合そのものが狭い。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- セキュリティ
- タグ数
- 6
判断チェックリスト
- 自社の用途が「ブラウザセキュリティ / サンドボックス」に近いか確認する。
- 強みである「ブラウザはレンダラプロセスを「権限を捨てた箱」に閉じ込める。HTML/CSS/JS のパースや JIT という攻撃面の広い処理を、ファイルもネットワークも直接触れないプロセスで動かし、特権操作はすべて IPC でブラウザプロセス(ブローカ)に依頼させる。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。