2010/07/28

レガシー Windows にも Fix it (KB2286198: Windows シェルの脆弱性により、リモートでコードが実行される)

(Fix It を適用した Windows XP SP3 のスタート メニュー)
マイクロソフトが 7 月 17 日に公開した「マイクロソフト セキュリティ アドバイザリ (2286198) - Windows シェルの脆弱性により、リモートでコードが実行される (http://www.microsoft.com/japan/technet/security/advisory/2286198.mspx)」は、パッチが未提供のため、回避策を実施しないとゼロデイ攻撃を受ける危険があります。既に攻撃の実証コードも公開されていることから、セキュリティ パッチが提供されるまで待っていられない状況かもしれません。Windows Update の次の定例更新 (日本時間の 11 ) に間に合うかどうかわかりませんが、日本においてはお盆休みの時期が近づいていることも気になります。

さらに心配なのは、先日 (7 月 13 日) にサポート ライフサイクルが終了してしまった Windows 2000 や Windows XP SP2 以前を使用しているユーザーが、かなり多そうだという点です。セキュリティ アドバイザリの影響を受けるソフトウェアにこれらのバージョンは含まれませんが、それは影響を受けないからではなく、セキュリティ アドバイザリのよくある質問にある“その他のリリースは、サポート ライフサイクルが終了しました”の扱いだからです。


マイクロソフトはセキュリティ アドバイザリで説明されている回避策を簡単に適用するための Fix It ツールを 7 月 23 日に公開しましたが、Windows 2000 や Windows XP SP2 は対象外となっており、適用することができません。

回避策は、レジストリを修正して、ショートカット用アイコンの表示を無効化するというもの。この回避策を実施すると、スタートメニューやデスクトップのアイコンがそっけないものになるので、回避策の実施をするのにはかなり抵抗はあると思いますが、少しでもリスクを回避しておいたほうが得策でしょう。

おそらくこの脆弱性を同じように受けるであろう Windows 2000 や Windows XP SP2 以前であっても、セキュリティ アドバイザリで説明しているレジストリ操作を実施すれば、Fix It と同じ効果があるはずです (公式にテストされることはないため本当のところはわかりませんが)。

これらのレガシー Windows を多数抱える企業ユーザーの方にとって、手動で 1 台 1 台回避策を実施していく作業は大変です。こういうときこそ、スクリプトやバッチの出番です。次の myfixitxp.cmd は、Windows XP (SP2 以前を含む) および Windows Vista 向けの回避策実施スクリプトです。元に戻すスクリプトは undo_myfixitxp.cmd になります。レジストリの変更には REG コマンドを、WebClient サービスのスタートアップ変更には SC コマンドを、コンピューターの再起動には SHUTDOWN コマンドを利用しています (正式な Fix It ツールには WebClient サービスのスタートアップ変更は含まれないようですが、アドバイザリには含まれるので入れておきました)。

[myfixitxp.cmd]
@ECHO OFF
ECHO マイクロソフト セキュリティ アドバイザリ (2286198) - Windows シェルの脆弱性により、リモートでコードが実行される
ECHO http://www.microsoft.com/japan/technet/security/advisory/2286198.mspx
ECHO 回避策を実施します(中止する場合は CTRL+C キー)。
PAUSE
REG ADD "HKEY_CLASSES_ROOT\lnkfile\shellex\IconHandler" /ve /t REG_SZ /d ""
REG ADD "HKEY_CLASSES_ROOT\piffile\shellex\IconHandler" /ve /t REG_SZ /d ""
SC STOP WebClient
SC CONFIG WebClient start= disabled
ECHO コンピューターを再起動します(再起動を中止する場合は CTRL+C キー)。
PAUSE
SHUTDOWN /r /t 0

[undo_myfixitxp.cmd]
@ECHO OFF
ECHO マイクロソフト セキュリティ アドバイザリ (2286198) - Windows シェルの脆弱性により、リモートでコードが実行される
ECHO http://www.microsoft.com/japan/technet/security/advisory/2286198.mspx
ECHO 回避策を解除します(中止する場合は CTRL+C キー)。
PAUSE
REG ADD "HKEY_CLASSES_ROOT\lnkfile\shellex\IconHandler" /ve /t REG_SZ /d "{00021401-0000-0000-C000-000000000046}"
REG ADD "HKEY_CLASSES_ROOT\piffile\shellex\IconHandler" /ve /t REG_SZ /d "{00021401-0000-0000-C000-000000000046}"
SC CONFIG WebClient start= auto
ECHO コンピューターを再起動します(再起動を中止する場合は CTRL+C キー)。
PAUSE
SHUTDOWN /r /t 0

Windows 2000 の場合は、標準で REG コマンドや SHUTDOWN コマンドがありません。また、WebClient サービスも存在しません。そのため、上記のバッチは Windows 2000 では使えません。REG コマンドは Windows 2000 Support Tools から追加することはできますが、早急に対処したい場合に、別のツールをインストールするのは手間です。そこで、Windows 2000 向けには、WMI (Windows Management Instrumentation) と WSH (Windows Script Host) を利用して、VBScript で記述してみました。cscript myfixit2000.vbs を実行することで、回避策を実施します。回避策を解除するには、cscript undo_myfixit2000.vbs を実行します。

[myfixit2000.vbs]
WScript.Echo "マイクロソフト セキュリティ アドバイザリ (2286198) - Windows シェルの脆弱性により、リモートでコードが実行される"
WScript.Echo "http://www.microsoft.com/japan/technet/security/advisory/2286198.mspx"
WScript.Echo "回避策を実施します(中止する場合は 5 秒以内にCTRL+C キー)。"
WScript.Sleep(5000)
Const HKEY_CLASSES_ROOT = &H80000000
Set objReg= GetObject("winmgmts:\\.\root\default:StdRegProv")
strKeyPath = "lnkfile\shellex\IconHandler"
strValueName = ""
objReg.GetStringValue HKEY_CLASSES_ROOT, strKeyPath, strValueName, strValue
If strValue = "" then
WScript.Echo "回避策は実施済みです。"
Wscript.Quit
End If
strValue= ""
objReg.SetStringValue HKEY_CLASSES_ROOT, strKeyPath, strValueName, strValue
strKeyPath = "piffile\shellex\IconHandler"
objReg.SetStringValue HKEY_CLASSES_ROOT, strKeyPath, strValueName, strValue
WScript.Echo "コンピューターを再起動します(中止する場合は 5 秒以内にCTRL+C キー)。"
WScript.Sleep(5000)
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}!\\.\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
ObjOperatingSystem.Reboot()
Next

