ディレクトリトラバーサルとは?
ディレクトリトラバーサル(「パストラバーサル」とも呼ばれ、CWE-22 として特定されています)は、基盤のファイルシステムに保存された意図しないファイルに攻撃者がアクセスできるようにする Web アプリケーションの脆弱性です。トラバーサルが発生する場所と方法によっては、これにより攻撃者が Web サーバー上の任意のファイルを読み書きできるようになり、機密データやファイルを読み取ったり、アプリケーションデータを変更したり、Web サーバーを完全にコントロールしたりできる可能性があります。
通常、トラバーサルの脆弱性は、ファイルの読み取りまたは書き込みを可能にするかどうかに基づいて説明されます。以下の各サブセクションでは、それぞれがもたらす影響を示します。
任意のファイルの読み取りを可能にするディレクトリトラバーサル
ユーザーが写真を保存できるアプリケーションで、保存した写真を後で取得する際に、取得するファイルを指定するためにファイル名パラメータを使用した GET リクエストを行えるケースを考えてみましょう。アプリケーションにパストラバーサル対策が施されておらず、提供されたファイル名パラメータを使用してファイルパスを構築する場合、基盤となる Web サーバーから任意のファイルを取得できる可能性があります。図1は、このシーケンスを実際に示しています。

アプリケーションが説明したトラバーサルに対して脆弱であっても、考慮すべき制限としてアプリケーションの権限などが依然として存在します。例えば、Web サーバー上でアプリケーションのアクセスを制限する最小権限モデルが適用されている場合、その権限によって、攻撃者がこの脆弱性を利用してアクセスできるファイルが制限される可能性があります。これは、トラバーサルのペイロードで/etc/passwdがターゲットとしてよく使用される理由のひとつです。ファイルはすべてのユーザーが読み取り可能である必要があります。アプリケーションのアクセスをサンドボックス化して制限する方法はほかにもあり、それについては防止のセクションでさらに詳しく説明します。
任意のファイルの書き込みを可能にするディレクトリトラバーサル
同じ写真保存アプリケーションについて考えてみましょう。ただし、このアプリケーションでは、ユーザーが保存する各写真に名前を付けられるようになっています。ファイルをディスクに保存する際、アプリケーションは提供された名前を使用して写真ファイルのファイルパスを構築します。十分な保護対策が施されていない場合、攻撃者は提供された名前にトラバーサルシーケンス(例:../)を追加し、ファイルがどのディレクトリに保存されるかをコントロールできます。
これは写真を保存しているだけなので無害に思えるかもしれませんが、さらに悪用される可能性があります。ファイルタイプが検証されていない場合(例:JPEG、PNG)、攻撃者は任意のファイルタイプをアップロードでき、次のような複数の異なる悪用シナリオにつながる可能性があります。
永続的なアクセスを得るために、攻撃者の公開キーをユーザーの authorized_keys ファイル(例:/root/.ssh/authorized_keys)に追加する
アプリケーションファイルを上書きしてアプリケーションの動作を変更する
Web ルート内に Web シェルをアップロードする
必要なシステムファイルを上書きしてサービス拒否攻撃を引き起こす
実行可能なファイル(マルウェア、ランサムウェアなど)をアップロードする
アプリケーションのアクセスレベルによっては、ディレクトリトラバーサルによる任意のファイル書き込みの影響が壊滅的になる可能性があります。
ディレクトリトラバーサルの実例
ディレクトリトラバーサルの基本を押さえたところで、最近実際に発生したこの脆弱性の悪用をいくつか見てみましょう。
共通脆弱性識別子-2023-2825: Gitlab のディレクトリトラバーサル
Gitlab バージョン 16.0.0 では、任意のファイルの読み取りを可能にするディレクトリトラバーサルの脆弱性があります。デフォルトの Gitlab インストールで Issue に添付ファイルとしてファイルをアップロードすると、以下に示すパターンで、Gitlab はそのファイルを 10 階層深いディレクトリに保存します。
/var/opt/gitlab/gitlab-rails/uploads/@hashed/<directory>/<directory>/<directory>/<directory>/<filename>アップロード後、Gitlab はアップロードされたファイルを取得するためのエンドポイントも次の場所で提供します
/<repo-name>/uploads/<file-id>/<filename>そのエンドポイントへのリクエストにおいて、Gitlab は filename パラメータのサニタイズや検証を行わないため、ディレクトリトラバーサル攻撃が可能になります。トラバーサルを悪用するには、リポジトリが少なくとも5つのグループ内にネストされている必要があります。グループの数は、この脆弱性を使用してトラバースできるディレクトリの数に直接相関します。
これは、標準的なインストールでは、ファイルシステムのルートに到達できるようにするために、リポジトリを11個のグループにネストする必要があることを意味します。このシナリオでは、/etc/passwd ファイルを取得するための攻撃ペイロードは以下のようになります。
GET /Group-1/Group-2/Group-3/Group-4/Group-5/Group-6/Group-7/Group-8/Group-9/Group-10/Group-11/<repo-name>/uploads/<file-id>/..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2fetc%2fpasswd認証されていない攻撃者は、パブリックリポジトリがネストされたグループの要件を満たしている場合にのみ、この脆弱性を悪用できます。この可能性は低く、悪用の要件を満たすためにネストされたグループとリポジトリを作成する権限を持つ認証済みユーザーによって悪用される可能性の方が高いです。完全なエクスプロイトチェーンでは、まず必要なグループとリポジトリを作成し、ファイルをアップロードしてから、トラバーサルを悪用して任意のファイルを読み取ることができます。詳しくはこちらのPOCをご覧ください。
共通脆弱性識別子-2022-48362: ManageEngine Desktop Central のディレクトリトラバーサル
ManageEngine Desktop Central の 10.1.2127.1 より前のビルドでは、ファイルアップロード機能におけるディレクトリトラバーサルにより、「computerName」パラメータ(または他のいくつか)を操作してトラバーサルシーケンスを含めることで、任意のファイル書き込みが可能でした。
この問題が発見された当時、この脆弱性は活発に悪用されており、認証バイパス(CVE-2021-44515)と組み合わせることでリモートコード実行を可能にしていました。説明を簡潔にするため、ここではこの悪用のパストラバーサルの部分に焦点を当てます。これは、ファイルの書き込みを可能にし、緩い検証をバイパスするためです。
Desktop Central の「doPost」と呼ばれる関数では、ファイルアップロードの一環として「computerName」や「filename」などを含む複数のパラメータが処理されます。この関数によって、ファイルの書き込みを可能にするディレクトリトラバーサルの実行につながるふたつの脆弱性が生じます。
filename パラメータのみがトラバーサルシーケンスについてチェックされます。「domainName」や「computerName」、「customerId」などの他のパラメータは、ファイルの絶対パスを構築するために使用されますが、トラバーサルシーケンスについてはチェックされません。「computerName」は連結された文字列で使用される最後のパラメータであるため、追加の内容がその後に付加されないことから、トラバーサルシーケンスを入力するのに最適な場所です。
ファイルアップロードは zip、7z、gz の拡張子を持つファイルを許可します。これは一見安全に見えるかもしれません。ただし、Desktop Central は Java アプリケーションであり、JAR ファイルは zip 形式で構築されているため、これによりリモートコード実行が可能になります。zip ファイルを
C:\Program Files\DesktopCentral_Server\libディレクトリにアップロードし、再起動を強制することで、巧妙な攻撃者はアプリケーション内のクラスファイルを上書きして独自のコードを含め、コード実行を取得できます。
この脆弱性は、トラバーサル脆弱性によって生じ得る深刻な影響を浮き彫りにすると同時に、不完全な防止対策によって意図せずディレクトリトラバーサルを許してしまう可能性があることも示しています。
WAF で確認されたディレクトリトラバーサル
2023年第2四半期の『ネットワークインテリジェンスに見る脅威レポート』でも指摘されているように、ディレクトリトラバーサルは最もよく観測される攻撃手法のひとつです。
この背景には、攻撃が成功した場合の影響の大きさ、攻撃者やスキャナーが使用できるペイロードリストのサイズなど複数の理由が存在します。例えば以下のように、PayloadsAllTheThings ディレクトリトラバーサルのリストのひとつから取得したスニペットでは、以下のように同じファイルを異なる深さのトラバーサルで読み込もうとする試みが確認できます。
../../../../../../../../../etc/passwd
../../../../../../../../etc/passwd
../../../../../../../etc/passwd
../../../../../../etc/passwd
../../../../../etc/passwd
../../../../etc/passwd
../../../etc/passwdほとんどの場合、攻撃者はトラバーサル脆弱性をテストする際に、アプリケーションがファイルシステムのどこにあるのかを把握していない可能性が高いです。しかし、アプリケーションはシステムルート(つまり /)を超えることがないため、攻撃者はルートに確実に到達できるように「../」の長いシーケンスを使用すると同時に、長いシーケンスがブロックされたりアプリケーションの機能を損なったりした場合に備えて、短いシーケンスも含めます。
クロスサイトスクリプティング(XSS)など他の種類の攻撃は、複数の手法が単一のペイロードに統合されたペイロードのポリグロットを使用することができます。つまり、攻撃者やスキャナーはトラバーサルのテストにおいて、XSS のテストよりもはるかに多くのペイロードを送信することになります。例として使用している PayloadsAllTheThings のファイルは140のペイロードを含んでいます。一方、 XSS_Polyglots ファイルに含まれるペイロードの数は16です。PayloadsAllTheThings における最も大きなトラバーサルのペイロードファイルは21,000以上のエントリを含んでいるのに対し、XSS の最大ファイルでは600以上、SQLi では400以上(データベースの種類が未知の場合は複数の種類をテストする必要があるので、実際の数はこれよりも多くなることが予想されます)、OS コマンドインジェクションでは400以上です。
トラバーサルペイロードリストのサイズは、広く観測されているトラバーサル攻撃手法に関する 1 つの仮説を示していますが、影響の深刻さによって、この手法がより頻繁に使用される可能性もあります。, 上記の CVE-2022-48362 に関する説明で示したように、これはリモートコード実行を可能にし、発見時には悪用されていることが知られていました。
ディレクトリトラバーサル脆弱性の回避
トラバーサル脆弱性を防ぐために使用できる戦略はいくつかあります。これには、ユーザー入力を使用したファイルパスの構築を防ぐための設計変更、入力の厳格な検証、パスの正規化の使用、アプリケーションアクセスの制限が含まれます。以下でそれぞれについて説明します。
ユーザー入力によるファイルパスの構築を防止する
ユーザー入力を使用してファイルパスを構築する代わりに、対応するファイル ID や名前を使用してファイルを参照することを検討してください。次に、ファイル ID を対応するストレージパスにマッピングします。ユーザーがこのファイルをリクエストしたり、ファイルをアップロードしたりする際にコントロールできるのはその ID のみであるため、ファイルパスの構築に使用される内容にユーザーがアクセスすることを防げます。これにより、取得したファイルのファイルパスの構築にユーザー入力が使用されなくなるため、トラバーサルの可能性を完全に排除できます。
ユーザー入力の厳格な検証
厳格な検証はサニタイズとは異なります。トラバーサルシーケンス(例:../)を削除しようとして入力をサニタイズするのではなく(これは無数の方法でバイパスされる可能性があります)、期待されるコンテンツのみがユーザー入力に含まれていることを検証し、厳格な検証にパスしないものはすべて拒否してください。以下は、ディレクトリトラバーサルを防ぐのに役立つ検証方法の例です:
ファイル名に英数字のみが含まれていることを検証する
提供されたファイル名に「.」がひとつのみ含まれていることを検証する
提供された入力に不要な文字(例:/、\)が含まれていないことを検証する
(簡単にバイパスされる拡張子の確認ではなく)アップロードされたファイルのファイルタイプを検証する
厳格な検証のためにパスの正規化を行う言語機能を使用する
パスの正規化では、基本的にファイルパスが実際のパスに短縮され、シンボリックリンク、../ シーケンス、その他のシンボリックコンテンツが効果的に削除されます。正規パスを取得したら、そのパスが引き続き想定されるベースディレクトリ(例:uploads/photos/)で始まっていることを確認できます。以下に、正規のパスを取得する関数の例をいくつか挙げます。
Java:
getCanonicalPathPHP:
realpathC:
realpathASP.NET:
GetFullPath
アプリケーションアクセスの制限
一般的に、アプリケーションは正常に機能するために必要なファイルとディレクトリにのみアクセスすべきです。これにより、ディレクトリトラバーサルの脆弱性が発見された場合に、その影響を制限することで、いくつかのケースで役立ちます。例えば、Web アプリケーションをルートユーザーで実行するべきではなく、理想的には、アプリケーションを提供するために必要なファイルにのみアクセスできるよう制限すべきです。
概要
ディレクトリトラバーサル(「パス」トラバーサル」とも呼ばれます)は、基盤となるファイルシステム上の意図しないファイルに攻撃者がアクセスできるようにする Web アプリケーションの脆弱性です。トラバーサル脆弱性によっては、攻撃者による機密データやファイルの読み取り、アプリケーションデータの変更、または Web サーバーの完全なコントロールが可能になる場合があります。トラバーサル脆弱性は深刻な影響を及ぼす可能性があり、実際の攻撃例や Next-Gen WAF のデータが示すように、主要な攻撃ベクトルです。しかし、ここで概説したソリューションに従うことで、アプリケーションはパストラバーサルの脆弱性を防ぐことができます。ディレクトリトラバーサルの防止が難しい場合や、過去にこれらの脆弱性の影響を受けたプロダクトを使用している場合は、これらの攻撃などから保護する Fastly の Next-Gen WAF をご覧ください。




