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

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

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

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

📌 このページのポイント
許可した場所の外を指してしまう ファイルパスの不備で許可範囲の外へ/srv/appconfig.env公開範囲の外files公開用report.pdf許可したファイル../config.env基準の files から親へたどってしまう読み書きの範囲はアプリの処理・権限による許可範囲と利用者の権限を確認する
架空の例で、/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(横断する)が語源。ディレクトリ構造を「横断」してアクセスするイメージだよ

参考資料

← 用語集にもどる