[論文レビュー] Information Flow Control in WebKit's JavaScript Bytecode
本稿では、WebKitのJavaScriptバイトコードに対する動的情報フローコントロール(IFC)メカニズムを提示する。このメカニズムにより、明示的および暗黙的なデータフローを追跡することで、信頼できないコードの安全な実行が可能になる。バイトコードレベルのインストルメンテーション、形式的意味論、および後続支配解析と新規の許容的アップグレードチェックを用いた許容的タインティング追跡により、最適化されたプロトタイプで平均45%の性能オーバーヘッドを達成している。
Websites today routinely combine JavaScript from multiple sources, both trusted and untrusted. Hence, JavaScript security is of paramount importance. A specific interesting problem is information flow control (IFC) for JavaScript. In this paper, we develop, formalize and implement a dynamic IFC mechanism for the JavaScript engine of a production Web browser (specifically, Safari's WebKit engine). Our IFC mechanism works at the level of JavaScript bytecode and hence leverages years of industrial effort on optimizing both the source to bytecode compiler and the bytecode interpreter. We track both explicit and implicit flows and observe only moderate overhead. Working with bytecode results in new challenges including the extensive use of unstructured control flow in bytecode (which complicates lowering of program context taints), unstructured exceptions (which complicate the matter further) and the need to make IFC analysis permissive. We explain how we address these challenges, formally model the JavaScript bytecode semantics and our instrumentation, prove the standard property of termination-insensitive non-interference, and present experimental results on an optimized prototype.
研究の動機と目的
- 現代のWebアプリケーションにおけるサードパーティJavaScriptコードが引き起こすセキュリティリスク、特に情報フローに起因する機密性の漏洩を是正すること。
- 独自のインタプリターや抽象的な言語ではなく、実世界のJavaScriptエンジン(Webkit)内に実用的で生産環境向けのIFCソリューションを実装すること。
- コードアノテーションを必要とせずに、非構造的制御フロー、例外、および許容的動作の必要性を満たす、バイトコードレベルのIFCにおける課題を克服すること。
- 実際のインタプリタコード(ビルド r122160)に基づいて、Webkitの147命令のバイトコード命令セットの構文と意味論を形式化すること。
- 終了に依存しない非干渉性を証明するため、インストルメンテッドシステムの形式的モデルを構築すること。
- 実世界のベンチマークでの性能オーバーヘッドを評価し、Safariのようなブラウザへの導入可能性を示すこと。
提案手法
- 実行時における動的タインティング追跡を維持したまま、WebkitのJavaScriptバイトコードインタプリタをインストルメンテーションし、既存の最適化を保ったまま実装する。
- 実際のインタプリタコード(ビルド r122160)に基づいて、Webkitの147命令のバイトコード命令セットの構文と意味論を形式化する。
- 即時の後続支配ノードのオンザフライ内処理静的解析を用い、非構造的制御フローであっても過剰なタインティングを制限し、許容的動作を向上させる。
- 例外、break文、continue文を処理するため、後続支配解析を拡張し、追加のアノテーションを必要とせずに処理する。
- バイトコード固有の許容的アップグレードチェックの変種を実装し、タインティング伝搬における誤検出を低減する。
- スパースラベル化を用いた最適化により、ラベルが異なる値が読み込まれるまで、ヒープへの書き込みのみでタインティングを伝搬する。
実験結果
リサーチクエスチョン
- RQ1生産用JavaScriptエンジン(Webkitなど)のバイトコードレベルで、動的IFCを効果的かつ効率的に実装できるか?
- RQ2コードアノテーションを必要とせずに、非構造的制御フロー(例:break、continue、例外)を含む実世界のJavaScriptを扱えるほど、IFCをどれほど許容的に行えるか?
- RQ3実世界のワークロードにおけるバイトコードレベルのIFCによる性能オーバーヘッドはどの程度か?また、最適化によりこれを顕著に低減できるか?
- RQ4生産用バイトコードインタプリタを形式的にモデル化し、その非干渉性のセキュリティ特性(終了に依存しない非干渉性)を証明することは可能か?
- RQ5JITコンパイルが有効な状態において、WebkitにおけるIFCの性能は、インストルメンテーションなしのインタプリタと比べてどの程度か?
主な発見
- SunSpiderベンチマークスイートにおいて、最適化されたIFCでは平均45%、基本的なIFCでは121%のオーバーヘッドを達成しており、標準偏差から性能の安定性が示されている。
- 最適化されたIFCバージョンは、ラベル付きヒープ値が読み込まれるまでタインティングをヒープへの書き込みのみで伝搬することで、マイクロベンチマークでタインティング追跡のオーバーヘッドを顕著に低減している。
- 実世界のWebサイトではオーバーヘッドが常に42%未満で、平均して約29%であり、ネットワークやレンダリング時間と比べて無視できる水準である。
- マクロベンチマークにおいて、JIT最適化された構成はベースラインより性能が劣っており、この文脈ではインストルメンテッドコードに対してJITが効果を発揮しないことが示唆されている。
- JSBenchの評価では、基本的および最適化されたIFCの両方で平均して約38%のオーバーヘッドを示しており、標準偏差はそれぞれ4.09%および5.04%であった。
- Webkitのバイトコードおよびそのインストルメンテーションの形式的モデルは、終了に依存しない非干渉性を証明しており、動的タインティング追跡下での機密性の確保が保証されている。
より良い研究を、今すぐ始めましょう
論文の読解から最終レビューまで、研究時間を劇的に削減しましょう。
クレジットカード登録不要
このレビューはAIが作成し、人間の編集者が確認しました。