SPN通信 2011年10月31日

修正されたTelnetプロトコルハンドラの脆弱性


みなさん、こんにちは。 SPNの塩月です。

久々の投稿になりましたが、今回は今年8月のセキュリティ更新プログラム「MS11-057」によって修正された、Windowsの「Telnetプロトコルハンドラの脆弱性」についてお話しましょう。

  マイクロソフト セキュリティ情報 MS11-057
  Internet Explorer用の累積的なセキュリティ更新プログラム (2559049)
  http://technet.microsoft.com/ja-jp/security/bulletin/ms11-057

  JVNDB-2011-000060 
  WindowsのURLプロトコルハンドラにおける実行ファイル読み込みに関する脆弱性 
  http://jvndb.jvn.jp/ja/contents/2011/JVNDB-2011-000060.html
WindowsシステムにはURLで指定されたプロトコルに応じて特定のプログラムを起動する仕組みがあります。これはプロトコルハンドラと呼ばれ、標準でhttp、ftp、mailto、file、telnetなど各種のスキームごとにプロトコルハンドラが登録されています。今回修正されたのは、これらのうちのtelnet/rlogin/tn3270といったスキームを処理するTelnetプロトコルハンドラの脆弱性です。

例えばWebブラウザなどのアプリケーション・プログラムが「telnet://hostname/」というURLにアクセスする場合を考えてみましょう。通常、プログラムはURLに指定されているスキーム(ここではtelnet)に基づきTelnetプロトコルハンドラを起動します。

WindowsのTelnetプロトコルハンドラには、

  "C:\WINDOWS\system32\rundll32.exe" "C:\WINDOWS\system32\url.dll",TelnetProtocolHandler %l
というコマンドラインが登録されていますので、rundll32.exeがurl.dllをロードし、その中のTelnetProtocolHandlerエントリポイントを実行します。そして最終的にはShellExecute関数を用いてWindows標準のTelnetプログラム「telnet.exe」を起動するようになっています。

今回問題となったのはurl.dllの中でShellExecute関数を使用してtelnet.exeを呼び出す際に、カレントディレクトリに偽のtelnet.exeが存在する場合そちらを実行してしまうという、いわゆる「バイナリ・プランティング」の脆弱性です。バイナリ・プランティング問題については下記のSPN通信を参照してください。

  修正されたOperaのバイナリ・プランティング問題
  http://www.sec-pro.net/newsletter/20110131.html
Telnetプロトコルハンドラは以下のような形でShellExecuteの呼び出しを行います。
  ShellExecute(handle, NULL, "telnet.exe", アクセス先, Null, ...)
ShellExecute関数は指定されたプログラム「telnet.exe」を特定の順序で検索するのですが、本来起動すべきtelnet.exeのディレクトリパス「c:\windows\system32」よりも先にカレントディレクトリを検索してしまうため、前述のとおりカレントディレクトリにtelnet.exeという名称のプログラムがあればそれが実行することになります。

この脆弱性を利用した攻撃のシナリオは、

  あるディレクトリに不正なプログラムをtelnet.exeという名称で設置する
                ↓
  同一ディレクトリに「telnet:///」へアクセスするHTMLファイルを設置する
                ↓
  ユーザがこのHTMLファイルをWebブラウザで開くと・・・
                ↓
  Telnetプロトコルハンドラがカレントディレクトリ上のtelnet.exeを起動
といった流れになります。ちなみにWebブラウザ・プロセスのカレントディレクトリがHTMLファイルの置かれたディレクトリになるかどうかはWebブラウザの種類に依存するため、必ずしもすべてのWebブラウザでこの攻撃が成功するわけではありません。またWebブラウザによってはtelnetスキームを処理しないものもあります(IE7以降など)。

今回のセキュリティ更新で、TelnetプロトコルハンドラがShellExecute関数を呼び出す際に「既定のディレクトリ」として「c:\windows」を指定するように修正されました。

  ShellExecute(handle, NULL, "telnet.exe", アクセス先, "c:\windows", ...)
この対策により、最新のTelnetプロトコルハンドラではHTMLファイルと同じディレクトリのtelnet.exeを起動することはなくなりました。本セキュリティ更新プログラムは他のIE関連のさまざまな脆弱性も修正していますので、Microsoft Update等により早期に適用することが推奨されます。

それではみなさん、またお会いしましょう。

合同会社セキュリティ・プロフェッショナルズ・ネットワーク
代表社員 塩月誠人