Directory Traversalの攻撃手法と対策
概要
Directory Traversalとは、攻撃者がWebアプリケーションの不適切な入力処理を悪用して、通常はアクセスが許可されていないサーバー上のファイルやディレクトリにアクセスする攻撃手法のこと。Traversalとは「横断」という意味なので、ディレクトリを横断して本来アクセスできないディレクトリやファイルにアクセスすることを指す。
filename := "受け取ったリクエストパラメータの値"
text, err := ioutil.ReadFile("./public/" + filename)
// textを用いた処理
上記のような実装の場合、リクエストパラメータに不正なパス(例: ../../../../secret/passwd
)を指定することで、アクセスを許容している/path/to/public
ディレクトリを超えて、別のディレクトリやファイルにアクセスし、機密情報やシステムファイルが漏洩する可能性がある。
攻撃方法の例
Webサーバーの設定からの攻撃
パスワードなどのファイルがある場所は、アプリケーションによって異なるが、サーバーの設定情報やログなどはだいたい決まった場所に置かれる。
たとえば設定ファイルを置く場所は、Nginxなら/etc/nginx/nginx.conf
に、Apacheなら/etc/httpd/conf/httpd.conf
に置かれることが多いので、攻撃者はこれらのファイルを参考に他のパスを考える。
プロセス情報からの攻撃
以下のようにプロセス情報がある。
/proc/{Process ID}/cmdline
/proc/{Process ID}/environ
/proc/{Process ID}/stat
/proc/{Process ID}/cwd
/proc/self/*
たとえば/proc/self/environ
が見れると、プロセスがもつ環境変数が読み取れるため、アクセストークンやパスワードなどの情報が漏洩する可能性がある。
ログファイルからの攻撃
/var/log
ディレクトリには、アクセスログやエラーログなどが保存されている。これらのログファイルには、アクセスしたユーザーやリクエストパラメータなどの情報が記録されているため、攻撃者はこれらの情報を参考に攻撃を行うことができる。
また、ログ・ファイルからシステムの脆弱性を特定し、攻撃することもできる。
Directory Traversalの対策
1. システム設計を見直す
そもそもの原因であるパスを指定してファイルを読み取る必要があるのかという仕様を検討する必要がある。
2. ホワイトリスト方式での入力検証
「1.システム設計を見直す」でどうしてもユーザーからパスを受け取ってファイルを参照しなければならない場合は、アクセス可能なファイルやディレクトリをホワイトリストに登録し、それ以外のパスは拒否するようにする。
3. 抽象的な入力値の検証
「2.ホワイトリスト方式での入力検証」を行う場合、ホワイトリストの件数が膨大になる可能性がある。
ファイル名は/[a-zA-Z0-9.]/
のみを許可することや、絶対パスのみを許容したり、パスを正規化し許可されるディレクトリなのかチェックしたりする。
4. エラーメッセージの精査
エラーログが万が一攻撃者に渡っても次の攻撃がこないように、不要なパス情報やシステム情報を含めないようにする。
5. セキュリティツールの導入
WAF(Web Application Firewall)などのセキュリティツールを導入し、不正なパラメータを検知・防御する。