素朴なリモートブラウザは多数のユーザー間で単一のブラウザプロセスを共有します。あるセッションで設定されたCookieが次のセッションで見えます。localStorageのデータがセッション境界を越えます。あるユーザーの認証状態が別の人に引き継がれかねません。保護対象アプリケーション自体が行儀よく振る舞っていても、共有ブラウザはあらゆるアプリケーションレベルのアクセス制御を迂回するサイドチャネルになります。
そしてナビゲーションがあります。単一の内部ダッシュボードに閲覧権限しか持たないユーザーが、そのダッシュボードの中でフィッシングリンクをクリックし、個人アカウント用に新規タブを開き、あるいは意図しない外部リンクをたどります。ブラウザ層での強制がなければ、セッションは保護対象アプリケーションから逃れます — そして今や保護対象アプリケーションのセッションID、ユーザーのID、アクティブなブラウジング状態が、ブラウザが向かった先に見えるようになります。
ブラウザコンテキスト分離は両方を閉じます。各セッションは共有状態のない自身のブラウザコンテキストで実行されます。ブラウザ自体がセッションの到達可能なドメインの許可リストを強制し、ユーザーが他所へ行くために使えるあらゆるチャネルをブロックします — 新規タブ、ポップアップ、許可されていないドメインへのリンククリック、ページ自身によるプログラム的なナビゲーション。
各セッションはレンダリングエンジン内部で自身のブラウザコンテキストを得ます — 他のあらゆるセッションの状態から完全に分離されています。厳格なドメイン許可リストがナビゲーション層で止めます — 要求の傍受、シングルページアプリケーションのナビゲーションポーリング、リンククリックの傍受が併せて、セッションが許可されていないドメインに決して到達しないことを保証します。その下で、レンダリングされたピクセルそのものが、セッションを読んだり操作したりしようとする自動化ツールを撹乱する継続的な低レベルの変更を帯びます。
各ユーザーセッションは自身の分離ブラウザコンテキストで開かれます — 自身のCookieジャー、自身のローカルストレージ、自身のセッション状態を持つ真新しいプロファイルです。同じ保護対象アプリケーション上で、2人のユーザーは完全に独立したブラウザを持ち、一方のセッションから何も他方に見えません。セッション終了はコンテキストを完全に破棄し、いかなる状態も生き残りません。
すべてのナビゲーションの試みは実行される前に捉えられます。要求層が許可されていないドメインをネットワークレベルでブロックします。ページ内のリンククリックはレンダリング層で捉えられます。シングルページアプリケーションのナビゲーション(pushState、replaceState)はポーリングで捉えられます。セッションは、ユーザーが意図的に試みてもページが自ら試みても、許可リスト外のドメインに到達できません。
キオスク型ブラウザはユーザーが新規タブを開いたり、ポップアップを作成したり、右クリックのコンテキストメニューを使ったりすることを許しません。ユーザーが保護対象アプリケーションから逃れるために使えるあらゆるチャネルがブラウザ構成で閉じられます。ユーザーは自分のために開かれたセッションの中で動作します — それ以上ではありません。
見えるコンテンツの下で、レンダリングされたピクセルストリームは継続的な低レベルの変更を帯びます — ランダムノイズ、微細な色のシフト、要素のマイクロ変位、サブピクセルの振動。これらはユーザーが見るものに影響しませんが、公式の入力チャネル以外からセッションを読んだり操作したりしようとする自動化ツール(Selenium、Puppeteerスクリプト、スクリーンスクレイパー)を撹乱します。
以下の各動作は保護対象サービスごとに構成され、保護対象アプリケーションのコードではなくブラウザ層で強制されます。保護対象アプリケーションがこれらの存在を認識する必要はありません — 境界はアプリケーションの実行時から見えません。
各セッションは自身のブラウザコンテキストで実行されます — セッションに自身のCookieジャー、自身のローカルストレージ、自身のService Worker登録、自身の権限、自身のセッション状態を与えるChromiumレベルの構造です。同じ保護対象アプリケーション上の2つのセッションはブラウザレベルで何も共有しません。
すべてのナビゲーション要求 — メインドキュメント、サブドキュメント、fetch、XHR — は、ターゲットドメインをセッションの許可リストに照らしてチェックする傍受機を通過します。許可されていないドメインは接続が確立される前にブロックされます。ユーザーのクリックとナビゲーションのチェックの間に競合状態はありません。
最新のシングルページアプリケーションは、ネットワーク要求をせずにpushStateまたはreplaceStateを呼んでナビゲートします。単純な要求傍受機ではこれらを捉えられません。ZeroLeakはさらにページ内で短い間隔で現在のURLをポーリングするため、許可されていないパスへのSPAナビゲーションは数秒以内に捉えられ、取り消されます。
許可されていないターゲットを持つリンク要素、window.open()呼び出し、プログラム的な位置変更 — すべてが実行される前にレンダリングされたページ内で捉えられます。たどれないリンクをクリックするユーザーは、ネットワーク要求がすでに始まった後ではなく、クリックの瞬間にブロックされます。
ブラウザは、新しいブラウジングターゲットを作成する試み — ユーザー、ページ、またはスクリプトによるもの — が即座に捉えられて破棄されるよう構成されています。セッションは常に正確に1つの可視タブを持ち、それは保護対象アプリケーションのタブです。
各セッションはユーザーの操作を監視します。ユーザーが構成されたタイムアウトより長くアイドル状態であれば、セッションは適切に終了され、ブラウザコンテキストが破棄され、(構成されている場合)Webhookがコーディネーターに通知するので、ターゲットポリシーを更新できます。メモリを消費する放置された分離ブラウザはありません。
セッションごとの分離とナビゲーション境界を超えて、レンダリングされたピクセルストリームそのものが継続的な低レベルの変更を帯びます。その目的は自動化ツールを撹乱することです — さもなければセッション画面を読み、要素を識別し、非公式なチャネルを通じて操作するスクリプトを — ページが人間のユーザーにどう見え、どう振る舞うかに影響を与えずに。
Canvasオーバーレイがレンダリングされたページ全体に継続的に低強度のランダムノイズを描画します。人間の目はせいぜい軽いテクスチャを認識する程度ですが、画面を読もうとするOCRやテンプレートマッチングのスクリプトは、頼りにする一貫したピクセル境界を失います。ノイズの強度とリフレッシュレートは保護対象サービスごとに構成可能です。
半透明のオーバーレイが、レンダリングされたページ全体にゆっくりと変化するランダムな色合いを適用します。白と黒の領域は目には依然として実質的に白と黒に見えますが、実際のピクセル値はシフトします。色のシグネチャに照らしてマッチングを行うビジョンベースの自動化ツールは参照点を失います。
画面フィルタとしてごく軽い継続的なブラーが適用されます。各フレームは高周波の詳細がわずかに異なり、これによりOCRやパターンマッチングが安定した特徴点を見つけにくくなります。ユーザーは通常の読み取り距離でブラーを知覚しません。
ページ要素が通常の位置から1〜3ピクセル、ランダムに動かされます。シフトは人間の知覚より下ですが、絶対的な画面座標で要素を見つけるスクリプトを撹乱します。自動化ツールはあるフレームから次のフレームへ安定した要素位置を頼れません。
短い間隔で、レンダリングされた表面全体が数ピクセル動かされます — 読み取りを妨げない程度に小さく、入力シミュレーションのために一貫した絶対ピクセル座標に依存する自動化ツールを打ち破る程度に大きく。Selenium型のリプレイ攻撃は固定点を失います。
セッション間の状態漏洩や意図しないナビゲーションが物理システムに影響しかねない重要インフラのインターフェース。セッションごとの分離は、同じコンソール上の2人のオペレーターが互いのセッションを見られないことを保証します。厳格な許可リストは、いずれも運用コンソールから外部リンクへ移動しないことを保証します。
多数のユーザーがアクセスする社内ダッシュボード、監査インターフェース、レポートツール — 請負業者や外部監査人を含みます。各セッションは自身のブラウザであり、アクセスポリシーはナビゲーション層で強制され、レンダリング層防御は画面をスクレイピングしようとする誰の自動化にも抵抗します。
セッションごとのコンテキストは、あるデータルームを閲覧する請負業者が、別のデータルームの別の請負業者のCookie、検索履歴、セッションIDを見られないことを意味します。許可リストは、データルームセッションが決して広いインターネットに行かないことを保証します。
複数の研究者が厳格な開示境界の下で患者データにアクセスする試験ポータル。セッションごとの分離が境界をブラウザ層で強制します。許可リストがナビゲーション層で強制します。レンダリング防御がデータ画面チャネルを通じてスクレイピングしようとする誰の自動化にも抵抗します。
同じ保護対象アプリケーションで2つのセッションを並べて実行し、両者の間に何も漏れないことをお見せし、許可リスト外への移動を試み、外部の自動化ツールでセッションを操作してみます — 何が起きるかをお見せします。