百聞は一見にしかず、どんな挙動をするか見ていきましょう。
$ 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メソッドって怖いんです - カイワレの大冒険 (via atm09td)
