TORIPIYO DIARY

recent events, IoT, programming, security topics

X-XSS-Protection ヘッダーを設定する必要性はもうほとんどない

IPAの安全なウェブサイトの作り方改訂第7版では、X-XSS-Protection ヘッダーのことを解説しています。また、ウェブアプリ診断やプラットフォーム診断を脆弱性分析ツールで実行すると、X-XSS-Protection ヘッダーを付与するようにと言ったアドバイスを受けることがよくあります。X-XSS-Protection ヘッダーは実際のところ現在ではどの程度有効なのか気になったので確認しました。タイトルにある通り、結論としては X-XSS-Protection ヘッダーを付与する必要性は現在ではほとんどないようでした。

ブラウザの対応状況

caniuse.com

caniuse.com のサイトによると、X-XSS-Protection ヘッダーに対応しているブラウザは、主要なブラウザでは Safari のみ(後述する通り、実はSafariも既に対応していないと思われる)です。主要なブラウザである Chrome, Edge では、以前のバージョンでは、X-XSS-Protection ヘッダーに対応していたようですが、現在のバージョンでは X-XSS-Protection ヘッダーに対応していません。(IE は、対応しているようですが、もうサポートの終了したブラウザなので、主要なブラウザには含めません。)

MDNのサイトによると、X-XSS-Protection ヘッダーによって逆に脆弱性の生じる場合があるようなので、再現できないか Safari で試してみました。

developer.mozilla.org

以下のhtmlを用意して、X-XSS-Protection 1 を応答ヘッダーで返すようにwebサーバを設定して、safariから http://localhost:8080/?something=%3Cscript%3Evar%20productionMode%20%3D%20true%3B%3C%2Fscript%3E (http://localhost:8080?something=<script>var productionMode = true;</script>) にアクセスしてみました。しかし、XSS Auditorが動いていないのか、応答ヘッダーでX-XSS-Protection 1 を返しているのにも関わらず、 <script>var productionMode = true;</script> は実行されました。

<html>
  <head>
    <script>var productionMode = true;</script>
    <script>
      if (!window.productionMode) {
        console.log('test');
      }
    </script>
  </head>
  <body>
    Test Page
  </body>
</html>

XSS Auditor が有効かどうかチェックできるサイトで確認してみても、SafariXSS Auditorが無効となっているようでした。 misc.laboradian.com

よくよく調べてみると、caniuse のサイト情報にはまだ反映されていないだけで、Safari でも 15.4 から XSS Auditor はサポートから外されたようです。

webkit.org

The release also removes support for the XSS Auditor, which has been superseded by modern cross-origin defenses like CSP and COEP.

このように、主要なブラウザの最新バージョンで X-XSS-Protection 応答ヘッダーをサポートしているものはなく、X-XSS-Protection を応答ヘッダーに含めてもブラウザ側がサポートしていないので効果はありません。古いバージョンのブラウザであれば、X-XSS-Protection をサポートしていますが、特殊な用途のサイトではない限り X-XSS-Protection を有効にするために最新のバージョンに上げないように推奨することは、セキュリティパッチの適用されていないバージョンのブラウザを使い続けることになるので控えたほうが良いでしょう。応答ヘッダーを利用してXSS対策を取りたいのであれば、今後は CSP を利用する方がよさそうです。

ちなみに、Google のサイトでは X-XSS-Protection の応答ヘッダーは以下のようになっていました。

$ curl -I -XGET https://www.google.com/ 2> /dev/null | grep xss
x-xss-protection: 0

値が0となっているので、XSS Auditor を利用できる古いバージョンのブラウザの場合でも、XSS Auditor を利用させたくないのか、明示的に XSS Auditor の無効を設定しているようです。