ディレクトリトラバーサル(別名:パス・トラバーサル)は、Webアプリケーションにおけるセキュリティ上の
脆弱性を突く攻撃手法の一つです。この攻撃は、アプリケーションがファイルパスを処理する際に、ユーザーからの入力に含まれる「..」(ドットドット)などの特別な
文字列を適切に検証・無害化しない場合に発生します。攻撃者はこの
脆弱性を悪用して、本来アクセスできないファイルや
ディレクトリにアクセスし、機密情報の漏洩やシステム侵害などの被害を引き起こす可能性があります。
ディレクトリトラバーサル攻撃は、主に以下の手順で実行されます。
1.
脆弱なアプリケーションの特定: 攻撃者は、ファイルパスの検証が不十分なWebアプリケーションを特定します。
2.
攻撃文字列の挿入: ユーザーからの入力(例えば、URLのパラメータやCookie)に、「../」のような、一つ上の
ディレクトリを表す
文字列を挿入します。
3.
パスの操作: アプリケーションは、挿入された攻撃
文字列を処理する際に、本来のファイルパスから意図しない場所に移動してしまいます。
4.
機密ファイルへのアクセス: 結果として、攻撃者はWebアプリケーションのファイルシステム内の任意のファイルにアクセスできるようになり、システムファイルや機密情報を取得したり、アプリケーションの設定ファイルを変更したりすることが可能になります。
例えば、以下のようなPHPの脆弱なコードがあったとします。
php
$template = $_GET['template'];
include("templates/" . $template);
?>
このコードは、`template` パラメータで指定されたファイルを読み込んでいます。攻撃者が `template` パラメータに `../../../../etc/passwd` を指定すると、アプリケーションは `/home/users/phpguru/templates/../../../../etc/passwd` を読み込もうとします。これにより、
UNIX系のシステムのパスワードファイルである `/etc/passwd` にアクセスできてしまいます。
ディレクトリトラバーサルのバリエーション
ディレクトリトラバーサル攻撃は、単純な「../」だけでなく、以下のような様々なバリエーションが存在します。
Windowsにおける攻撃: Windowsでは、「..\」のようなバックスラッシュを用いたパスも利用されます。ただし、多くのWindowsプログラムやAPIはUNIX形式のパスも受け入れます。
パーセントエンコードされた攻撃: 「../」のような
文字列をパーセントエンコードすることで、Webアプリケーションの
脆弱性を突くことができます。例えば、`%2e%2e%2f` は `../` に変換されます。
Unicode/UTF-8エンコードされた攻撃: UTF-8のエンコーディングは、特定の文字を異なる表現でエンコードできるため、このエンコードを利用してセキュリティ対策を迂回する攻撃も存在します。
ディレクトリトラバーサル攻撃を防ぐためには、以下の対策が有効です。
入力値の検証: ユーザーからの入力値に、危険な文字(「../」など)が含まれていないか厳密に検証します。許可された文字のみを受け入れるようにする必要があります。
パスの正規化: 入力されたパスを、絶対パスに変換して正規化します。これにより、異なる表現のパスが同じパスとして扱われるようになります。
ファイルパスの制限: アプリケーションがアクセスできる
ディレクトリを制限します。例えば、ファイルにアクセスする前に、アクセスするファイルが指定の
ディレクトリ内にあるかを確認します。
サンドボックス環境: アプリケーションをサンドボックス環境で実行することで、システム全体への影響を限定的にします。
セキュリティ対策の定期的な見直し: セキュリティ対策は一度実施したら終わりではありません。定期的に見直し、
脆弱性がないかを確認する必要があります。
具体的な対策例
以下に、
ディレクトリトラバーサルを防ぐための具体的な対策例をいくつか示します。
1.
パスの正規化処理: 入力されたパスを `realpath()` や `canonicalPath()` などの関数で
正規化し、絶対パスに変換します。
2.
文書ルートの制限: アクセスを許可する文書ルート(例えば、Webアプリケーションの公開
ディレクトリ)を設定し、それ以外の場所へのアクセスを拒否します。
3.
URLのパスをファイルパスとして直接利用しない: ファイルシステムへのアクセスが必要な場合、URLから直接ファイルパスを生成するのではなく、別途定義したIDやキーを用いてファイルへのアクセスを制御します。
4.
アクセス制御リスト (ACL) の設定: ファイルシステムレベルでアクセス制御を適切に設定し、不必要なファイルへのアクセスを禁止します。
まとめ
ディレクトリトラバーサルは、Webアプリケーションにとって深刻なセキュリティリスクです。適切な対策を講じることで、この攻撃を防ぎ、システムを保護することができます。開発者は、上記のような対策を実装し、セキュリティ意識を高く持つことが重要です。
参考情報
Open Web Application Security Project (OWASP)
IPA 独立行政法人 情報処理推進機構:安全なウェブサイトの作り方
* 各種セキュリティベンダーのブログ記事や解説ドキュメント