僕と技術とセキュリティ

セキュリティエンジニアの備忘録

ヘッダから見るTomcatの推測

20210528: X-XSS-Protectionについて追記

. .はじめに

どうもみなさん、私です。

せっかく技術ブログ初めてみたのだから何か良いネタないかなぁと考えていたところ

ありましたありました。本日業務中に思ったこと、書き連ねていきます。

掲題の通りになりますが、今回サーバーアプリケーションを特定(推測)するという内容になります。

あくまで推測、しかも今回はTomcat限定です。

.何が推測できるのか

「僕はいまTomcatから応答を受け取ったかもしれない」...ということが推測できます。

.何を見るべきか

HTTPのレスポンスヘッダには以下のセキュリティヘッダを付与することができます。

主なセキュリティヘッダ

X-Content-Type-Options:

  => ブラウザにContent-Typeを明示できる。

X-Frame-Options:

  => HTMLのフレームの動作を制限できる。クリックジャッキングの対策に。

X-XSS-Protection:

  => XSSフィルタに関するヘッダ、無効にしたい時に活躍する。

※詳細なオプションについては割愛。

これらのセキュリティヘッダは普通ページ単位で設定するのではなく、公開されているサービス全体でヘッダに出力するべきです。

さて、ならば公開されているサービスのどこにアクセスしても共通の設定をするのであればTomcatの場合はWeb.xmlに以下の様に追記をすると思います。

<filter>
    <filter-name>HeaderSecurityFilter</filter-name>
    <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
</filter>
<filter-mapping><!--ここから-->
    <filter-name>HeaderSecurityFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping><!--このあたり-->

上記をweb.xmlへ追記してTomcatを再起動してアクセスすればどのページにアクセスしても
HTTPのレスポンスヘッダに以下のヘッダが出力されます。


X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

tomcat_header_on
tomcat_header_on

ヘッダのオプションについては以下を参照ください。
Apache Tomcat 8 Configuration Reference (8.5.66) - Container Provided Filters


org.apache.catalina.filters.HttpHeaderSecurityFilterクラスを利用すれば
メジャーな脆弱性に対してはフォローされるわけですね。

.このヘッダが実は

上でweb.xmlに追記したxmlですが、
各ヘッダを出力させたくない場合は以下の様にします。

<filter>
    <filter-name>httpHeaderSecurity</filter-name>
    <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
    <init-param><!--ここから-->
      <param-name>xssProtectionEnabled</param-name>
      <param-value>false</param-value>
    </init-param><!--ここに設定を追記-->
</filter>
<filter-mapping>
  <filter-name>httpHeaderSecurity</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

tomcat_header_not
tomcat_header_not


この場合はセキュリティヘッダを出力する設定を施してからxssProtectionEnabledを打ち消す設定を記述しているということです。
X-Frame-OptionはSAME-ORIGINで運用されているサービスはまだ多く見かけますが、
わざわざX-XSS-Protection:を打ち消すような設定を行うというのは公開されているサービスでは考えにくいのでweb.xmlでセキュリティヘッダを設定していればほぼデフォルトのままorg.apache.catalina.filters.HttpHeaderSecurityFilterクラスの出力を利用するかと思います。

※20210528追記
X-XSS-Protectionはモダンブラウザで非推奨になり、代わりにCSPでの制御が推奨値になる。あえて打ち消し設定を導入しているサービスもあるかもしれません。

.この考えに至った経緯

自分も初めは検証サーバに「Tomcat ヘッダ」でググって一番初めにヒットする様な設定でweb.xmlを放置していた。

しかし、業務で診断を行っている際にこの様なレスポンスヘッダを出力しているサイトをたまに見る様になった。。

Tomcatを動かすのであればStruts等いれてヘッダ関係もフォローするもんだと考え込んでいたが、web.xmlの設定で制御している環境も多いのかもしれない(何より簡単だし。)

.結論

つまり、アプリケーションからの応答が以下の順番、属性のままになっていればWebサーバには素のTomcatを利用していると推測する要素の1つに加える事ができるのではないでしょうか?

X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block