HTTPQUERY
日本語

TRACE

使い方

TRACE リクエストは、クライアントとオリジンサーバーのあいだのリクエストチェーンを調べるための診断ツールです。サーバーは 200 で応答し、受信したリクエストメッセージをレスポンスボディに含めます。認められている形式の1つが Content-Type message/http です。レスポンスボディには受信したままのリクエストメッセージのコピーが含まれ(サーバーが機微とみなすフィールドは除外されます)、元のリクエストとの比較が可能になります。

特性

TRACE リクエストはボディを持ちません。エコーされたレスポンスは受信したすべてのヘッダーを露出させるため、クライアントは資格情報やクッキーなどの機微なフィールドを TRACE リクエストに含めない責任を負います。

Microsoft IIS は歴史的に、TRACE の独自の別名として TRACK をサポートしていました。両者は同じ XST 脆弱性の対象であり、いずれも本番環境では無効化する必要があります。

中間装置の検出

リクエストがプロキシやゲートウェイを通過する際、各中間装置は転送に使用したプロトコルバージョンを列挙する Via ヘッダーのエントリを追加します。元のリクエストとエコーされたコピーを比較することで、各ホップによって追加、変更、削除されたヘッダーが明らかになります。

Max-Forwards ヘッダーは、TRACE リクエストがどこまで到達するかを制限します。この値をゼロに設定すると最初のプロキシが応答するため、複数ホップのチェーンで特定の中間装置を切り分けるのに役立ちます。各ホップでカウンターを減算することで、無限の転送ループを防ぎます。

セキュリティと XST

Cross-Site Tracing(XST)は、TRACE を悪用して認証トークンやクッキーの値を含む HTTP ヘッダーを取得する攻撃手法です。悪意のあるスクリプトがターゲットサーバーに TRACE リクエストを送信し、エコーされたレスポンスによって、本来そのスクリプトからはアクセスできないヘッダーが露出します。

注意

ほとんどの本番サーバーは XST 攻撃を防ぐために TRACE を無効化しています。Apache や Nginx などの Web サーバーはデフォルトで TRACE を無効にしています。ブラウザも TRACE をブロックします。WHATWG Fetch Standard は TRACE を禁止メソッドとして挙げており、JavaScript が TRACE リクエストを発行することを防いでいます。サーバー側で TRACE を無効化することは、インターネットに面したすべてのサーバーにとって推奨される堅牢化策であり続けています。

例

ルートリソースへの TRACE リクエストです。サーバーはレスポンスボディに元のリクエストをエコーし、リクエストが2台のプロキシサーバーを通過したことを示す Via ヘッダーを含めます。

リクエスト

TRACE / HTTP/1.1
Host: example.com

レスポンス

HTTP/1.1 200 OK
Content-Type: message/http
Content-Length: 91
Via: 1.1 proxy1.example.re, 1.1 proxy2.example.re

TRACE / HTTP/1.1
Host: example.com
Via: 1.1 proxy1.example.re, 1.1 proxy2.example.re

Via ヘッダーは中間装置として proxy1.example.re と proxy2.example.re を列挙しています。どちらも HTTP/1.1 を使ってリクエストを転送しました。各中間装置は転送するリクエストに Via のエントリを追加しなければならないため、エコーされたボディには2台のプロキシによって追加された Via フィールドが累積して含まれています。

CORS

TRACE は CORS の禁止メソッドです。ブラウザは fetch() や XMLHttpRequest などのブラウザ API を通じて TRACE を送信しようとするあらゆる試みをブロックします。

TRACE の無効化

Apache はサーバー設定の TraceEnable Off で TRACE を無効化します。nginx はデフォルトで TRACE をサポートしていないため、対応は不要です。IIS では、Request Filtering の許可された動詞から TRACE(および TRACK)を削除する必要があります。Caddy はデフォルトで TRACE をサポートしていません。

OWASP はすべての本番サーバーで TRACE を無効化することを推奨しています。現代のブラウザは TRACE を禁止メソッドとして挙げる Fetch Standard を通じて TRACE リクエストをブロックしますが、それでもセキュリティスキャナーは有効な TRACE を脆弱性として報告します。

ブラウザ以外の HTTP クライアントやスクリプトは Fetch Standard の制約に縛られないため、サーバーレベルでの TRACE の無効化が XST に対する主要な防御であり続けています。