SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

実例で学ぶ脆弱性対策コーディング

WindowsのDLLだけが危ないのか?
DLL hijacking vulnerability概説(前編)


DLL hijacking攻撃の概要

 DLL hijackingはそもそも、今回話題になったWindowsプラットフォームに固有の問題ではなく、概念的にはさまざまなプラットフォームで問題になりうる攻撃手法であり、また、最近発見された新しい攻撃手法というわけでもありません。LinuxなどUNIX系システムでは、DLLを使ってコンパイルすることは一般的であり、今回、Windowsで問題になったように、カレントディレクトリからDLLを読み込めるような環境(サーチパスにカレントディレクトリを示す"."が含まれる)では、同様の問題が発生しうることが昔から知られています(例えばCA-1995-14など)。

 ここでは、今回問題になったWindowsプラットフォームにおける脆弱性について見てみましょう。

 Windowsでは、アプリケーションが絶対パスを指定せずにファイル名だけを指定してDLLを読み込む場合、あらかじめ定められた順序で特定のディレクトリにDLLを探しにいきます。実際には、以下の順序でDLLの探索を行います。

  1. アプリケーションが読み込まれたディレクトリ
  2. システムディレクトリ
  3. 16ビットシステムディレクトリ
  4. Windowsディレクトリ
  5. カレントディレクトリ(CWD)
  6. 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 hijacking攻撃
図1. DLL hijacking攻撃
  • (1):脆弱性のあるアプリが利用するDLLと同じ名前の偽DLLを対象ファイルと同じディレクトリに保存する
  • (2):ブラウザでWebDAVやイントラネットの共有フォルダにアクセスする
  • (3):脆弱性のあるアプリに関連付けられたファイルをクリックして開く
  • (4):脆弱性のあるアプリは、正規のDLLではなく、偽DLL(悪意のあるプログラム)を先に見つけて実行してしまう

まとめ

 前編では、DLL hijackingと呼ばれるプログラムのDLL読み込みに関する脆弱性について、その概要やこれまでに発生したイベントを紹介しました。後編は、DLL hijacking攻撃を受けないアプリケーションを開発するため、Microsoftがアプリケーションの開発者向けに公開している対策方法の一部を紹介します。

参考情報

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
実例で学ぶ脆弱性対策コーディング連載記事一覧

もっと読む

この記事の著者

久保 正樹(JPCERT コーディネーションセンター)(クボ マサキ(JPCERT コーディネーションセンター))

脆弱性アナリストJPCERTコーディネーションセンター慶応義塾大学環境情報学部卒。ソニーでデスクトップPCのソフトウェア開発に携わったのち、米国ダートマス大学にてオーディオ信号処理、電子音響音楽の研究を行い、電子音響音楽修士を取得。2005年4月よりJPCERTコーディネーションセンターにて、脆弱性...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5441 2012/09/19 11:15

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー