第5章 暴露対策
プログラムからのファイル流出対策

保護されるべき、Webサーバコンピュータ上の重要なファイルの内容が、何らかのミスによってインターネットから容易に読み出せるようになっているのがファイル流出問題である。

ファイル流出はふたつのタイプに分かれる。「Webサーバソフトウェアからのファイル流出」と「Webアプリケーションプログラムからのファイル流出」である。ここでは後者について述べる。
ファイル流出
図5-2: ファイル流出

プログラムからのファイル流出

Webアプリケーションプログラムからのファイル流出は、ファイル名をパラメータとして受け取って、その内容を表示するWebプログラムに不備があることから起こる。工夫した値のファイル名パラメータを与えることによって、インターネット上の人物が誰でもサーバコンピュータ内の任意のファイルを読み出せる問題である。

Webアプリケーションプログラムからのファイル流出はさらに、次のふたつのバリエーションに分かれる。

(1) フルパス名を受け入れてしまう問題

カレントディレクトリ内のファイルをオープンすることを想定し、ディレクトリ修飾を付けることなくファイル名のみを用いてファイルをオープンしようとするプログラムは、実はフルパス名を与えられると、そのパス名が表すファイル内容を流出させてしまう。例えば、次のPerlスクリプト、

open(HANDLE, "<$filename");

の$filenameに「/etc/passwd」等のパス名が与えられて、ファイル流出が起こる。

(2) ディレクトリトラバーサル攻撃による流出

ディレクトリトラバーサル攻撃というのは、「../」等の親ディレクトリを示す表記をファイル名パラメータの中に混入し、サーバ内の任意のファイルを読み出そうとする攻撃である。

ファイルをオープンする際、与えられたファイル名の先頭にディレクトリ修飾を追加してパス名を組み立てている場合でも、ユーザから与えられたファイル名の中に「../」あるいは「..\」の親ディレクトリを示すパターンが含まれていると、予定外のファイル内容が流出する。例えば、次のPerlスクリプト、

dir = "/var/data1";
open(HANDLE, "<$dir/$filename");

の $filenameに「../../etc/passwd」等のパス名が与えられて、ファイル流出が起こる。

対策 その1: ファイル名パラメータを警戒

(1) 慎重な設計・実装

ファイル名をパラメータとして受け取るプログラムは要注意プログラムである。そのようなプログラムをWebサイトに置くことを決めた場合は、経験豊かな技術者を割り当てて、慎重に設計・実装する。

(2) プログラマ自己裁量の禁止

それと並行して、事前に計画されていない、プログラマ自己裁量によるファイル名パラメータの新たな設置を禁止し、違反を警戒する。

対策 その2: ファイル名パラメータの検査

ファイル名をパラメータとして受け取るプログラムは、次の入力検査を行う。

(1) Unix, GNU/Linuxの場合

  • 可能なら、ファイル名パラメータの仕様として、ディレクトリ修飾のあるファイル名(「/」を含むパス名)を禁止するものとし、その仕様に沿った入力検査を行う
  • 「/」ではじまるパス名(絶対パス名)を受理しない
  • 「../」(親ディレクトリ修飾)を含むパス名を受理しない

(2) Windowsの場合

  • 可能なら、ファイル名パラメータの仕様として、ディレクトリ修飾のあるファイル名(「/」もしくは「\」を含むパス名)を禁止するものとし、その仕様に沿った入力検査を行う
  • 「英字:\」ではじまるパス名(絶対パス名)を受理しない
  • 「\」ではじまるパス名(絶対パス名のバリエーション)を受理しない。
    Windowsにはプレフィックス「\\?\」を用いた「\\?\c:\foo.bar」のようなパス名表記があり「c:\foo.bar」とほぼ同じ意味をもつ。そのようなパス名を排除する
  • 「../」もしくは「..\」(親ディレクトリ修飾)を含むパス名を受理しない
  • ドライブレターの直後《以外》に「:」を含むパス名を受理しない。Windowsのファイルシステム形式のひとつNTFSのパス名には「:」を用いて副次ストリーム名を示す表記法があり、それを用いたパス名を排除する。例えば、「foo.dat::$DATA」は「foo.dat」と同じ意味をもつ。