
多くのセキュリティチームは、NTFSのジャンクションやシンボリックリンクを、ニッチなファイルシステム機能だと考えています。これらは、あるディレクトリを別のディレクトリを指し示すようにするもので、OSが本物として扱うショートカットのようなものです。これらは下位互換性やストレージ管理のために存在しており、SOC(セキュリティオペレーションセンター)ではめったに話題に上ることはありません。しかし、攻撃者の視点から見ると興味深い特性があります。それは、どのユーザーでもこれらを作成できるということです。
管理者権限は不要であり、対象フォルダへの書き込みアクセス権以外の特別な権限も必要ありません。
私たちは、ジャンクションを自身の親ディレクトリ自体を指すように設定することで、攻撃者が事実上無限のファイルパスを生成する再帰ループを作成できることを発見しました。EDR製品を含め、ディレクトリを再帰的にスキャンしようとするツールは、このループをたどってしまい、処理を完了できなくなる可能性があります。
同じフォルダ内にある悪意のあるファイルは検査されずに残され、これが私たちが「GhostTree」と名付けた手法となります。
NTFS ジャンクションの仕組み
Windowsのファイルパスはオペレーティングシステムの根幹をなす要素ですが、その仕組みは複雑です。ほとんどのユーザーは単純なフォルダ構造を扱っていますが、NTFSファイルシステムにはジャンクションやシンボリックリンクといった高度な機能が導入されています。
これらの機能は、ディレクトリのリダイレクト、ファイルが特定の場所にあることを前提とするレガシーアプリケーションとの下位互換性の維持、あるいはファイルを物理的に移動させずに再編成するなど、正当な目的を果たします。
ジャンクションとは、あるディレクトリを別のディレクトリにリダイレクトする、NTFSのリパースポイントの一種です。作成には書き込み権限と、CMDでの1つのコマンドのみが必要です:
mklink /J C:LinkToFolder C:TargetFolder
これにより、「LinkToFolder」という名前のジャンクションが作成され、「TargetFolder」を透過的に指すようになります。このジャンクションを介してファイルにアクセスするアプリケーションは、ターゲットディレクトリの内容をあたかもローカルにあるかのように認識します。
ただし、ここで1つの制約があります。従来のWindowsシステムでは、レガシーなソフトウェアやファイルシステムの設計に起因して、パス長の上限が260文字に制限されています。
レジストリキーを介してこの制限を最大32,767文字まで拡張することは技術的に可能ですが、多くのアプリケーションやユーティリティは260文字を超えるパスを処理する機能を備えていません。
NTFSはより長いパスをサポートしているにもかかわらず、実用上の利用は既存のソフトウェアによって制限されたままです。この制限によって、再帰ループがどこまで深くなるか、またGhostTreeが生成できる一意のパスの数が決まります。
知らないことが、かえって害になることがあります。
機密データの保護は、可視性、つまり、情報がどこに保存されているか、誰がアクセスできるか、そしてどのように使用されているかを把握することから始まります。
Varonisデータセキュリティプラットフォームは、情報の露出を自動的に封じ込め、SaaS、IaaS、オンプレミス環境、データベース全体でのアクティビティを継続的に監視し、内部者による脅威、ランサムウェア、AIの悪用を検知して対応します。
GhostBranch
GhostBranchは、これら2つの手法のうちより単純なものです。どのユーザーでも、ジャンクションの名前と宛先の両方を設定して、フォルダジャンクションを作成できます。次のようなフォルダ構造を考えてみてください。
C:Parentprogram.exe
次のコマンドを実行します:
mklink /J C:ParentChild C:Parent
これにより、子フォルダを親フォルダ自体を指すように設定することで、論理的なループが形成されます。子ディレクトリには、親ディレクトリに含まれるすべてのファイル(親ディレクトリ自体を含む)が含まれるようになります。その結果、同じファイルへの有効なパスが無限に存在することになります:
C:ParentChildProgram.exe
C:ParentChildChildProgram.exe
C:ParentChildChildChildChildProgram.exe
このループにより、パスに複数の「Child」フォルダを追加しても、パスは有効なままです。これらのパスはいずれも、同じ実行ファイルを指します。

