XSSやCSRFリスクを軽減する、Entry Point Regulationとは

Entry Point Regulation とは

反射型XSS・XSSI・CSRFのリスクを軽減するユーザエージェント上の仕組みとして、W3CEntry Point Regulationという仕様が策定中です。


Webアプリケーションの口(Entry Point)に幾つかの制限をかけることが出来ます。別オリジンからのリクエストの時に、クエリパラメータやHTTPリクエストボディ(POSTメソッド)が付いていればブロックする、と言った事がマニフェストで指示できるようになりそうです。

EPRにおけるリクエストカテゴリ

各エンドポイント(URL)はどのようなリクエストを受け付けることが可能か指定できます。その時に指定するリクエストは以下に分類されます

  • navigational request:context frame typeは"top-level", "auxiliary", "nested"のどれかである。 Navigational requestsはコンテキストにリソースの読み込みを行い、レンダリングを行います。XSSCSRFのリスクが有ります。
  • subresource request:context frame typeは"none"である。、Subresource requestsは直接的にコードの実行を行いません。そのため、XSSのリスクは最小です。しかしCSRFやXSSIのリスクは保有しています。
  • connection request:contextは"beacon", "cspreport", "eventsource", "fetch", "ping", "xmlhttprequest"のどれかである。典型的にAPIのエンドポイントとして使用される。subresource requestsとリスクには似ているが、別途異なるルールを設定できる。

Entry Point Manifests

Entry Point Manifests は以下のようにJSONで記述されます。

{
  ...,
  "epr": {
    "reportURL": "https://example.com/reporting-endpoint",
    "redirectURL": "https://example.com/",
    "navigationBehavior": "allowStrippedGET",
    "subresourceBehavior": "allowStrippedGET",
    "rules": [
      {
        "path": "/",
        "types": [ "navigational" ],
        "allowData": false
      },
      {
        "regex": "^/\\d+$",
        "types": [ "navigational" ],
        "allowData": false
      },
      ...
      {
        "path": "/image",
        "types": [ "subresource" ],
        "allowData": true
      },
    ]
  }
}
各パラメータ
  • reportURL:違反が会った時のレポートの送信先
  • redirectURL:リダイレクトの振る舞い時のリダイレクト先
  • navigationBehavior:navigational requestが下記のrulesにマッチしなかった時の振る舞いを定義する
  • subresourceBehavior:navigational requestで、rulesにマッチしなかった場合の振る舞いを定義する。
  • rules:各エンドポイントのルールを定義する
ルールセット
      {
        "path": "/image",
        "types": [ "subresource" ],
        "allowData": true
      },
  • path:ルールのスコープを示すのPATHプレフィックス。
  • refex:ルールのスコープを示す正規表現
  • types:設定されるリクエストタイプ。navigational, subresource, connectionのうち一つ以上が指定される。
  • allowData:Trueであれば、クエリパラメータ、フラグメントプロパティ、リクエストボディを許可する
Behaviors

(多分別オリジンからのリクエストの際の話)

ルールにマッチしなかった場合は、navigationBehavior、subresourceBehaviorで指定された通りの振る舞いする。指定できるBehaviorは以下の通りである。

  • allow:変更することなくリクエストを許可する。これは、レポートのみする挙動となる。
  • block:リクエストをキャンセルし、ネットワークエラーを返す。
  • redirect:指定されたURLにリダイレクトする。
  • omitCredentials:Cookieやその他の認証情報をリクエストから削除する。
  • allowStrippedGET:URLのフラグメントやクエリプロパティにnullを設定し、GETリクエストを許可する。POST及びその他のリクエストはキャンセルされ、ネットワークエラーを返す。

EPR header

サーバはHTTPレスポンスにおいてEPR headerを用いて、Entry Point Regulationを適用するように指示します。

  • 安全でないURLではEPR headerの処理を中断する
  • Web App Manifestの仕様に則って、manifest のURLを提供する

レポート

違反時に提出されるレポートのフォーマット

{
  "epr-report": 
  {
    "policy-fetch-time": Thu Apr 16 2015 14:23:46 GMT-0700 (PDT)
    "affected-uri": "http://example.org/page.html",
    "referrer": "http://evil.example.com/",
    "type": "navigational",
    "applied-behavior": "allowStrippedGET",
    "redirectedTo": ""
  }
}