このページの本文へ

Windows Info 第100回

インターネットからダウンロードしたファイルはZone.Identifierでセキュリティ管理をする

2017年09月17日 10時00分更新

文● 塩田紳二 編集● ASCII編集部

  • この記事をはてなブックマークに追加
  • 本文印刷

NTFSの代替データストリームとは
ファイルやフォルダに付けられる付加情報

 NTFSの代替データストリーム(Alternate Data Stream。以下ADSと略す)は、ファイルやフォルダと関連付けられ、独立した内容を保持するNTFS上の記憶領域だ。

 簡単にいうとNTFS上のファイルやフォルダには、すべてADSと呼ばれる付加情報を一体にして記憶できる。ADSは、NTFS上にある限りファイルと一体で存在し、コピーや移動によって変化することはないが、ファイルを上書きしたり、メモリカードやUSBメモリなどFAT32などのファイルシステムへコピーすると消えてしまう。ADSには、それぞれ名前(ファイル名と同じルール)が付けられる。

 同様の機能は、OS/2やNetware、Linuxなどにも見られる。またプラットフォームによって「拡張アトリビュート」、「メタデータ」などさまざまな呼び方がある。

 NTFSのADSは、すべての通常ファイル、通常フォルダに追加することが可能だ。また、ADSは1つのファイルに複数追加することもできる。ADSの扱いは基本的にはアプリケーション側に任されており、どのような名前(ただしファイル名と同じルール)を付け、何を保存するのかはまったくの自由だ。見方を変えると、ファイルとは、複数の内容(ストリーム)からできていて、普段は名前のないストリームをアクセスしているといってもいいかもしれない。

 ADSは、Windowsが管理のために利用しているが、アプリケーションからも自由に使うことができる。ただし、Windows Explorerには、ADSを表示するなどの機能がなく、標準機能でADSを扱うには、コマンドプロンプトでコマンドを使う必要がある。また、ADSには、ファイルのパス同様、アクセスのための表記方法がある。たとえば、C:\XYZ\ABC.TXTといったファイルがあったとき、sampleという名前のADSは、

C:\XYZ\ABC.TXT:sample

としてパス指定ができる。なお、Windowsは、MS-DOS時代からの慣習でアルファベット1文字と「:」の組合せを常にドライブ文字として認識するため、カレントフォルダのアルファベット1文字のファイル名でADSを指定する場合は、

.\X:sample

としてファイル名であることが判別できるように指定する必要がある。

 しかし、このパス表記を受け付けるかどうかはプログラム次第だ。通常のプログラムは、単純にファイルのみをアクセスするため、ADSのパス表記を受け付けないものがほとんどだ。

 ただし、コマンドプロンプトでは、ファイルのリダイレクト指定がこの表記を受け付ける。簡単にコマンドラインによる操作を示す。

代替データストリーム(ADS)は、コマンドプロンプトでは、リダイレクト表記で利用できる

 前記の構文は、ファイルのリダイレトでは確実に受け入れてくれるため、echoやmoreコマンドとファイルのリダイレクトを行なわせて、ファイルを読み書きしている。ただし、ストリームは常にテキストとは限らず、ファイル同様にバイナリデータを含むことも可能である。Dirコマンドの/Rオプションでは、代替データストリームがあれば、それを表示する。

 なお、Dirコマンドで表示されるADSの最後についてる「:$DATA」はそのストリームがデータストリームであることを示す代替データストリームの種別である。なお、Windowsは、:$data以外の種別も定義している。このあたりについては、以下のマイクロソフトのドキュメント(英語)を見ていただきたい。

https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa364404(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/dn410405.aspx

インターネットからダウンロードしたデータには
Zone.Identifierという代替データストリームが付く

 WindowsによるADSの利用には、インターネットからダウンロードしたファイルのセキュリティ管理がある。これは、ファイルに付けられるADSの名前から「Zone.Identifier」と呼ばれている。IEなどがファイルのダウンロードをした場合に、該当のファイルにADSを付け、ダウンロード元のインターネットゾーン(IEなどのセキュリティ管理範囲)やダウンロード元URLなどの情報を付加するものだ。

 ファイルを開こうとすると、インターネットからダウンロードした旨のメッセージが表示されることがあるが、それは、このZone.Identifierの情報を見ているためだ。つまり、インターネットからダウンロードしたファイルには、Zone.Identifierという代替データストリームが付いている。もちろん、NTFS内に置かれていれば、ファイルをコピーしたり移動させても、ADSはそのまま残る。

 実際にインターネットからダウンロードしたファイルが持つZone.Identifierとその内容を表示させたのがだ。

インターネットからダウンロードしたファイルには、Zone.Identifierという代替データストリームが付加される

 このように、Zone.Identifier ADSの中身はテキストファイルで、いくつかの行から構成されている。具体的には、

HostIpAddress:ダウンロード元のホストIPアドレス
ZoneId:インターネットゾーン(3=インターネット)
ReferrerUrl:ダウンロードを開始したページのURL(HTTPリファラ)
HostUrl:ファイルのダウンロードURL

となっている。ただし、ブラウザで「名前を指定して保存」などを使うとReferrerUrlが記録されないことがある。

 これを利用すると、過去にダウンロードしたファイルから、ダウンロード元を調べることが可能になる。簡易には、Dir /rでZone.Identifierの有無を確認したあと、

more < ファイル名:Zone.Identifier

でダウンロード元URLを得ることができるが、自動処理を考え、PowerShellを使ってフィルターを作ってみた。Batchでは、ADSの内容を扱うのにはちょっと無理がある。

 PowerShellについては、別途解説したいと考えているが、ここでは、ファイルに対応したPowerShellのFileObjectに「HostUrl」と「ReferrerUrl」というプロパティを追加するフィルターを考えた。このようにすることで、いろいろと応用が可能になる。

filter add-zoneidentifier {
  $hurl=($_ | get-content -Stream Zone.Identifier -ErrorAction SilentlyContinue | Where-Object {$_ -match "HostUrl="});
  $rurl=($_ | get-content -Stream Zone.Identifier -ErrorAction SilentlyContinue | Where-Object {$_ -match "ReferrerUrl="});
  if (-not [string]::IsNullOrEmpty($hurl)) {
    $_ | Add-Member "HostUrl" $hurl.substring("HostUrl=".length);
    }
if (-not [string]::IsNullOrEmpty($rurl)) {
    $_ | Add-Member "ReferrerUrl" $rurl.substring("ReferrerUrl=".length);
    }
  return $_
  }

 PowerShellのコマンドウィンドウから、

dir *.pdf | add-zoneidentifier | Format-List name,HostUrl,ReferrerUrl

とすれば、カレントディレクトリにあるpdfファイルのHostUrlやReferrerUrlを表示させることが可能だ。

リスト01のフィルターを使うと、PowerShellのFileObjectにZone.Identifierの情報がプロパティとして付加される

 さらに

start microsoft-edge:$((dir ダウンロードファイル名 | add-zoneidentifier).ReferrerUrl)

として、ダウンロードリンクのあるページ(ReferrerUrl)を直接ブラウザ(Edge)で開くことが可能になる(もちろんReferrerUrlが記録されている場合のみ)。また、最後の部分の「ReferrerUrl」を「HostUrl」に変えれば、再ダウンロードやブラウザでの表示ができる。

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン