もう一度、先ほどの話に戻ります。「なぜ、同じファイルを二重で持つという非効率的な方法をとっているのか」ということです。先ほど紹介したブログは、Windows Vista登場以前に書かれたものです。
今でこそWindowsはNTFSボリュームにしかインストールできませんが(Windows Vista以降)、当時のWindowsはFAT16やFAT32にもインストールできました。そして、ハードリンクはWindows 2000から利用できるようになった機能ですが、NTFSボリューム上でのみサポートされる機能でもあります。シンボリックリンクは、Windows Vistaから利用できるようになった機能であり、こちらもNTFSボリューム上でのみ利用できます。
つまり、NTFS以外のボリュームに対応するためには、2つの「notepad.exe」を別ファイルとして持つ必要があったのです。また、Windows XP以前はCBSアーキテクチャではないので、単純に「notepad.exe」のコピーを2つの場所に配置していたということです(画面3)。
CBSアーキテクチャになったWindows Vistaからは、2つの場所に「%Windir%\WinSxS」ディレクトリの1つの「notepad.exe」に対するハードリンクを作成することが、技術的には可能になりました。そうすることで、ディスク使用をさらに効率化できるはずなのですが、実際にはそのような対応はされませんでした。そのまま、現在のWindows 10まで悪しき伝統が引き継がれているように見えます。しかし、それは正確ではありません。
実は、Windows 7からWindows 8.1のときに、一本化が図られた形跡が残っています。しかし、最新状態に更新されたWindows 7やWindows 8.1では、Windows 10の場合と同様に別ファイルにリンクされています。
なぜ、一本化が図られた形跡があるのかといえば、『Windows Sysinternals徹底解説』(2012年4月発行、筆者訳)のFindLinksユーティリティーを説明する部分に、使用例として「notepad.exe」のハードリンクを参照する部分があり、「%Windir%\System32\notepad.exe」と「%Windir%\notepad.exe」が「%Windir%\WinSxS」ディレクトリ下の同じファイルをリンクしていることを説明していたからです。この書籍の制作時に筆者が取得したスクリーンショットが以下の画面4です。
ファイルの日付を確認したところ、「2011年12月19日」に動作していたWindows 7 Service Pack1(SP1)のものでした。同じスクリーンショットと説明が『Windows Sysinternals徹底解説 改定新版』(2017年6月発行)にも掲載されていますが、現状と異なるのは、原書のその部分が改訂されていなかったからです。
最新状態に更新されている現在のWindows 7で、「%Windir%\WinSxS」ディレクトリにあるメモ帳関連のコンポーネントを調べてみると、タイムスタンプが「2015年8月12日」のバージョンに更新されていることが分かります。
「x86(またはx64)_microsoft-windows-notepad_」で始まるものが「%Windir%\notepad.exe」用、「x86(またはx64)_microsoft-windows-notepadwin_」で始まるものが「%Windir%\System32\notepad.exe」用であることが容易に想像できます。そして、最も古いバージョン(6.1.7600.16385)は別々のファイルではなく、同一ファイルに対するハードリンクであることが分かります(画面5)。
さらに、更新履歴やバージョン情報(6.1.7601.18917および6.1.7601.23120)などで調べていくと、以下のサポート情報にたどり着きました。
このサポート情報が対応する問題とは、「安全ではないコマンドラインパラメーターの受け渡しにより、情報漏えいが起こる(3082458)」というCVE-2015-2423の脆弱(ぜいじゃく)性であり、「notepad.exe」が更新対象になっています。Windows 7では、このときに再び2つに分かれてしまったようです。2つに分けられたのが、この脆弱性に対応するために、どうしても必要だったのかどうかまでは分かりません。
Windows 8(2012年リリース)やWindows 8.1(2013年リリース)についても、リリース時のインストールメディアを調べた限りでは、Windows 7と同じように、最初は一本化されていました(ファイルバージョンは6.2.9200.16384、6.3.9200.16384)。Windows 8とWindows 8.1もこのサポート情報の脆弱性の更新対象になっており、このタイミングで2つに分かれたようです(それ以前の更新で分かれた可能性もあります)。
メモ帳が2つの場所に存在する理由について、ハードリンクを使えば1つのファイルにできるのに、別々のファイルになっている理由について、まだすっきりしていないかもしれません。筆者自身、すっきりしていません。ここまでをまとめると、次のことが言えます。
もう「%Windir%\notepad.exe」は削除してもいいんじゃないかと思うかもしれませんが、ここは歴史的に使われてきた場所であり、攻撃者にとっては格好の隠れ場所候補です。現在は「%Windir%\notepad.exe」が存在し、これを悪意のあるファイルに上書きするのは困難です。なぜなら、システムファイルを更新できるのは「TrustedInstaller」サービスだけであり、管理者権限があっても、システム(SYSTEM)アカウントであっても、変更できないからです(画面6)。
岩手県花巻市在住。Microsoft MVP:Cloud and Datacenter Management(Oct 2008 - Sep 2016)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。Microsoft製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『Windows Server 2016テクノロジ入門−完全版』(日経BP社)。
Copyright © ITmedia, Inc. All Rights Reserved.