久保 正樹(JPCERTコーディネーションセンター) [著]
本連載では、最近話題のDLL hijacking vulnerabilityと呼ばれるプログラムのDLL読み込みに関する脆弱性について、前後編の2回に分けて解説します。前編では、DLL hijackingがどういった脆弱性なのか、その概要や関連するこれまでのイベントについて説明していきます。
はじめに
今回は、最近話題のDLL hijacking vulnerabilityと呼ばれるプログラムのDLL読み込みに関する脆弱性について解説したいと思います。この脆弱性は、"DLL preloading attack"と呼ばれたり"binary planting vulnerability"と呼ばれたりすることがありますが、これらは同じ問題の別称です。ここでは便宜上「DLL hijacking」という言葉で統一します。
この脆弱性は、スロベニアのセキュリティ会社Acros Security(Acros)が8月18日に公開したWindows向けApple iTunesの脆弱性"Remote Binary Planting in Apple iTunes for Windows"において、メディアの注目を集めました。前後して、UC Davisの研究者が同様の問題に関する学会発表を行っていたり、著名なセキュリティ研究者であるHD Moore氏が独自にツールを開発して同脆弱性の影響を受けるアプリケーションについて調査していた件をブログで公表したり、Acrosが独自に行った調査結果をMicrosoftと共有していたり、とセキュリティ業界ネタとしてさらに注目を集めました。
現在は、8月23日にMicrosoftが公式に対策方法に関するドキュメント(後編で詳述)を公開したことでひとまず騒ぎは落ち着いているという状況です。実は2008年にも同様の問題が公表され、メディアに取り上げられるなど話題になりました。この問題は、Windows OSだけの問題なのでしょうか。また、実際にはどれくらい深刻な問題なのでしょうか。以下に、本問題に関するイベントを時系列にまとめてみました。
DLL hijacking vulnerabilityに関するイベント
2008年
- 5月頃 セキュリティ研究者Nitesh Dhanjani氏が"Safari Carpet Bomb"と呼ばれる攻撃手法についてApple社に通知し修正された旨を自身のブログに公表し、注目を集める(CVE-2008-2540)。
- 8月20日 Microsoftの研究者David LeBlanc氏のブログに"DLL Preloading Attacks"がポストされる。
2010年
- 4月12日 スロベニアのセキュリティ会社Acros SecurityがWindows版 VMWare ToolのRemote Binary Plantingについて公表。
- 7月15日 カリフォルニア大学デービス校の研究者Taeho Kwon氏、Zhendong Su氏らがISSTA 2010にて論文発表を行う(タイトル:"Automatic Detection of Vulnerable Dynamic Component Loadings")。
- 8月18日 Acros Securityが"Remote Binary Planting in Apple iTunes for Windows"と題したセキュリティアドバイザリーを公開。
- 8月23日 Microsoftのセキュリティアドバイザリ(2269637)"Insecure Library Loading Could Allow Remote Code Execution"が公開される。
- 同日 MicrosoftのSecurity Research & Defenseブログに"More information about the DLL Preloading remote attack vector"がポストされる。
- 同日 David LeBlanc氏のブログに"Another technique for Fixing DLL Preloading attacks"がポストされる。
- 8月24日 Inj3ct0rにPoC(Proof of Concept)コードが大量に投稿され始める。
- 同日 HD MooreがDLLHijackingAuditKit v2を公開。「metasploit blog: Better, Faster, Stronger: DLLHijackAuditKit v2」。
- 8月31日 Acros Securityが、本脆弱性の影響有無を無料で調べることができるテスト"Online Binary Planting Exposure Test"を公開した。
・ACROS Security Problem Report #2010-04-12-1
・ACROS Security Problem Report #2010-04-12-2
今後の予定
- 11月25日 DeepSecセキュリティカンファレンスでAcrosの研究者が"Remote Binary Planting -- An Overlooked Vulnerability Affair"を発表予定。
DLL hijacking vulnerabilityに関するイベント
DLL hijackingはそもそも、今回話題になったWindowsプラットフォームに固有の問題ではなく、概念的にはさまざまなプラットフォームで問題になりうる攻撃手法であり、また、最近発見された新しい攻撃手法というわけでもありません。LinuxなどUNIX系システムでは、DLLを使ってコンパイルすることは一般的であり、今回、Windowsで問題になったように、カレントディレクトリからDLLを読み込めるような環境(サーチパスにカレントディレクトリを示す"."が含まれる)では、同様の問題が発生しうることが昔から知られています(例えばCA-1995-14など)。
ここでは、今回問題になったWindowsプラットフォームにおける脆弱性について見てみましょう。
Windowsでは、アプリケーションが絶対パスを指定せずにファイル名だけを指定してDLLを読み込む場合、あらかじめ定められた順序で特定のディレクトリにDLLを探しにいきます。実際には、以下の順序でDLLの探索を行います。
- アプリケーションが読み込まれたディレクトリ
- システムディレクトリ
- 16ビットシステムディレクトリ
- Windowsディレクトリ
- カレントディレクトリ(CWD)
- PATH環境変数に設定されているディレクトリ
もし攻撃者がアプリケーションのカレントディレクトリを制御下におくことができると、どうなるでしょうか? アプリケーションが本来読み込みたいDLLと同じファイル名で、攻撃コードを仕込んだDLLをカレントディレクトリに置いておくと、細工されたDLLが検索にひっかかり、アプリケーションにロードされ、攻撃コードが実行されてしまいます。
そもそもファイル名だけを頼りにファイルを特定するというメカニズムにおいて、ファイルの同一性を保証することは困難です。正規化された特定のパスにあるファイルを読み込むのではなく、特定の検索順位に従ってファイルを探索し最初に見つかったファイルを読み込むという、そもそも同一ファイル名のファイルが複数存在することを前提としたメカニズムは、セキュリティの観点からは好ましくないと言えるでしょう。
SANS Internet Storm Centerのブログによると、これまでのところuTorrent、Microsoft Office、Windows MailなどDLL hijacking攻撃の影響を受けるアプリケーションを悪用した攻撃が実際に行われているという報告を受けているとのことで、ユーザーは注意が必要です。
攻撃のシナリオ
2008年の時点で話題にあがっていたDLL hijacking攻撃が今回あらためて注目を集めた理由の1つは、より現実的にリモートから攻撃できる攻撃経路(attack vector)が一般に公開されたということにあります。攻撃者の制御下にあるSMBやWebDAV共有に置かれたファイルを被害者に開かせることにより、同じディレクトリに置いたDLLを脆弱なアプリケーションに開かせることが可能であることは、ACROS Securityの無料テストで容易に検査できることからも明らかです。攻撃対象となるアプリケーションに開かせるファイルをユーザーにダブルクリックさせることで、ファイルおよび細工したDLLの置かれたディレクトリをカレントディレクトリに設定され、アプリケーションが上述の順序でDLLを探索する際、カレントディレクトリに攻撃者が置いた細工したDLLを読み込ませることができる、というわけです。
攻撃対象となるアプリケーションに開かせるファイルと、そのアプリケーションに誤って読み込ませる細工したDLLの両方を攻撃者が置いておくことのできる場所はすべて、攻撃経路として悪用される恐れがあります。プログラムのエンドユーザーができる対策としては、外部リソースであるSMBやWebDAV共有をブロックし、この攻撃を受けるリスクを低減することが有効であると考えられます。
- (1):脆弱性のあるアプリが利用するDLLと同じ名前の偽DLLを対象ファイルと同じディレクトリに保存する
- (2):ブラウザでWebDAVやイントラネットの共有フォルダにアクセスする
- (3):脆弱性のあるアプリに関連付けられたファイルをクリックして開く
- (4):脆弱性のあるアプリは、正規のDLLではなく、偽DLL(悪意のあるプログラム)を先に見つけて実行してしまう
まとめ
前編では、DLL hijackingと呼ばれるプログラムのDLL読み込みに関する脆弱性について、その概要やこれまでに発生したイベントを紹介しました。後編は、DLL hijacking攻撃を受けないアプリケーションを開発するため、Microsoftがアプリケーションの開発者向けに公開している対策方法の一部を紹介します。