LoginSignup
2
1

More than 1 year has passed since last update.

Windowsでインターネットからダウンロードしたファイルのブロックについて

Posted at

Windowsでインターネットからダウンロードしたファイルには下記画像のように、プロパティにセキュリティ表示がされるかと思います。

image.png

こちらのブロックについて、PowerShellで解除できるコマンドレットUnblock-Fileのドキュメントを読んでいたら、記載があったのでまとめ。

ドキュメント

Unblock-File
5.1 NTFS Streams
5.6.1 Zone.Identifier Stream Name

本記事の環境

  • Windows 10 21H2
  • Edge バージョン 107.0.1418.42
  • curl.exe 7.83.1 (Windows) libcurl/7.83.1 Schannel

そもそもUnblock-Fileって何してるの?

Unblock-File - 説明

コマンドレットのドキュメントの説明に記載がありますが。
Unblock-Fileコマンドレットが内部的にしている動作はZone.Identifier 代替データストリームの情報を削除しているようです。

Windowsでは代替データストリームZone.Identifier3だったらインターネットから取得されたファイルを示すようなので、この情報を削除しています。

代替データストリームって?

Alternate Data Streamで代替データストリーム。

NTFSファイルシステムではファイルデータ以外に代替データストリームとして様々な情報を追加できます。

ブラウザはインターネットからダウンロードしたファイルに、この代替データストリームのZoneIdを付与している。

代替データストリームを確認してみる(PowerShell)

代替データストリームの有無を確認するにはGet-Itemコマンドレットを利用します。

今回、ZoneIdを付与したZoneIdあり.txtZoneIDを付与しないZoneIDなし.txtを用意して、Get-ItemコマンドレットのStreamオプションをつかってZone.Identiferの有無を確認してみます。

image.png

ZoneIdあり.txtでは情報が表示され、ZoneIdなし.txtのファイルはalternate data streamを開けないとエラーがでている事を確認できます。

Edgeでgoogleのロゴ画像をダウンロードして代替データストリームの内容を確認してみる

Get-ItemコマンドレットでZoneIDの有無を確認しましたが、内容を確認するにはGet-Contentコマンドレットで確認できます。

ためしにgoogle.comからブラウザ(Edge)でロゴ画像をダウンロードしてきてZoneIDを確認してみます。

image.png

google.comからロゴをダウンロードするとgooglelogo_color_272x92dp.pngというファイルが保存されました。

Get-ContentコマンドレットのStreamオプションで確認すると下記のように情報が取得できました。

image.png

ZoneIdがインターネットから取得した事を表す3が設定されており。
またダウンロード元となった、ReferrerUrlHostUrlの情報が付与されている事がわかります。

代替データストリームを確認してみる(CMD)

CMDではmoreコマンドがADSデータストリームに対応しており取得できるようです。

more < googlelogo_color_272x92dp.png:Zone.Identifier:$DATA

image.png

任意のファイルに代替データストリームのZone.Identifierに3 をフ付与してみる

Set-Content - Streamオプション

PowerShellのSet-Contentコマンドのstreamオプションを利用して代替データストリームのコンテンツを作成、更新できます。

ここでは下記のコマンドを実行してsamplefile.txtZoneIdを付与してみます。

# サンプルファイルの作成
New-Item -ItemType File .\samplefile.txt

# ZoneIdが付与されていない事を確認
Get-Item .\samplefile.txt -Stream "Zone.Identifier"

# ZoneIdを付与
Set-Content .\samplefile.txt -Stream "Zone.Identifier" -Value @("[ZoneTransfer]","ZoneId=3")

# ZoneIdが付与されている事を確認
Get-Item .\samplefile.txt -Stream "Zone.Identifier"

# ZoneIdの内容を確認
Get-Content .\samplefile.txt -Stream "Zone.Identifier"

image.png

samplefile.txtにZoneIdが付与された事が確認できました。

ダウンロードするアプリケーションによってはZoneIdが付与されない

ブラウザからではなくファイルをダウンロードする方法によってはZoneIdは付与されません。

curl.exeInvoke-WebRequest で試しに、googleのロゴをダウンロードしてみるとZoneIdが付与されてない状態でダウンロードされる事が確認できます。

image.png

総評

Windowsでブラウザからダウンロードしたファイルがインターネットからダウンロードされた物だと判別する仕組みは、NTFSファイルシステムの代替データストリームのZone.Identifierを利用していると理解できたかと思います。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1