Introduction

最近の Windows では、実行ファイルを実行すると Microsoft Defender SmartScreen と呼ばれる、実行しようとしたアプリやファイルの危険性がないかどうかの確認を促す機能が動作する。
基本的にはレピュテーション (インターネット経由で安全性の確認を行う ※) に従って、挙動を変化させる。
レピュテーションは Microsoft がデータベースか何かに収集した情報であるため、公開されたばかりのアプリなどはレピュテーションがないため、SmartScreen の表示が発生しやすい。

今日遭遇したのは、プログラムの実行どころか SmartScreen も表示されない事態だった。

※厳密には、*.smartscreen.microsoft.comSmartScreen-sn3p.smartscreen.microsoft.comunitedstates.smartscreen-prod.microsoft.com へのアクセスによって実現 (Windows 10 Enterprise Version 1809 参照)。

What happened?

通常、SmartSceen が動作すると、

SmartScreen

という風に表示され、実行が阻害される。
詳細情報 を選ぶと 実行 ボタンが表示され、実行を再開できる。

ところが、前述のようにレピュテーションを使用して判断するので、インターネットに繋がっていないと SmartScreen は上手く動作しない。

だが、インターネットに繋がっていなくても警告が出ることはある。
それが、NTFS の代替データストリーム (Alternate Data Streams, ADS) に設定された Zone.Identifier による判定である。
Mark of the Web (MoTW) とも言われ、最近この脆弱性を突いた攻撃が発見された。

この Zone.Identifier は、ファイルがどのゾーンからダウンロードされたかを示すメタデータであり、Internet Explorer や Microsoft Edge 等のブラウザでダウンロードされたファイルに自動的に付加される。
Zone.Identifier の値は以下のような意味を持つ。

内容
0 ローカルマシン (ローカルディスク上のファイル)
1 内部ネットワーク (イントラネット)
2 信頼済みサイト
3 インターネット (通常のインターネットサイトからダウンロードされたファイル)
4 制限付きサイト (Restricted Sites、セキュリティリスクがあると見なされたサイトからのファイル)

Zone.Identifier が付与されるとファイルのプロパティの下部に警告が付与される。

ZoneIdentifier

ちなみに、Zone.Identifier が 0 だろうが 4 だろうが、この警告の内容は変わらない。

Zone.Identifier に 3 が付与されており、かつインターネットに繋がっていない時、かつ SmartScreen を 警告 以上にしている時、SmartScreen が表示される。

ZoneIdentifier_3

SmartScreen を ブロック にしていると下記のようになる。

AppBrowserControl

インターネットに繋がっていると、レピュテーションによって、安全として判断されるのか、SmartScreen は表示されない。
Zone.Identifier が 012 だとインターネットに繋がっていなくても、SmartScreen は表示されない。

だが、Zone.Identifier が何の因果か 4 になっていた時、冒頭の現象に見舞われる。
SmartScreen も出なければ、アプリの実行もできない。
SmartScreen を オフ にしていてもだ。
インターネットに繋がっていても関係ない。

まとめるとこうなる。

Zone.Identifier SmartScreen の設定 インターネットの接続 SmartScreenの表示 備考
0 ブロック あり 表示されない
0 ブロック なし 表示されない
0 警告 あり 表示されない
0 警告 なし 表示されない
0 オフ あり 表示されない
0 オフ なし 表示されない
1 ブロック あり 表示されない
1 ブロック なし 表示されない
1 警告 あり 表示されない
1 警告 なし 表示されない
1 オフ あり 表示されない
1 オフ なし 表示されない
2 ブロック あり 表示されない
2 ブロック なし 表示されない
2 警告 あり 表示されない
2 警告 なし 表示されない
2 オフ あり 表示されない
2 オフ なし 表示されない
3 ブロック あり 表示されない Zone.Identifier が解除される
3 ブロック なし 表示される (実行しない) Zone.Identifier は解除されない
3 警告 あり 表示されない Zone.Identifier が解除される
3 警告 なし 表示される (実行、実行しない) Zone.Identifier は解除されない
3 オフ あり 表示されない セキュリティの警告が表示される
Zone.Identifier は解除されない
3 オフ なし 表示されない セキュリティの警告が表示される
Zone.Identifier は解除されない
4 ブロック あり 表示されない アプリが実行できない
4 ブロック なし 表示されない アプリが実行できない
4 警告 あり 表示されない アプリが実行できない
4 警告 なし 表示されない アプリが実行できない
4 オフ あり 表示されない アプリが実行できない
4 オフ なし 表示されない アプリが実行できない

ログの有無

アプリが実行できないとき、何かイベントビューアに表示されていないかを見てみたが、 Windows ログ には何もなかった。

Microsoft Defender SmartScreen Deep Dive によれば、管理者権限のコマンドプロンプトから wevtutil sl Microsoft-Windows-SmartScreen/Debug /e:true を実行することで、イベントビューアの アプリケーションとサービス ログ 配下の Micorost - Windows - SmartScreen - Debug にログが出力されるようになるとのことだが、アプリが実行されない事象に関してはここには表示されなかった。
他の SmartScreen が表示されるような事象ではログが出力されるには確認できた。

Appendix

Zone.identifier はコマンドで付与、確認できる。

1
2
3
4
$ Set-Content -path .\file.exe -stream Zone.Identifier -value [ZoneTransfer],ZoneId=4
$ cat -Stream Zone.Identifier .\file.exe
[ZoneTransfer]
ZoneId=4