プライベートネットワークへのCSRFを緩和する仕様の提案 (CORS-RFC1918)

GoogleのMike West氏によって、Chromiumメーリングリスト上で「インターネットからイントラネットへのCORSの厳格化」に関する提案が行われている。


CORS and RFC1918」として提案している仕様も公開されているが、個人のリポジトリであり、W3Cのドキュメントにはなっていない。

背景

プライベート網のアドレス割当(RFC1918)」で記述されているように、プライベートとパブリックのアドレスは区別されています。しかし、ユーザエージェントはそれらを分離して扱っていません。


悪意を持ったPublicなWebサイトは、クライアントにローカルのプライベートネットワークのデバイス・サーバに対してリクエストを送らせることが出来ます(CSRF攻撃)。


以下のドキュメントに記述されているような、ネットワーク内のルータに対するCSRF攻撃などもありました。これらの幾つかは、プリフライトを伴わない単純なGETリクエストで攻撃が成功しました。


これらの攻撃を緩和するために、PublicなインターネットからイントラネットへのCORSにOPT-INする方法を追加します。

以下のような、インターネット上のWebサイトからプライベートネットワークのルータへのCSRF攻撃を例にする。

  • 1. プライベートネットワーク内のユーザエージェントが、悪意あるhttps://csrf.attack/にアクセスする
  • 2. https://csrf.attack/は、以下のようなHTMLでユーザにmulticast DNSでルータのプライベートアドレスを解決させ、HTTPリクエストを送信させる。
<iframe href="https://admin:admin@router.local/set_dns?server1=123.123.123.123">
</iframe>
  • 3. ユーザエージェントは、PublicネットワークのWebサイトからPriveteネットワークへのリクエストが生成されたことに気づき、preflight requestを送信する。これによってCSRF攻撃を防ぐことができる。
OPTIONS /set_dns?... HTTP/1.1
Host: router.local
Access-Control-Request-Method: GET
Access-Control-Request-External: true
...
Origin: https://csrf.attack


プライベートネットワークの例をあげたが、ループバックアドレスに対しても同様に動作する。


追加されるヘッダ

この仕様において2つヘッダが定義されている。それぞれpreflightの手続きの中で使用される。

  • Access-Control-Request-External : preflight requestで、リクエストがExternalからであることを示す。
  • Access-Control-Allow-External : preflight requestに対する応答で、Externalからのリクエストに対して安全に応答できることを示す。

追加されるCSPディレクティブ

この仕様においてCSPディレクティブが追加される。


CSPにおいて「treat-as-public-address」を指定することで、そのサービスをPublicなWebサービスとして扱わせることが出来る。

追記 (2020/09/27)

ヘッダ名は一部変更sれました

  • Access-Control-Request-External => Access-Control-Request-Private-Network
  • Access-Control-Allow-External => Access-Control-Allow-Private-Network