Home
2243 words
11 minutes
【PowerShell】 ファイルに隠された「Zone.Identifier」の正体と代替データストリーム(ADS)

最終更新:2026-01-11

インターネットからダウンロードしたスクリプトや実行ファイルを開こうとすると、Windowsによって実行がブロックされたり、セキュリティの警告が表示されたりすることがある。

これを解除するために PowerShell で Unblock-File コマンドを使用するが、このコマンドが具体的に何を行っているのかを理解しているユーザーは意外と少ないかもしれない。

実は、この「ブロック情報」はファイルそのもののデータ(バイナリ)に書き込まれているのではなく、NTFSファイルシステムの代替データストリーム(Alternate Data Streams: ADS) という領域に隠されている。

本記事では、この隠されたストリーム「Zone.Identifier」の中身を覗き、制御する方法について解説する。


代替データストリーム(ADS)とは#

NTFSファイルシステムでは、一つのファイルに対して複数のデータストリーム(データの流れ)を持たせることができる。

  • メインストリーム: 通常我々が「ファイルの中身」として認識しているデータ。:$DATA という属性がついている。
  • 代替データストリーム: ファイルの裏側に紐づけられた隠しデータ領域。

Windowsのエクスプローラーや通常の ls (dir) コマンドでは、メインストリームのサイズしか表示されないため、ADSにデータが含まれていても見た目上は変化がない。これが「隠されたデータ」と呼ばれる所以である。


Zone.Identifier を確認する#

Webブラウザ等を経由してインターネットからファイルを保存すると、ブラウザはそのファイルに Zone.Identifier という名前のADSを付与する。これが「Mark of the Web (MotW)」と呼ばれる印である。

ストリームの検出#

PowerShellの Get-Item コマンドに -Stream オプションを付けることで、隠されているストリームを可視化できる。

例えば、downloaded.exe というファイルのストリームを確認する場合は以下の通りである。

Get-Item -Path .\downloaded.exe -Stream *
出力例:

Plaintext

PSPath        : Microsoft.PowerShell.Core\FileSystem::C:\Data\downloaded.exe::$DATA
PSParentPath  : Microsoft.PowerShell.Core\FileSystem::C:\Data
PSChildName   : downloaded.exe::$DATA
PSDrive       : C
PSProvider    : Microsoft.PowerShell.Core\FileSystem
PSIsContainer : False
FileName      : C:\Data\downloaded.exe
Stream        : :$DATA
Length        : 102400

PSPath        : Microsoft.PowerShell.Core\FileSystem::C:\Data\downloaded.exe:Zone.Identifier
PSParentPath  : Microsoft.PowerShell.Core\FileSystem::C:\Data
PSChildName   : downloaded.exe:Zone.Identifier
PSDrive       : C
PSProvider    : Microsoft.PowerShell.Core\FileSystem
PSIsContainer : False
FileName      : C:\Data\downloaded.exe
Stream        : Zone.Identifier
Length        : 26

:$DATA(本体)とは別に、Zone.Identifier というストリームが存在していることが確認できる。

中身を表示する#

このストリームの中身はテキスト形式で保存されていることが多い。Get-Content コマンドでストリーム名を指定して読み取ることができる。

Get-Content .\downloaded.exe -Stream Zone.Identifier

出力例:


[ZoneTransfer]
ZoneId=3

ここで表示された ZoneId=3 が「インターネットゾーンから来たファイル」であることを示しており、これが警告のトリガーとなっている。

ダウンロード元のURLがHostUrl=xxxxxxxxxxとして記載されていることがある。

ZoneId の意味と操作#

ZoneId の値によって、Windowsがそのファイルをどのセキュリティゾーンとして扱うかが決まる。主な値は以下の通りである。

0: My Computer (ローカル)

1: Local Intranet (イントラネット)

2: Trusted Sites (信頼済みサイト)

3: Internet (インターネット)

4: Restricted Sites (制限付きサイト)

警告を再現する(書き込み)#

逆に言えば、ローカルで作成した無害なファイルであっても、意図的にADSを書き込むことで「インターネットからダウンロードしたファイル」のように振る舞わせることが可能である。これはセキュリティ挙動のテスト等に利用できる。


# テスト用ファイルを作成
New-Item test_alert.txt -ItemType File

# ZoneId=3 (インターネット) を付与
Set-Content -Path .\test_alert.txt -Stream Zone.Identifier -Value "[ZoneTransfer]`r`nZoneId=3"

