最終更新: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::$DATAのLength=102400は「本体サイズ(約100KB)」で、エクスプローラーの「ファイルサイズ」表示はこれに相当。 - Windowsは通常
:$DATAを暗黙に読み書きする。
- ファイル中身は通常この
- 代替データストリーム(ADS):
:Zone.Identifier- 例:
downloaded.exe:Zone.IdentifierのLength=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消失に関する注意点
ブラウザ / ダウンローダー依存
HostUrlやReferrerUrlは、ダウンロードに使ったアプリ(ブラウザ等)に依存して付与される。- モダンブラウザ(例: 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 が消えることがある。
- 実務メモ: これを “事実上のブロック解除” として使うケースもある。