カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

TRACEメソッドって怖いんです

※2013/01/24 add:
徳丸先生の書かれた実はそんなに怖くないTRACEメソッド | 徳丸浩の日記を先に見ておくをオススメします。深く追求できていないまま記事にしてしまい申し訳ありません。

タイトルの通りです。HTTPのメソッドには、よく使うものとしてGETやPOSTというものがありますが、TRACEメソッドというものがありまして、これを有効にしておくと危ないよという話しです。

TRACEメソッドについて

百聞は一見にしかず、どんな挙動をするか見ていきましょう。

$ telnet example.org 80
Trying example.org...
Connected to example.org.
Escape character is '\^]'. TRACE / HTTP/1.1 #ここと
HOST: example.org #ここを手で入力して、エンターキー二回

このようにtelnetで80番に接続し、TRACEメソッドを発行します。ホスト名などは自分の環境に合わせて変更するのがよいかと。
そうすると、レスポンスが返ってきます。 んで、これの何が怖いかというと、

Escape character is '\^]'.
TRACE / HTTP/1.1
HOST: example.org

HTTP/1.1 200 OK
Date: Fri, 25 Feb 2011 00:00:00 GMT
Server: Apache/0.0.0 (Unix) mod\_ssl/0.0.0 OpenSSL/0.0.0
Content-Type: message/http

TRACE / HTTP/1.1 #ここと
HOST: example.org #ここがそのままレスポンスとして返される。

TRACEメソッドが有効だと、このようにステータスコード200を返し、そのあとに入力した内容がそのまま返されます。
(※ミドルウェアのバージョンや一部情報を改変しています)

これが自分で入力しているあいだは平和ですが、ブラウザでアクセスしたときにTRACEメソッドが発行されるように他人に埋め込まれてしまうと、
ブラウザで入力したBASIC認証のユーザ名やパスワードが漏れてしまいます。

Javascriptを書いた人なら分かるかと思いますが、GETやPOSTを特定のURLに対して飛ばすのは簡単なわけで、TRACEメソッドも仕組みは変わりません。

BASIC認証をするページで認証の際に、ともにTRACEメソッドを発行させて、その結果を特定のサーバに送ったり、ファイルとして生成させるようなスクリプトを埋め込めば、いくらでもユーザ情報を入手できてしまいます。セッションIDなども取得できるので、セッションハイジャックなんかもできてしまいます。

TRACEメソッドに対する対策

そこで対策をしないといけないわけです。対策の方法はapacheのバージョンによって違うのですが、2.2からだとTraceEnableディレクティブで設定できるので、

TraceEnable Off

とhttpd.confに書いて再起動させましょう。 少し古めのバージョンであれば、

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond  %{REQUEST_METHOD} ^TRACE
  RewriteRule ^.*$ - [F]
</IfModule\>

として、rewriteさせてしまうのがよいでしょう。

終わりに

簡単にTRACEメソッドについて書いてみましたが、いくら本でセッションハイジャックとかスクリプト埋め込みといわれても、
こういうのって自分で見てみないとやっぱ分からない気がします。

自分は最初TRACEメソッドについて知らなくて、telnetで発行させたときに、そのまま打った内容が返ってきて、
そのまま結果返っちゃうじゃん、見られたら怖いぞと思った過去があります。

なので、とりあえず自分の環境で試して、必要だったらBASIC認証とかもやってみて、今後は必ずチェックして忘れないようにと思うことが重要なのだと思います。
*それでも、絶対忘れるときあるから怖い…