入力パラメータとしてファイル名またはパス名を扱う場合、細工されたファイル名が与えられて、所定のディレクトリの範囲外のファイルへユーザが不正にアクセスするおそれがある。ひとつのファイルを識別するための名前──ファイル名、あるいはファイル名がディレクトリ修飾されたパス名──には異なる表現が複数通りあり得、攻撃者はそうした「別名」を使って予定外のファイルにアクセスしてくる。ファイル名の入力検査においては受け入れるべきでないパス名のパターンをすべて排除する必要がある。通常のディレクトリ修飾ファイルを特定する方法には、ディレクトリ修飾をする方法とファイル名のみでの方法の2種類がある。特別なディレクトリ修飾ファイルを特定するパス名のディレクトリ修飾には、上記(1)の通常の指定方法のほかにカレントディレクトリからの相対パスによって修飾する方法がある。ディレクトリトラバーサル攻撃パス名にディレクトリ修飾を許す場合、上記(2)のような相対パスが混入されて引きおこされるディレクトリトラバーサル攻撃を防ぐためにも、パス名の正規化チェックが必要となる。※ディレクトリトラバーサル攻撃ファイル名を受け取り処理するプログラムにおいて、相対パスを混入して、意図しないファイルを読み出したり、既存のファイルを破壊したりする攻撃。ファイルの別名Windowsにおけるファイル名とパス名の特性Windowsにおけるファイル名とパス名には、上記ファイル名・パス名の一般的特性の(1)および(2)にあるようなディレクトリ修飾に加えて、次のような特性がある。8.3形式のショートネーム8.3形式のショートネームは、8byteの名前と3byteの拡張子からなるファイル名である。Windows95以降では、255byte(UNIXの場合は256byte)までのファイル名が使用可能になったが、以前の古いソフトウェアとの互換性を考慮して、OS内部では自動的に生成した8文字の名前を保持している。「foo2.txt」として扱われる。NTFSでは、ファイル名中の「:」はNTFSファイルの「ストリーム」を表す区切り記号として意味をもつ。ストリームを使うと、あるファイルの付随するデータをもたせることができる。stm2にもたせている。パス名をチェックするプログラムのアクセスするディレクトリを制限させるには、下記のようにパス名をチェックする対策を行う必要がある。相対パス、絶対パスを受け付けないようにする場合パス名に相対パス、絶対パスを受け付けないようにするには、パス名の文字列中に「/」が無いことをチェックすれば良い。相対パスを受け付けないようにする場合パス名の文字列に相対パスを意味する「../」が含まれないことをチェックする。絶対パスを受け付けないようにする場合パス名の文字列の先頭が絶対パスを意味する「/」でないことチェックする。使用し相対パスから絶対パスへの形式に変換し、プログラムが許可するパスであるかをチェックする。シンボリックリンクをチェックする扱うファイル名にシンボリックリンクを許す場合とそうでない場合がある。いずれの場合も、ファイル名が指し示すファイルの実態が、所定のものであることを確認するロジックが必要である。シンボリックリンクに関する話題は『シンボリックリンク攻撃対策』を見られたい。4の方法が有効である。次の点を考慮に入れる。多くの自由度をもつWin32のパス名を相手にするには複雑なロジックのプログラムが必要になるが、パス名の解釈に伴う「拡張機能」の多くを不活性化する特殊な指定方法がある。それはパス名の先頭に\\?\という4文字を付け加えることである。\\?\から始まるパス名については拡張機能が次のようにはたらかなくなる。予約デバイス名の回避Windowsのファイル名には、下記のような予約されたデバイス名がある。パス名の構成要素──ファイル名あるいはディレクトリ名──のひとつでもこれらの綴りと一致していると、そのパス名はデバイスを表すものと解釈され、ファイルではなく、デバイスがオープンされ、プログラムは限りなく入力待ちになる。したがって、これらの綴りがパス名の構成要素に現れていないことを検査する必要がある。ように拡張子がついた綴りもデバイス名と解釈されるので注意が必要である。まとめ通常のディレクトリ修飾やファイル名のみでの指定を期待していると、相対パス修飾による想定していないファイルへの不正アクセスを許してしまうおそれがある。これは、ファイル名の表現が複数通りあり得ることが原因である。対策としては、このようなファイル名の「別名」を指定できないように排除する必要がある。Windowsでは、Windowsならではの特性もあるので、この特性にも注意を向ける必要がある。