GhostTree
GhostTreeは、GhostBranchの概念をさらに発展させ、子フォルダを1つではなく複数作成します。例えば、次のように2つの子フォルダを作成できます:
mklink /J C:ParentChild1 C:Parent
mklink /J C:ParentChild2 C:Parent
これで、パス内のどのレベルでも Child1 または Child2 のいずれかを経由して分岐でき、どちらも親フォルダへとループバックします。これにより、次のようなさまざまなパスが可能になります:
C:ParentChild1Program.exe
C:ParentChild2Program.exe
C:ParentChild1Child1Program.exe
C:ParentChild1Child2Program.exe

パスの計算
GhostBranchもGhostTreeも、Windowsが許容する最大長まで拡張可能なパスを生成します。違いはパスの多様性にあり、ここにおいてGhostTreeの追加の子フォルダが状況を大きく変えます。
GhostBranch
Windows において、従来のパスの最大長は 260 文字です。ディレクトリ数を最大化するには、C: ドライブの直下に 1 文字のフォルダ(例: “P”)を作成し、1.exe という名前の実行ファイルを使用します。
パスの例としては、次のようなものがあります。
C:P1.exe
C:PP1.exe
C:PPP...1.exe
この構成では、パス長の制限により、約126通りの固有のディレクトリ構造が可能になります。
GhostTree
GhostTree方式では、前述の単一フォルダ構造とは対照的に、「P」と「B」という2つの親フォルダを導入します。例としては次のようなものがあります:
C:B1.exe
C:PB1.exe
C:PBPB...1.exe
最大階層数は依然として約126フォルダですが、各レベルには「P」または「B」のいずれかの名前を付けることができ、事実上、二分木のような構造が形成されます。この構成では、各ノードが個別のパスを表し、可能なノードの総数は次のように計算されます:
2^126 ≈ 8.5 × 10^37
これはどれほどの規模でしょうか?これは、地球上の砂粒の数(8.5 × 10^18)や、さらにはあなたの体内の原子の数(10^27)よりもはるかに大きい数です。
これが防御側にとって重要な理由
たった2行のコードで、ユーザーは無限の有効なパスを生成できるため、dirコマンドを使って親ディレクトリを再帰的にスキャンし終えることは不可能になります。 これは、フォルダ内の悪意のあるファイルをスキャンするEDR製品にも同様に当てはまります。攻撃者が親ディレクトリにマルウェアを配置し、GhostTree構造を設定すると、そのフォルダは事実上スキャン不能になります。スキャンはハングアップし、悪意のあるファイルは検査されずに済んでしまいます。
この手法をWindows Defenderに対してテストしたところ、フォルダスキャンを回避するために利用可能であることが確認されました。
この問題をマイクロソフトに報告しました。チケットは、「Defenderを迂回することはセキュリティ境界を越えることには当たらない」という説明とともにクローズされました。その後、この問題に対するパッチは適用されました。
GhostTreeのような手法は、エンドポイントスキャンが防御のほんの一層に過ぎないことを改めて認識させてくれます。データ層でのファイルシステムアクティビティを監視することで、スキャナーが見逃すもの、例えば異常なジャンクションの作成や、通常の運用では存在すべきではない再帰的なディレクトリ構造などを捕捉できます。
Varonisはファイルへのアクセスパターンを監視し、ファイルシステムやクラウドインフラストラクチャ全体で、このような異常な活動を検出します。
今すぐデモをご予約ください。
Varonisによる提供・執筆。
出典:https://www.bleepingcomputer.com/news/security/ghosttree-attack-abused-recursive-windows-junctions-to-hide-malware/



Comments