この操作を行った後、エクスプローラーからファイルのプロパティを開くと、「セキュリティ: このファイルは他のコンピューターから取得したものです…」という警告が表示されるようになる。

なお、Unblock-Fileコマンドが行っているのは、単にこのZone.Identifierストリームを削除(Remove-Item)する処理である。

メモ帳を使ったADSの隠蔽と閲覧(Zone.Identifierとは関係ないが興味深いので説明する)#

ADSはシステム管理情報(Zone.Identifier)だけでなく、任意のテキストデータを隠すためにも利用できる。これはステガノグラフィ(データ隠蔽)の一種として知られている手法である。

コマンドラインを使わなくても、Windows標準のメモ帳(Notepad)だけでADSへの書き込みが可能である。

隠しテキストの作成#

ファイル名の後ろにコロン : でストリーム名を指定してメモ帳を起動する。

notepad.exe secret.txt:hidden

初回起動時は「ファイルが見つかりません。作成しますか?」と聞かれるので「はい」を選択し、任意の文章を書いて保存する。

確認#

通常通りsecret.txtを開いても、先ほど書いた内容は表示されない。また、ファイルサイズも 0バイト(あるいはメインストリームのサイズ)のままである。 再び notepad.exe secret.txt:hidden コマンドを実行したときのみ、その内容が表示される。

この性質は、一見すると空のテキストファイルに見せかけて、裏側にペイロード(悪意あるスクリプト等)を隠すために悪用される可能性がある。そのため、不審なファイル調査時にはメインストリームだけでなく、ADSの存在を確認することが推奨される。

まとめ#

Unblock-Fileで削除しているのは、ファイルのメタデータではなく、NTFSの機能である代替データストリーム(ADS)上の Zone.Identifier である。

PowerShellの -Stream オプションを使用することで、これらの隠されたデータを確認・操作できる。

ADSはファイルの見た目やサイズを変えずにデータを格納できるため、セキュリティの観点からは注意が必要な領域である。

ファイルのプロパティで「ブロック解除」ボタンを押す際は、背後でこのようなファイルシステム操作が行われていることを認識しておくと、トラブルシューティングの助けになるだろう。

追記#

Zone.Identifierのポイントまとめ#

Zone.Identifierに何が格納されるか#

  • ZoneId=3 : インターネット由来のファイルであることを示すフラグ(Mark of the Web)。
  • ReferrerUrl : 直前に閲覧していたページ(リンク元)。
  • HostUrl : 実際にファイ��をダウンロードした直リンクのURL。

例: Get-Content で確認した出力#

[ZoneTransfer]
ZoneId=3
ReferrerUrl=https://www.google.com/
HostUrl=https://example.com/download/software_v1.exe

NTFS のストリーム構造とサイズ表示#

  • メインストリーム(本体): :$DATA
    • ファイル中身は通常この :$DATA に格納される。
    • 例: downloaded.exe::$DATALength=102400 は「本体サイズ(約100KB)」で、エクスプローラーの「ファイルサイズ」表示はこれに相当。
    • Windowsは通常 :$DATA を暗黙に読み書きする。
  • 代替データストリーム(ADS): :Zone.Identifier
    • 例: downloaded.exe:Zone.IdentifierLength=26 はセキュリティタグのみ。[ZoneTransfer] ZoneId=3 などの短いテキストが入っている。
    • この ADS のサイズはエクスプローラーの「ファイルサイズ」には加算されない(本体 100KB + ADS 26バイトでも、表示は 100KB のまま)。

主なプロパティの意味#

  • PSPath : PowerShell 上の完全パス。Microsoft.PowerShell.Core\FileSystem:: で始まり、末尾の ::$DATA / :Zone.Identifier でストリーム種別を区別。
  • PSParentPath : 親フォルダのパス(例: C:\Data)。
  • PSChildName : フォルダ内での項目名(例: downloaded.exe::$DATA / downloaded.exe:Zone.Identifier)。
  • PSDrive : ドライブレター(例: C)。
  • PSProvider : 利用中のプロバイダ(FileSystem)。
  • PSIsContainer : フォルダかどうか(False なのでファイル)。
  • FileName : 一般的なファイルパス。前半も後半も同じ C:\Data\downloaded.exe を指し、「同じファイルに属する別ストリーム」であることを示す。
  • Stream : ストリーム名で「本体」か「隠しデータ」かを識別。
  • Length : データサイズ(バイト)。