[undo_myfixit2000.vbs]
WScript.Echo "マイクロソフト セキュリティ アドバイザリ (2286198) - Windows シェルの脆弱性により、リモートでコードが実行される"
WScript.Echo "http://www.microsoft.com/japan/technet/security/advisory/2286198.mspx"
WScript.Echo "回避策を解除します(中止する場合は 5 秒以内に CTRL+C キー)。"
WScript.Sleep(5000)
Const HKEY_CLASSES_ROOT = &H80000000
Set objReg= GetObject("winmgmts:\\.\root\default:StdRegProv")
strKeyPath = "lnkfile\shellex\IconHandler"
strValueName = ""
objReg.GetStringValue HKEY_CLASSES_ROOT, strKeyPath, strValueName, strValue
If strValue = "{00021401-0000-0000-C000-000000000046}" then
WScript.Echo "回避策は解除済みです。"
Wscript.Quit
End If
strvalue = "{00021401-0000-0000-C000-000000000046}"
objReg.SetStringValue HKEY_CLASSES_ROOT, strKeyPath, strValueName, strValue
strKeyPath = "piffile\shellex\IconHandler"
objReg.SetStringValue HKEY_CLASSES_ROOT, strKeyPath, strValueName, strValue
WScript.Echo "コンピューターを再起動します(中止する場合は 5 秒以内にCTRL+C キー)。"
WScript.Sleep(5000)
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}!\\.\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
ObjOperatingSystem.Reboot()
Next

右のスクリーンショットは、Windows 2000 Professional SP4 に myfixit2000.vbs を適用したものです。ショートカット アイコンが既定のアイコンに変更されています。

さて、Windows 2000 や Windows XP SP2に対して回避策を実施した場合、おそらく回避策を解除できる日は来ず、ずっとこのアイコンの状態で使い続けることになるでしょう。サポート ライフサイクルが終了し、セキュリティ アドバイザリで影響を受けるソフトウェアにリストされていない Windows バージョンに対しては、この脆弱性を解消するセキュリティ パッチが提供される予定はありません。

スクリプトの流用は OK ですが、自己責任で

この投稿にあるバッチおよびスクリプトは、そのまま利用してかまいませんが、実行する場合は自己責任でお願いします。このバッチおよびスクリプトを実行したことによる、いかなる問題、障害にも責任は負いかねます。

0 件のコメント: