UnsplashのRicardo Cruzが撮影した写真
Webアプリケーションの開発者や運用者にとって、ディレクトリトラバーサルは見過ごしにくい代表的な脆弱性のひとつです。入力値の扱い方を誤ると、本来公開していないはずのファイルや設定情報が読まれてしまうことがあります。この記事では、ディレクトリトラバーサルの仕組みと起こりやすい実装パターン、現場で取りやすい対策、検出・運用の勘所をまとめます。読み終えたときに、「どこが危ないのか」「自分の環境では何を優先して直すべきか」を判断できる状態を目指します。
ディレクトリトラバーサルとは、Webアプリケーションが扱うファイルパスの指定やファイル参照処理を悪用して、攻撃者が本来アクセスできないはずのファイルやディレクトリに到達できてしまう脆弱性です。入力値に相対パス(例:../)などを混ぜ、ディレクトリ構造を遡らせることで、意図しないファイルを読まれたり、状況によっては書き換えられたりする危険があります。
ポイントは「Webサーバー上のファイルを直接触られる」ことではなく、アプリ側が“ファイル名を受け取って処理する”実装があるときに、入力の検証不足で想定外の場所まで参照できてしまう点です。テンプレート表示、ログ閲覧、画像の動的配信、PDFのダウンロードなど、意外と起点は多岐にわたります。
ディレクトリトラバーサルは、Webアプリケーションがユーザー入力をファイルパスの一部として利用しているのに、入力値を適切に検証していない場合に起こります。攻撃者は、相対パスやエンコードされた文字列などを含むリクエストを送ることで、意図しないディレクトリやファイルにアクセスを試みます。
例えば、次のようなURLが典型例として挙げられます。
| http://example.com/view.php?file=../../../etc/passwd |
この例では「..」を使ってディレクトリを遡り、本来アクセスできないはずの「/etc/passwd」に到達しようとしています。入力値がそのままファイル参照処理に渡ってしまうと、攻撃者はサーバー上の重要ファイル(設定、鍵、ログ、ソース断片など)を読める可能性があります。
なお、現場では「../」がそのまま通るとは限りません。次のような“すり抜け”が問題になることがあります。
ディレクトリトラバーサルの脅威は、単なる「ファイルが読まれる」だけにとどまりません。参照できてしまう対象によって、被害の質が変わります。
ディレクトリトラバーサルは、機密性(Confidentiality)を中心に、完全性(Integrity)や可用性(Availability)にも波及し得る脆弱性です。特に「設定ファイルに到達できる」「認証前でも到達できる」ケースは優先度が高くなります。
攻撃の入口は「fileパラメータ」だけではありません。次のような機能は、設計次第でリスクが上がります。
「ユーザーが指定するのは“ファイル名だけ”のつもり」でも、実装上は文字列結合でパスを組み立てていることが多く、ここが弱点になります。
ディレクトリトラバーサルを防ぐには、入力値の取り扱いとファイルアクセスの設計をセットで見直すのが基本です。「弾く」だけでなく、「そもそも危ない形で受け取らない」方向に寄せるほど安定します。
ディレクトリトラバーサルを防ぐうえで、ユーザー入力を適切にバリデーションすることは必須です。ただし、ブラックリスト的に「../を消す」だけだと抜け道が生まれやすいので、基本はホワイトリストに寄せます。
実務上は「ファイル名を受け取る」より、アプリが発行したIDで参照し、サーバー側で対応するパスを引く構成が安全です。ユーザーがパスを“組み立てられない”形にすると、脆弱性の芽が減ります。
パスの正規化(canonicalization)は、「../」や重複スラッシュなどを解消して、最終的にどこを指すのかを確定させる処理です。重要なのは、正規化した後のパスを基準に“許可されたディレクトリ配下か”を判定することです。
よくある落とし穴は、正規化前に「..が含まれるか」だけを見てしまうことです。エンコードや区切り文字の違いで抜ける可能性があるため、
の順で処理します。言い換えると「正規化してから境界チェック」が鉄則です。
アプリ側の対策に加え、OSやミドルウェアの権限設計も効きます。重要ファイルやディレクトリには、必要最小限のアクセス権限のみを付与し、Webサーバープロセスが触れられない領域を増やします。
権限で“被害の上限”を下げておくと、もしバグが残っても致命傷になりにくくなります。
対策の質を上げるなら、実装テクニックだけでなく設計を見直します。次の方針は効果が大きいです。
ディレクトリトラバーサルはアプリ実装が原因であることが多い一方、フレームワークやライブラリの不備が絡む場合もあります。Webサーバー、フレームワーク、依存ライブラリを最新に保ち、セキュリティアップデートを適用する運用は、土台として外せません。
検出は「作る前(開発)」「作った後(運用)」の両方で考えると安定します。単発の診断より、継続して気づける仕組みがあるほど再発を減らせます。
脆弱性スキャナーは、Webアプリケーションの弱点を自動的に探すツールです。自動スキャンでディレクトリトラバーサルの兆候を効率よく拾える一方、誤検知や見落としがあり得ます。
現場では「スキャナーで出た=即アウト」ではなく、
を確認し、優先度を付けて潰していくのが実務的です。
ペネトレーションテストは、攻撃者の視点で手動検証する方法です。スキャナーが拾いにくい“アプリ固有の入口”を発見しやすいため、重要システムや公開範囲が大きいサービスでは有効です。
特に、ファイル閲覧・ダウンロード・ログ表示・テンプレート切替のような機能は、手動で深掘りすると見つかることがあります。
ソースコードレビューでは、「ユーザー入力がどこでパスになるか」を追います。入力→結合→正規化→境界チェック→ファイルアクセスの流れが守られているか、あるいはそもそも「パスを受け取っていないか」を確認します。
レビュー観点を固定化しておくと、同種のバグを横展開で減らせます。
運用では「侵入の兆候に早く気づく」ことが重要です。ログに不審なパスパターン、異常な404/403の連続、エンコードされた“..”の試行などが出ていないかを見ます。
アラートの例としては、
などが挙げられます。誤検知が多い場合は、対象URLや閾値を調整して運用に乗せます。
対策は単体ではなく、開発プロセスと運用の両輪で回すと強くなります。ここでは実務で効きやすい“型”を整理します。
ディレクトリトラバーサルを防ぐには、危ない受け取り方をしないのが最も堅い方針です。ファイルパスを入力として受け取らず、IDで参照する設計を優先し、それが難しい場合でも、正規化・境界チェック・ホワイトリストを徹底します。
この脆弱性は「知っているかどうか」で減らせるタイプでもあります。開発者・運用者が“なぜ危ないのか”を具体例とセットで理解している状態を作ると、レビューや設計の段階で止めやすくなります。
定期監査は“抜け”を見つける場として有効です。監査でチェックしやすい項目を表にまとめます。
| 監査項目 | 見るポイント |
|---|---|
| 脆弱性スキャン | ファイル参照系エンドポイントに対する探索パターンの反応 |
| ペネトレーションテスト | アプリ固有の入口(ログ表示、DL、テンプレート切替等)の深掘り |
| ソースコードレビュー | パス結合、正規化、境界チェック、ホワイトリストの有無 |
| 設定レビュー | Webプロセス権限、重要ファイルの配置・権限、エラー出力設定 |
万が一のときは、被害拡大を止める速さが重要です。ディレクトリトラバーサルを疑う兆候が出た場合に備え、一次対応の手順を決めておくと復旧が早くなります。
ディレクトリトラバーサルは、入力値の扱いを誤ることで、本来公開していないファイルや設定情報に到達され得る脆弱性です。対策の基本は、パスを入力として受け取らない設計(ID参照)に寄せ、やむを得ず扱う場合でも、正規化後の境界チェックとホワイトリストを徹底することです。あわせて、Webプロセスの権限設計で被害の上限を下げ、スキャン・レビュー・監視を継続して回すことで、検出と再発防止の精度が上がります。開発と運用の両方で“危ない形を作らない”ことが、長期的に効くディレクトリトラバーサル対策になります。
ユーザー入力がファイルパスの一部として扱われ、検証や正規化、境界チェックが不十分なときに起きます。
十分ではありません。エンコードや区切り文字の違いで回避されるため、正規化後の境界チェックとホワイトリストが必要です。
パスを受け取らず、IDで参照してサーバー側で安全なパスに解決する設計にすることです。
パスを組み立てた後に正規化し、その結果が許可ディレクトリ配下かを確認してからアクセスします。
ディレクトリ部分が検証されないと、想定外の場所に到達できるためです。拡張子より境界チェックが重要です。
不要にはなりません。WAFは補助であり、根本はアプリの入力検証と安全な設計で対処します。
「../」やエンコードされた「..」の試行、短時間の探索的アクセス、403/404の連続などの兆候を見ます。
Webプロセスが重要ファイルに触れないようにすると、脆弱性が残っても漏えい範囲を抑えられます。
読み取りが多いですが、書き込み系処理と絡むと改ざんや破壊につながる場合もあります。
ファイル参照系の機能を洗い出し、パス入力をID参照に置き換えるか、正規化後の境界チェックを入れるのが優先です。