← ブログに戻る

代替データ ストリーム: NTFS に隠れる $DATA 属性

· 読了 1 分

NTFS は 1 つのファイルに複数の $DATA 属性を持たせられます。最初のものには名前がなく、ファイル本来の内容を保持します。それ以外の $DATA 属性は 名前付き で、同じファイルに付随する並行ストリームとして振る舞います。こうした追加のストリームが代替データ ストリーム(Alternate Data Streams, ADS)です。

構文

ADS は PowerShell または cmd から読み書きできます。

echo hidden text > notes.txt:secret
type notes.txt:secret

notes.txt はエクスプローラーや dir では空に見えます — 主 $DATA が 0 バイトだからです。しかし、名前付きの secret ストリームにはちゃんとテキストが入っています。ユーザーからはふつうのファイルにしか見えませんが、代替ストリームはずっと一緒に運ばれます。

正当に出会う ADS

Windows 自身も ADS を内部記録に使います。最もよく見るのは、インターネットからダウンロードした各ファイルに付く Zone.Identifier です。元の URL とセキュリティ ゾーンを記述した短いテキスト ブロックが入っています。「このファイルは別のコンピューターから来ました」という警告のトリガーは、まさにこれです。

その他の正当な用途:

  • キーボード レイアウトファイル用の $KSP
  • Outlook 添付ファイル用の OECustomProperty
  • サムネイルや検索インデックスの各種ストリーム

攻撃者が ADS を好む理由

主ストリームの外側に住むものは、次のような対象から見えにくくなります。

  • ファイル サイズしか表示しないフォルダー ビュー(名前なしストリームのサイズだけが報告される)
  • 既定ストリームしかスキャンしないアンチウイルス
  • 明示的にストリームを要求しないアナリストの手作業レビュー

典型的なパターンは、legit-document.docx:payload.exe にペイロードを置き、WMI で起動するというものです。ファイルは Word 文書に見え、正しい問いを立てるまでその見え方を保ち続けます。

検出方法

dir /R は、ディレクトリ内のすべてのファイルのすべてのストリームを一覧表示します。出力には、名前付きストリームの横にそのサイズが並びます。

1,234,567 legit-document.docx
   45,056 legit-document.docx:payload.exe:$DATA

PowerShell ならより読みやすい同等の操作はこれです。

Get-Item legit-document.docx -Stream *

なぜ $MFT が最良のレンズなのか

1 ファイルずつ列挙する方法は、見落とした対象ファイル上のストリームを取り逃します。$MFT にはこの弱点がありません — すべての属性はレコードの中に存在します。MFT を走査して各エントリの $DATA 属性 — 名前付きも名前なしも — を列挙すれば、1 度のパスでボリューム上のあらゆるストリームの完全な目録が得られます。

トリアージでは、「ADS のチェックも忘れずに」と「もうすべて確認済み」の差が、まさにここに表れます。

外部リソース