なぜ記録されるか(SmartScreen)#

  • Microsoft Defender SmartScreen が安全性評価に利用。
  • 「どのドメインから配布されたか」を考慮し、悪意ある配布元を検知するため。

セキュリティとプライバシー#

  • フォレンジック用途: 感染時に入手元を追跡するのに役立つ。
  • プライバシー懸念: ファイルを他者へ渡すとダウンロード元URLも共有される可能性がある。

削除/無効化の方法#

  • Unblock-File もしくはファイルのプロパティで「ブロック解除」を実行すると、ZoneId とともに HostUrl / ReferrerUrl も削除される。

実務上の注意#

  • 配布前に入手元を隠したい場合は事前に「ブロック解除」を行う。
  • ADS(代替データストリーム)は本体サイズには含まれないが、セキュリティ情報は残る点に注意。

Zone.Identifier:ブラウザ依存性、ZoneId=0、ADS消失に関する注意点#

ブラウザ / ダウンローダー依存#

  • HostUrlReferrerUrl は、ダウンロードに使ったアプリ(ブラウザ等)に依存して付与される。
  • モダンブラウザ(例: Microsoft Edge, Chrome)は、ZoneId=3 に加えて HostUrl / ReferrerUrl を付与することが多い。
  • 古いツールや一部のダウンローダー、curl などでは:
    • ZoneId=3 だけで URL が付かない場合、または
    • Zone.Identifier 自体が付かない場合がある。
  • まとめ: すべてのダウンロードファイルに URL メタデータが含まれるとは限らない。

ZoneId=0 の補足#

  • 通常、ローカルで作成したファイルには Zone.Identifier ストリーム自体が存在しない(=存在しないことが「ローカル」扱い)。
  • 手動で ZoneId=0 を書き込んだ場合も「ローカル」として扱われる。
  • 自分のファイルを確認したときにストリームが見当たらなくても、それが通常の挙動。

非 NTFS パスでの ADS 消失#

  • 代替データストリーム(ADS)は NTFS 特有の機能。(ファイルのフォーマットの仕様)
  • FAT32 / exFAT(例: 多くの USB メモリ)へコピーすると Zone.Identifier は失われる。
  • ZIP 圧縮→展開でも ADS が消えることがある。
  • 実務メモ: これを “事実上のブロック解除” として使うケースもある。
【PowerShell】 ファイルに隠された「Zone.Identifier」の正体と代替データストリーム(ADS)
https://ss0832.github.io/posts/20260111_powershell_zone_identifier/
Author
ss0832
Published at
2026-01-11
License
CC BY-NC-SA 4.0

Related Posts

【Steganography】画像ファイルにZIPを隠す「EOFインジェクション」の仕組みと再現
2026-01-12
画像ファイルのフォーマット仕様を逆手に取り、データの末尾に別のファイルを結合して隠蔽する「EOFインジェクション」の手法と、代替データストリーム(ADS)との違いについて解説します。
【Unix】scpと中間者攻撃:ホスト認証の重要性
2026-01-11
scpコマンド利用時に潜む中間者攻撃(MitM)のリスクと、SSHのホスト鍵認証(StrictHostKeyChecking)がどのように通信を守っているかを解説します。
【Unix】中間者攻撃の仕組みとSFTPの本当の役割
2026-01-11
中間者攻撃(MitM)がどのように成立するのか、その具体的なメカニズム(ARPスプーフィング等)と、sftpがこの問題に対してどのような立ち位置にあるのかを技術的に解説します。
【Unix】scpコマンドの応用:帯域制限・3点間転送・踏み台活用
2026-01-11
scpコマンドの帯域幅制限(-l)や、セキュアな3点間転送(-3)、踏み台サーバーを経由するProxyJump(-J)など、高度な運用オプションについて解説します。
【Unix】scpコマンドの深層:歴史的背景とセキュリティリスク
2026-01-11
scpコマンドが抱える設計上の課題(CVE-2019-6111等)と、OpenSSHが推奨する代替手段(sftp)について、技術的な背景を解説します。
[Unix] sftpコマンド完全ガイド
2026-01-11
sftp(SSH File Transfer Protocol)について、実践的なコマンド操作、バッチ処理による自動化テクニックを網羅的に解説します。