エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

ディレクトリトラバーサルまとめ

現場でディレクトリトラバーサルを突かれたWebサイトがあったから横断確認した。
作業指示とかイラついたけど、またの機会に。



ディレクトリトラバーサルのまとめ

ディレクトリトラバーサルとは
管理者が意図していないパスでサーバ内のファイルを指定することによって、許可されないファイルを不正に閲覧すること。
危険性は以下のとおり
アップロード・・・マルウェア、ウィルス感染
ダウンロード・・・情報の不正流出

------------

http://test.example.com?filename=../../test.txt
ファイル名に../を含むため、本来のパス上と違うところにアクセスすることになる。

------------
対策
対策としては無害化するか、チェックで引っ掛ける、固定ファイルに出力しかない。
以下は思いつく方法&調べて結果の方法をまとめておく

1.ホワイトリスト [チェック検出]
アクセスするファイルパスを生成後、どこにアクセスしているか確認する。
許可しているところ以外なら、ビジネスロジック層で何とかする。
ファイルを置く場所が決まっている時に有効。
パラメータに足してではなく、最終的な出力先のパスに対してチェックを行う。
 
2.サニタイジング [無害化]
方法としては下記2パターン
・パラメータからファイル名のみを抽出する
・パラメータからパスから「..」を削除する。
どちらもパラメータに対して行う。
URLエンコードして渡されることがあるので、実施タイミングに留意する必要がある。

3.ブラックリスト [チェック検出]
許可してないところにアクセスしてないかチェックする。
許可してないところなら、ビジネスロジック層で何とかする。
パラメータに足してではなく、最終的な出力先のパスに対してチェックを行う。
ブラックリストだけだと肥大化する。
ホワイトリストを優先的に使い、ブラックリストを使わないといけない状態以外は使うべきではないと思う。

4.ディレクトリのアクセス権限を分ける。
保存するディレクトリ以外のところのアクセス権限を強固にする。
ビジネスロジックでなんとかするのではなく、OSレベルで対応する。
一番強固だが、管理が煩雑化しそう。

5.ファイル名チェック
2.サニタイジングと被るが、ある程度しようとしてファイル名のパターンを決めておき、チェックが出来るようにしておく。
これも2.サニタイジングと同様に、URLエンコードされている可能性があるので、実施タイミングに注意が必要。

6.固定ファイル出力
決まったファイルにだけ出力する。

-----------

ざっと調査&思いつく対策は以上。
なんというか、こういうのって単純なんだけど、対策が面倒くさい。
一番は、機能にファイルのアップロード&ダウンロードがないことだけど、どうしても必要になることはある。
そういった機能を追加する場合には上記観点が必要になる。
ソースレビューくらいでしか検知できない気がする。
もっと横断的に簡単に検出出来ないものか?

IPAが公開している情報が一番参考になるかな?
一読することを進める。
https://www.ipa.go.jp/files/000017316.pdf


個人的にはホワイトリストチェックが一番な気がする。
パスを組み立てて、最終的にアクセスするディレクトリが違っていたら不正だってわかるから。
サニタイジングは、「実は抜けがあります!」とかありそうで怖い。
サニタイジングホワイトリストチェック両方やるのが無難かも。
セキュリティ対策はやり過ぎってことは無いから、いろいろチェックしたくなる衝動に狩られる。


この記事は、ワールドトリガーのアニメを見てる時に書いた。
全く関係無いけど、
PileのドリームトリガーのCMを見て思ったが、あのおっぱいは反則だと思いました。
ガンダムSEED玉置成実のおっぱいを思い出した。
特に乳の大きさは気にしないけど、激しく動くと視線は自然と乳に釘付けされるよね。。。
書くのもニンニンジャーまでかかってしまった。
今の中学生くらいは、多分Pileの胸をみてムラムラしているのではないかと思いました。