ディレクトリトラバーサル(またはパストラバーサル)攻撃は、ユーザーが指定したファイル名のセキュリティ検証またはサニタイズが不十分であることを悪用し、「親ディレクトリへのトラバース」を表す文字がオペレーティングシステムのファイルシステムAPIに渡されるというものです。影響を受けるアプリケーションは、ファイルシステムへの不正アクセスに悪用される可能性があります。
例
PHPの場合
PHPコード 内の脆弱なアプリケーションの典型的な例は次のとおりです。
<?php
$template = "red.php" ;
if ( isset ( $_COOKIE [ "TEMPLATE" ])) {
$template = $_COOKIE [ "TEMPLATE" ];
}
include "/home/users/phpguru/templates/" . $template ;
このシステムに対する攻撃は、次の HTTP リクエストを送信することになる可能性があります。
GET /vulnerable.php HTTP / 1.0
Cookie : TEMPLATE=../../../../../../../../../etc/passwd
サーバーは次のような応答を生成します。
HTTP / 1.0 200 OK
コンテンツタイプ: text/html
サーバー: Apache
ルート:fi3sED95ibqR6:0:1:システムオペレータ:/:/bin/ksh
デーモン:*:1:1::/tmp:
phpguru:f8fk3j1OIf31.:182:100:開発者:/home/users/phpguru/:/bin/csh
後の繰り返し../文字により、ルート ディレクトリに移動し/home/users/phpguru/templates/、
Unix パスワード ファイルが含まれます。
include()/etc/passwd
Unixファイル/etc/passwdはディレクトリトラバーサルのデモンストレーションによく使われるファイルで、クラッカーがパスワード解読を試みる際によく使用されます。しかし、最近のUnixシステムでは、/etc/passwdハッシュ化されたパスワードはファイルに含まれておらず、/etc/shadowマシン上の権限のないユーザーが読み取ることができないファイルに格納されています。しかし、その場合でも、ファイルを読み出す/etc/passwdとユーザーアカウントのリストが表示され、それがさらなる攻撃の起点となる可能性があります。
Zip Slip の脆弱性
もう1つの例としては、 ZIPなどのいくつかのアーカイブファイル形式に影響を及ぼす「Zip Slip」脆弱性があります。[1]
バリエーション
ディレクトリトラバーサルの最も単純な形態では、../パターンが使用されます。一般的なバリエーションを以下に示します。
マイクロソフトウィンドウズ
Microsoft WindowsとDOSのディレクトリトラバーサルでは、..\または../パターンが使用されます。[2]
各パーティションには個別のルートディレクトリ(C:\Cは任意のパーティション)があり、その上位に共通のルートディレクトリはありません。つまり、Windowsのディレクトリ脆弱性のほとんどに対する攻撃は、単一のパーティションに限定されます。
ディレクトリトラバーサルは、Microsoftの多くの脆弱性の原因となっている。[3] [4]
URIのパーセントエンコーディング
一部のウェブアプリケーションは、リクエストURIのパスをスキャンしてのようなパターンを探すことでディレクトリトラバーサルを防止しようとします../。このチェックは、パーセントデコードの前に誤ってのようなパターンを含むURIが、実際に使用される前に%2e%2e/にデコードされているにもかかわらず、受け入れられてしまうことがあります../。[5]
二重エンコーディング
パーセントデコードは誤って複数回実行される可能性があります。検証前に1回、検証後にもう一度実行されると、アプリケーションは二重パーセントエンコーディング攻撃[6]に対して脆弱になります。この攻撃では、不正な文字がセキュリティ対策を回避するために二重パーセントエンコードされた形式に置き換えられます。[7]たとえば、二重パーセントエンコーディング攻撃では、../が二重パーセントエンコードされた形式に置き換えられる可能性があります%252E%252E%252F。[8]この種の脆弱性は、 MicrosoftのIIS Webサーバーソフトウェアのバージョン5.0以前に大きな影響を与えました。[9]
UTF-8
適切に実装されていないUTF-8デコーダーは、必要以上に多くのバイト数でエンコードされた文字を受け入れる可能性があり、 の代わりに のような長すぎるエンコードにつながります。%c0%aeこれはUTF-8標準では明確に禁止されていますが[10] 、 IISウェブサーバーなどのソフトウェアではディレクトリトラバーサルの脆弱性を引き起こします[11]。%2e.
アーカイブ
zipなどの一部のアーカイブ形式では、ディレクトリトラバーサル攻撃が可能です。アーカイブ内のファイルは、バックトラックによってファイルシステム上のファイルを上書きするように記述できます。アーカイブファイルを抽出するコードでは、アーカイブ内のファイルのパスがパストラバーサルに該当しないことを確認するように記述できます。
防止
ディレクトリトラバーサルを防止するためのアルゴリズムとしては次のようなものが考えられます。
- 以下に進む前に、ファイル要求につながらない URI 要求 (ユーザー コードへのフックの実行など) を処理します。
- ファイル/ディレクトリの URI 要求を行うときは、ファイル/ディレクトリが存在する場合はその完全なパスを構築し、すべての文字を正規化します (
%20スペースに変換するなど)。 - 完全修飾された正規化されたパス「ドキュメントルート」が既知であり、この文字列の長さがNであると仮定します。このディレクトリ外のファイルは提供されないものとします。
- 要求されたファイルへの完全修飾パスの最初のN文字が「ドキュメント ルート」と完全に同じであることを確認します。
- そうであれば、ファイルを返却できるようにします。
- そうでない場合、そのリクエストは明らかに Web サーバーが提供できる範囲外であるため、エラーを返します。
ハードコードされた定義済みのファイル拡張子を使用してパスをサフィックスしても、攻撃の範囲が必ずしもそのファイル拡張子のファイルに限定されるわけではありません。
<?php に
$_GET [ "ファイル" ] . ".html"を含めます 。
ユーザーは、 .以降のすべてをバイパスするために、NULL 文字$_GET(文字列の終わりを示す) を使用できます(これは PHP 固有です)。
補完的な防御策としては、悪意のあるパターンをブロックするのではなく、許可されたファイルのホワイトリストを使用する、[12]realpath()やなどの組み込み関数を利用してbasename()パスを正規化し、ディレクトリコンポーネントを削除する、[13]ディレクトリのアクセス許可を読み取り専用に制限する、エラーメッセージでファイルシステムの詳細が明らかにされないようにするなどがあります。[14]
参照
- chroot jail は、適切に作成されていない場合、ディレクトリトラバーサルの攻撃を受ける可能性があります。ディレクトリトラバーサルの攻撃ベクトルとして考えられるのは、jail 外のディレクトリへのファイル記述子のオープンです。作業ディレクトリも攻撃ベクトルとして考えられます。
- 安全でない直接オブジェクト参照
参考文献
- ^ 「Zip Slip脆弱性」。Snyk 。この
脆弱性は、ディレクトリトラバーサルファイル名(例:../../evil.sh)を含む特別に細工されたアーカイブを使用して悪用されます。Zip Slip脆弱性は、tar、jar、war、cpio、apk、rar、7zなど、多くのアーカイブ形式に影響を与える可能性があります。
- ^ 「ファイル、パス、および名前空間の命名」。Microsoft。Windows
APIのファイルI/O関数は、名前をNT形式の名前に変換する過程で「/」を「\」に変換します。
- ^ Burnett, Mark (2004年12月20日). 「Security Holes That Run Deep」. SecurityFocus . 2021年2月2日時点のオリジナルよりアーカイブ。2016年3月22日閲覧。
- ^ 「Microsoft: セキュリティの脆弱性(ディレクトリトラバーサル)」CVEの詳細。
- ^ 「パストラバーサル」。OWASP。
- ^ 「CWE-174: 同一データの二重デコード」cwe.mitre.org . 2022年7月24日閲覧。
ソフトウェアは同じ入力を2回デコードするため、デコード操作の間に行われる保護メカニズムの有効性が制限される可能性があります。
- ^ 「CAPEC-120: 二重エンコーディング」。capec.mitre.org 。2022年7月23日閲覧。
この[二重エンコーディング]により、攻撃者はトラバーサル攻撃やインジェクション攻撃で使用される可能性のある不正な文字や文字列を検出しようとするフィルターを回避できる可能性があります。[...] フィルターを回避するために、入力の一部に二重エンコーディングを試みてください。
- ^ 「二重エンコード」。owasp.org 。2022年7月23日閲覧。
例えば、../(ドット・ドット・スラッシュ)文字は16進数で%2E%2E%2Fを表します。%記号を再度エンコードすると、16進数では%25になります。二重エンコード処理の結果、../(ドット・ドット・スラッシュ)は%252E%252E%252Fになります。
- ^ "CVE-2001-0333". Common Vulnerabilities and Exposures .
- ^ Yergeau, F. (2003). 「RFC 2279 - UTF-8、ISO 10646の変換フォーマット」IETF . doi : 10.17487/RFC3629 .
- ^ 「CVE-2002-1744」。共通脆弱性識別子。
- ^ 「パストラバーサルとは何か、そしてそれを防ぐには? | Web Security Academy」PortSwigger . 2025年12月10日閲覧。
ユーザー入力を処理する前に検証してください。理想的には、ユーザー入力を許可された値のホワイトリストと比較します。
- ^ 「CWE-22: 制限されたディレクトリへのパス名の不適切な制限」cwe.mitre.org . 2025年12月10日閲覧。
パス名の正規版を生成する組み込みパス正規化関数(C言語のrealpath()など)を使用することで、「..」シーケンスとシンボリックリンクが効果的に削除されます(CWE-23、CWE-59)。
- ^ 「データ検証の欠如 - パストラバーサル」。Fluid Attacks Database 。 2025年12月10日閲覧。
リソース
- オープンウェブアプリケーションセキュリティプロジェクト
- WASC脅威分類 - パストラバーサル
- パストラバーサル脆弱性の悪用と修復[永久リンク切れ]
- CWE 共通脆弱性列挙 - パストラバーサル
外部リンク
- DotDotPwn – ディレクトリ トラバーサル ファザー
- ディレクトリトラバーサルの使用に対する有罪判決。
- 「悪法で利益を得るのは悪人だけだ」comment.zdnet.co.uk 2005年10月7日。2006年10月8日時点のオリジナルよりアーカイブ。
- Bugtraq: IIS %c1%1c リモート コマンド実行
- 暗号ニュースレター 2001 年 7 月。