Security check basics 和訳

Firefox3(Gecko1.9)の、いわゆる特権コンテキスト/非特権コンテキストを越えての不適切な関数呼び出しを防いだり、通常のクロスドメイン制約を実現するための仕組みであるSecurity check basics – MDCの和訳です。

MDCにはまだ日本語訳がないのですが(あったら訳さないんだからあたりまえだ)、アカウントをとって勝手に入れちゃってもいいんでしょうか。

Security check basics

このドキュメントではGeckoのセキュリティモデルの基本的概念を概略を示します。

Basic Definitions

GeckoセキュリティモデルはAOCできるか?という形式の問い合わせに答えるかたちで設計されています。
この問い合わせに答えるには、動作を行う実体(Aはactorを意味しています)、実行される動作(Vはverbを意味しています)、実行される動作の対象(Oはobjectを意味しています)についての情報が必要です。

Geckoには、プロパティXを取得するプロパティXを設定する関数Fを呼ぶ、といった限定されたverbがあります。

actorとobjectのふたつはprincipalで表されます。

Principals

principalはセキュリティのコンテキストを表します。ウェブ上での典型的なprincipalはスキーマ+ホスト+ポートの組み合わせです。

AがOにVできるか?を問い合わせるとき、A(actionを実行する実体)をsubject principalと呼びます。O(動作を行われる対象)はobject principalと呼ばれます。

Scripted and native JavaScript functions

JavaScriptには2種類の関数があります。

ひとつめは、単純にCの関数のポインタを保持していて、呼び出されるとthisオブジェクトや引数などをCの関数に渡して呼び出します。ネイティブ関数の例としてArray.sortがあります。関数が呼ばれると、Cのソート関数を呼び出してsort()が呼ばれたArrayオブジェクトを渡します。
ふたつめは、”scripted” functionと呼ばれるものです。JavaScriptのfunctionキーワードや、適切なJSAPI呼び出しで生成されます。これらの関数が呼ばれたときはJavaScriptインタプリタでJavaScriptのコードが実行されます。

セキュリティ上の二種類の関数の違いは、scripted functionはprincipalがコンパイルされて関数に埋め込まれているところです。scripted functionはその関数を定義したスクリプトが実行されたページのprincipalを保持しています。

Determining the subject principal

セキュリティチェックの実行を要求されると、セキュリティマネージャは現在のsubject principal(actorがセキュリティチェックされる動作を行おうとしている)を決定する必要があります。Gecko1.9のセキュリティマネージャはXPConnectにXPConnectが管理しているスタックから”current JSContext”を得るように要求します。このJSContextは実行中のスクリプトが使っているコールスタックへのポインタを持っています。

  • スタック上にJavaScriptがないときは、subject principalは”system”(全能のprincipal)になります。
  • スタック上にJavaScriptがあるときは、スタックを上から下にscripted functionが出てくるまで辿ります。scripted functionには必ず関連づけられたprincipalが存在します(scripted functionを作るときには、誰が作ろうとしているかを伝えないといけません)。それがsubject principalになります。

Determining the object principal

GeckoがあるJavaScriptオブジェクトのprincipalを決めるには、そのオブジェクトからそのオブジェクト自身のprincipalを知っているオブジェクトまで__parent__チェインを辿っていきます(たいていはWindowDocumentです)。それが問い合わせされたオブジェクトのobject principalとして使われます。


About this entry