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の手続きの中で使用される。
追加されるCSPディレクティブ
この仕様においてCSPディレクティブが追加される。
CSPにおいて「treat-as-public-address」を指定することで、そのサービスをPublicなWebサービスとして扱わせることが出来る。