対策
ディレクトリトラバーサル対策でもっとも確実な方法には、以下のようなものが考えられる。
1. Webアプリケーションがアクセス可能なディレクトリ(たとえば、/var/data/)と、その配下にあるファイルのファイル名(これが入力データとなる。たとえば、../../../etc/passwd)を組み合わせたパス(この例であれば、/var/data/../../../etc/passwd)を開発言語などが用意している方法で正規化する。2. 正規化されたパス(先の例であれば、/etc/passwd)がアクセス可能なディレクトリ(先の例であれば、/var/data)の配下にあるかどうかを確認する。これには、正規化されたパスがアクセス可能なディレクトリに前方一致しているかどうかを確認する。
3. 前方一致している場合のみ、ファイルの読み書きを行う。
パスの正規化を開発言語などでサポートしていない場合、開発者がパスの正規化を自作する必要がある。しかし、そのようなコードを作成する代わりに、ディレクトリを区切る文字を含まない場合のみファイルの読み書きを行うことなどで対策が可能だ。
この方法の場合、文字コードの違いによる影響についても考慮する必要があるため、除外する文字があることを検出する方法(いわゆるブラックリスト方式)は推奨できない。
使用するファイルが制限されているのであれば、ファイル名を直接指定するのではなく、使用するファイル名を配列などで管理しておき、Hiddenフィールドなどの入力データとして、配列の添え字を指定することで、容易にこの脆弱性が存在しないアプリケーションを作成することができる。
強制ブラウジングとは
強制ブラウジングは、ユーザーが本来アクセス権限のないファイルまたはページにアクセスできる脆弱性だ。
この脆弱性が原因となった事件として、もっとも有名なものは2002年に発生したTBCからの個人情報漏えい事件だ。この事件は、使用していたウェブアプリケーションで、本来利用者にアクセスされてはいけない個人情報を含むファイルをウェブサーバのドキュメントルート上に保存していたため、ウェブサーバ経由で誰でも取得可能になっていたというものだ。
また、1年前まで、会員制サイトにユーザーがアップロードした画像が、会員でないユーザーにもアクセス可能だった。これは、セッション管理が適切に行われておらず、適切なアクセス制御がなされていなかったためだ。
このように、この脆弱性は、データの保存場所の問題だけでなく、セッション管理の問題も原因となる。