ファイル名の入力に ../ を混ぜることで、サーバーの奥にある .env まで読めてしまう脆弱性が、パストラバーサルです。仕組みと確実な防ぎ方を解説します(攻撃手順は載せません)。
どこに出るか
「利用者の入力でファイルを選ぶ」場所すべてが候補です。
| 機能 | 危ない使い方 |
|---|---|
| ダウンロード/プレビュー | ?file= にファイル名をそのまま使う |
| 画像/添付の表示 | パスの一部をURLパラメータから組み立てる |
| アップロード | 保存先パスにユーザー指定の名前を使う(書き込み型・最も危険) |
| テンプレート/言語ファイル読込 | ?lang= 等でファイルを動的に選ぶ |
なぜ成立するか(仕組み)
../ は「一つ上の階層へ」を意味します。アプリが 公開フォルダ + 利用者入力 をそのまま連結してファイルを開くと、../ を重ねた入力で公開フォルダの外へ出られてしまいます。
読み取りなら情報漏えい、書き込み(アップロード)なら任意の場所にファイルを置かれ、RCE につながることもあります。
防御:入力をパスにしない+基準内に閉じ込める
利用者入力を生のファイルパスにしない(最重要)
公開するファイルは ID→実ファイルの対応表(許可リスト)で引く。利用者が渡すのは「3番」「invoice」等の識別子だけにし、実パスはサーバーが決める。
正規化してから“基準ディレクトリの内側か”を必ず確認
言語標準のパス正規化(resolve/realpath 相当)で絶対パス化し、それが許可した基準ディレクトリで始まっているかを検証。外なら拒否。../ の単純な文字列除去はエンコード回避があるため不可。
アプリを最小権限で動かす
アプリ実行ユーザーが読めるファイルを業務に必要な範囲へ絞る。万一抜け出されても、そもそも読めなければ被害が出ない。
“出してはいけない物”を公開ルートの外へ
.env・.git・鍵・バックアップは、そもそもWebルートやアップロードフォルダに置かない。配置を変えて、攻撃される対象をなくす。
当サイトの視点:配置ミスと同じ種類の問題。対処の順番を間違えない
パストラバーサルは、.env 公開の事故と同じ種類の問題です。どちらも「本来Webから届くべきでない物に、Web経由で届いてしまう」問題。応急処置(ヘッダや単純フィルタ)で表面的に防いでも、コードと配置が直っていなければ別の経路で読まれます。順番は①入力をパスに使わないコード ②基準ディレクトリ内チェック ③そもそも秘密を公開ルート外へ。共有レンタルサーバーでの安全な配置も合わせて読むと、根本対処の方法が分かります。
似た問題との違い
「見せてはいけないファイルが外から読める」という結果は同じでも、原因によって直す場所が違います。
| 問題 | 原因 | 直す場所 |
|---|---|---|
| パストラバーサル | ファイルを指す入力で、許可した場所の外へ出られる | アプリのコード(入力をパスに使わない) |
| ローカルファイルインクルード(LFI) | 読み込んで実行するファイルを入力で選ばれる | アプリのコード(読み込むファイルを固定する) |
| 公開ディレクトリの置き忘れ | .env や .git がWebから見える場所にある(→ 公開ディレクトリに置いた秘密情報) | 配置とWebサーバーの設定 |
| IDOR | ファイルのIDは正しい形式だが、他人のファイルを指せる | アプリの権限チェック |
具体例:Webサーバーそのものにあった脆弱性
パストラバーサルは自作のアプリだけでなく、広く使われる製品にも見つかります。
- Apache HTTP Server 2.4.49(2021年):パストラバーサルの脆弱性(CVE-2021-41773)があり、Apacheは「実際に悪用されている」と公表しました。2.4.50で修正されましたが、修正が不十分だったため(CVE-2021-42013)、2.4.51で改めて修正されています。設定によっては、ファイルの読み取りだけでなくRCEにも至りました。
- WordPress本体(2026年):ページテンプレートを解決する処理のパストラバーサルが、条件付きでRCEに至るファイルインクルードの脆弱性(CVE-2026-87902)につながりました(→ CVE-2026-87902の解説)。
米国のCISAとFBIは2024年5月、この種類の脆弱性をなくすよう製品の作り手に求める注意喚起を出しました。その時点で、CISAのKEV(実際に悪用が確認された脆弱性の一覧)には、ディレクトリトラバーサルの脆弱性が55件載っていたとしています。MITREが2025年12月に公表した「CWE Top 25」でも、パストラバーサル(CWE-22)は6位です。
自分のサイトで確認する方法
ファイルを開く処理に入力が入る箇所を探す
ソースコードで、ファイルを開く・送る関数(open・readFile・sendFile・include など)や、パスを組み立てる関数(path.join など)に、リクエストの値が入る箇所を探す。
チェックの順番を確認する
入力を使う箇所で、パスを正規化(path.resolve や realpath)した後に、基準ディレクトリの内側かを確かめているかを見る。正規化の前に文字列を調べているだけなら、順番を直す。
Webサーバーと製品の版を確認する
Apache 2.4.49・2.4.50 のように、パストラバーサルが知られている版を使っていないかを確認する。CVE / KEV ルックアップで、使っている製品の既知の脆弱性を調べられる。
外から見えてはいけないファイルを確認する
サイト総合セキュリティ診断で、.env・.git・データベースのダンプが外から読めないかを点検する。読めた場合は、パストラバーサルとは別に、配置を直す。
出典(一次情報)
- CISA・FBI「Secure by Design Alert: Eliminating Directory Traversal Vulnerabilities in Software」(2024年5月2日) — cisa.gov(KEVに55件、ランダムな識別子を使う対策)
- Apache HTTP Server「Apache HTTP Server 2.4 vulnerabilities」 — httpd.apache.org(CVE-2021-41773・CVE-2021-42013)
- MITRE「2025 CWE Top 25 Most Dangerous Software Weaknesses」(2025年12月) — cwe.mitre.org(CWE-22 が6位)
- OWASP「Path Traversal」 — owasp.org
- IPA「安全なウェブサイトの作り方」 — ipa.go.jp(パス名パラメータの未チェック/ディレクトリ・トラバーサル)
次に読む
- 事故:.env を丸ごと公開してしまった事故
- 対策:レンタルサーバーでの .env 保護 / 用語:RCE とは