【でぃれくとりとらばーさる】

ディレクトリトラバーサル とは?

最終更新:
💡 ファイルパスの不備を突き、許可した場所の外へアクセスする攻撃

ファイルパスの処理の不備を突き、許可されたディレクトリの外のファイルにアクセスする攻撃。「../」などが使われる。読み取りや書き込みが可能になる範囲は、アプリの処理とOS上の権限にも依存する。

📌 このページのポイント
許可したフォルダーの外へ /srv/app ../config.env config.env 公開範囲の外 範囲の確認が ない場合の例 files 公開用フォルダー report.pdf 読み取れるかは、アプリの処理と権限にも依存
基準は /srv/app/files。../config.env は /srv/app/config.env を指す。青は公開用の許可範囲、赤は範囲外へのアクセスの試み。ファイル名の例は架空で、OSの権限を突破できるという意味ではない。
ひよこ ひよこ
ディレクトリトラバーサルってどういう攻撃?
ペンギン先生 ペンギン先生
たとえば公開用フォルダー /srv/app/files にある report.pdf を返すアプリを考えよう。入力されたファイル名をそのままつなぐと、../config.env で一つ上の /srv/app/config.env を指せてしまう。範囲を確認しない処理では、公開用フォルダーの外のファイルを返すおそれがあるんだ。
ひよこ ひよこ
どんなファイルが狙われるの?
ペンギン先生 ペンギン先生
接続情報を含む設定ファイルやソースコードなどだよ。ただし、パスを指定できれば何でも読めるわけではない。アプリの実行権限で読めるか、どんなファイル操作をするかにも依存するんだ。書き込み処理に不備があると、許可範囲の外を書き換える危険もあるよ。
ひよこ ひよこ
どうやって防ぐの?
ペンギン先生 ペンギン先生
入力をファイルパスにせず、決められたIDから許可したファイルへ対応付ける方法があるよ。パスを扱うなら、「..」などを解消し、実際の参照先が分かるパスへ変換したうえで許可したディレクトリの内側かを確認する。シンボリックリンクの参照先も考慮し、利用者がそのファイルを扱う権限も確認するんだ。アプリを必要最小限のOS権限で動かすことも大切だよ。
ひよこ ひよこ
「../」という文字を拒否するだけじゃだめなの?
ペンギン先生 ペンギン先生
それだけでは不十分だよ。URLエンコードなどで表記が変わるからね。%2e%2e%2f は ../ を一度エンコードした例で、..%252f はスラッシュを二重にエンコードした例。デコードと検証の順序をそろえ、検証後にもう一度デコードして危険なパスが現れないようにするんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ディレクトリトラバーサル」って出てきたら「パス処理の不備を突いて、許可した場所の外のファイルにアクセスする攻撃」と思えばだいたいOK!
📖 おまけ:英語の意味
「Directory Traversal」 = ディレクトリの横断
💬 traverse(横断する)が語源。ディレクトリ構造を「横断」してアクセスするイメージだよ

参考資料

← 用語集にもどる