MSIE DHTML Edit Control Cross Site Scripting Vulnerability(その2)

続報

Secuniaからアドバイザリーが出ました。TESTも出来ます。

このアドバイザリーからたどれるTESTでは、XSSを利用してアドレスバー偽装に相当することを行なっています。CitiBank(あるいはPaypal。当初はCitiBankでしたがクレームでも来たのかな?)へのリンクをクリックすると、CitiBankのURLアドレスが表示されながらもページ内容はSecuniaが用意したものになっています。実際には、アドレスバー偽装とは異なります。アドレスは正しく、ページの表示内容としてはあらかじめTESTページでペイロードされたものがIEXSS脆弱性によって表示されています。ついでにページのプロパティーも見ておくと良いでしょう。

cookieやその他センシティブな情報を盗み出される可能性があるとSecunniaは警告しています。一部で感想が出始めていますが単なるアドレスバー偽装とは異なりますのでご注意下さい。たとえば壁紙提供サイトを見ているつもりだけなのにCitiBankにおけるあなたのcookieがステルスに、密かに盗み出される可能性があります。Secunia提供のTESTではこの意味で誤解を与えるものであったかもしれません。

一方、原報告者のGreyhatsによるデモでは、アドレスバーはデモサイトのものでありながらGoogleの画面が表示され、Googlecookieを盗み出すようになっています。仮にGoogleの表示内容を示す領域の大きさを制限したりすれば、恐らくもっと凶悪でしょう。ブラウザにXSS脆弱性があればなんでもできちゃうということですね。Secuniaのデモのほうがフィッシング詐欺に応用が簡単だというだけです。

Secuniaによれば、The vulnerability has been confirmed on a fully patched system with Internet Explorer 6.0 and Microsoft Windows XP SP1/SP2.とのことです。注目しておきたい点としてはSP2においても脆弱であるという点です。自動的に行なわれるwindows.open()はSP2のポップアップブロッカーで仕様的には禁止されるべきなのですが、このTESTでは作動してしまいます。DHTML Edit ActiveX Control の穴を使うことでSP2のポップアップブロッカーを迂回できることは先日、http-equiv氏が発見したところですが、その性質の上に、さらにXSS脆弱性まで存在することが発見されたことが今回の肝になっていると思います。

なお、DHTML Edit ActiveX Control の実装を担っている、dhtmled.ocxというファイルは、IE6のSP1のインストール媒体に入っている事が確認が取れています。従いまして一部で考えられているようにOffice製品を導入していないから安全かも?というようなことはありません。"kb310504:Internet Explorer 6.0 のファイル一覧 (1/2)を参照。SP2については資料がみあたりませんでした。(水無月ばけらさんのえび日記[後述]によればSP2にもあるようです。)

各TESTでは、dhtmled.ocxがうまく作動せずに、officeインストール媒体を要求されることがあるようです。これについては、以下のページがヒントになります。

この文書から引用します。

Q. 起動時に毎回Officeインストーラが起動してCD-ROMを要求される。
A.「Officeツール」の「HTML編集」が「初めて実行するときにインストール」になっているとこの症状が起こります。 インストーラが起動しないようにするには、コントロールパネルのプログラム(アプリケーション)の追加と削除にて Microsoft Office の設定変更を行います。 Officeのメンテナンスモード画面にて「機能の追加/削除」から「Officeツール」の「HTML編集」を「マイコンピュータから実行」かもしくは「インストールしない」に変更すればOKです

ということで、Microsoft Officeは、Office製品からDHTML エディタを利用する為に、(機能拡張された?)dhtmled.ocxを(上書き?)インストールしている可能性があります。インストール時点で、DHTML エディタを、Office媒体から呼び出すオプション(恐らく既定値)にしていなければ、SecuniaのTESTページなどで、dhtmled.ocxが呼び出された時に、CDの要求がなされるかもしれません。

さて、dhtmled.ocxをリネームなり削除なりしておけば、ポップアップブロッカー迂回やXSS脆弱性から身を守ることが出来るのかという疑問が浮かび上がります。結果を申し上げれば、安心できません。dhtmled.cabという存在があり、これを悪意あるサーバにおいておき、object要素のcodebaseで呼び出すことで、PC側ハードディスクに存在していなくともサーバからmicrosoft署名付きcabから動的に供給するということが可能かもしれないからです。Microsoft DHTML Editing SDKあたりを調べるとよいかも知れません。詳細は省きます。dhtmled.ocxのリネームや削除などで安心せずに、パッチが出るまでIEの利用の制限をして我慢しましょう。

回避策?レジストリエディタにて DHTML Edit ActiveX Control の動作を停止

kbJP240797:Internet Explorer で ActiveX コントロールの動作を停止する方法を参考にして、レジトリーをいじってみました。まずは、DHTML Edit Control Safe for Scripting for IE5のほうから。次に、DHTML Edit Control for IE5 も。

REGEDIT4

[HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\ActiveX Compatibility\{2D360201-FFF5-11d1-8D03-00A0C959BC0A}]
"Compatibility Flags"=dword:00000400


REGEDIT4

[HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\ActiveX Compatibility\{2D360200-FFF5-11d1-8D03-00A0C959BC0A}]
"Compatibility Flags"=dword:00000400


これで DHTML Edit ActiveX Control の動作を停止したことになります。SecuniaのTESTで実際に試して見ると、リンクをクリックしたとたん、次のようなエラーで止まりました。

ライン:207
文字: 3
エラー:'dec.DOM.Script'は Null またはオブジェクトではありません。
コード:0
URL: http://secunia.com/internet_explorer_cross-site_scripting_vulnerability_test/

原報告者のgreyhatsによるデモでも、同様に停止しました。自己責任にて。サーバにdhtmled.cabを置いておく方法も回避できる可能性が高いと思っていますが調べる環境がなく、まだ安心できていません。

SP2に関しての対策

素晴らしい解説が。

「またまた ActiveX がらみホゥル」@水無月ばけらのえび日記から引用させて頂きます。

……XP SP2 の場合は、インターネットオプションの「プログラム」タブにある「アドオンの管理」で "DHTML Edit Control Safe for Scripting for IE5" を無効にすることでも回避できるようですね。その状態でデモにアクセスすると、「無効なアドオン」と警告されて何も起きません。

少々懸念していますが、「DHTML Edit Control Safe for Scripting for IE5」以外に殺すべきものがあるのかどうか・・ででしょうか。「DHTML Edit Control for IE5」も殺せたほうが、より良いと思うのです。

「天秤をN回だけ使って(3N-3)/2枚のコインの中から重さの異なる1枚を見つける方法」の解答をjavascriptで自動生成

超絶。天秤をN回だけ使って(3N-3)/2枚のコインの中から重さの異なる1枚を見つける方法の解答をjavascriptで自動生成している人がいる!StudioKamadaさん。

実際に「天秤を5回だけ使って120枚のコインの中から重さの異なる1枚を見つける方法」を出力してみた。なお、「X += 1」は「X に 1 を加える」、「X -= 1」は「X から 1 を引く」という意味です。

天秤を5回だけ使って120枚のコインの中から重さの異なる1枚を見つける方法

コインに1〜120の番号を振る。

初期化 X = 0

1回目
  左: 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 95 96 97 98 99 100 101 102 103 113 114 115 119
  右: 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 104 105 106 107 108 109 110 111 112 116 117 118 120
左に傾いたとき X += 81
右に傾いたとき X -= 81
2回目
  左: 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 95 96 97 98 99 100 101 102 103 113 114 115 119
  右: 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 104 105 106 107 108 109 110 111 112 116 117 118 120
左に傾いたとき X += 27
右に傾いたとき X -= 27
3回目
  左: 5 6 7 8 9 10 11 12 13 32 33 34 35 36 37 38 39 40 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 113 114 115 119
  右: 14 15 16 17 18 19 20 21 22 41 42 43 44 45 46 47 48 49 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 116 117 118 120
左に傾いたとき X += 9
右に傾いたとき X -= 9
4回目
  左: 2 3 4 11 12 13 20 21 22 29 30 31 38 39 40 47 48 49 56 57 58 65 66 67 68 69 70 77 78 79 86 87 88 101 102 103 104 105 106 119
  右: 5 6 7 14 15 16 23 24 25 32 33 34 41 42 43 50 51 52 59 60 61 74 75 76 83 84 85 92 93 94 95 96 97 110 111 112 113 114 115 120
左に傾いたとき X += 3
右に傾いたとき X -= 3
5回目
  左: 1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 68 71 74 77 80 83 86 89 92 97 100 103 104 107 110 115 116
  右: 2 5 8 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 62 65 70 73 76 79 82 85 88 91 94 95 98 101 106 109 112 113 118 119
左に傾いたとき X += 1
右に傾いたとき X -= 1

5回目が終わった段階で X の絶対値が偽物のコインの番号を示している。1回目〜5回目のいずれか偽物のコインを乗せたときの天秤の傾き方から、偽物が本物よりも重いか軽いかがわかる。

コインが121枚あるときは天秤が一度も傾かなかったときに121枚目のコインが偽物であることがわかる。ただし121枚目のコインが偽物だったときはそれが本物よりも重いか軽いかはわからない(偽物を一度も天秤に乗せていないのだから当然)。

Kamadaさん、凄いなぁ。凄いなぁ。凄いなぁ。コインが何枚あっても最小回数で偽物を判別することができ、また直前の天秤の傾き方によって次に天秤に乗せるコインの選び方を変える必要がないところがこの方法の特徴です。というところが一番凄いのですが、回答を自動生成しちゃうのも凄い。

ところで上記回答をHTMLとしてどのように適切にマークアップしたら良いのかサッパリわからなかったのは内緒だ(笑)。div要素とpre要素で逃げた。