SPN通信 2013年1月11日

権限昇格ダイアログを回避するBypassUAC


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

今回のSPN通信では、UACの権限昇格ダイアログを回避する「BypassUAC」という攻撃手法についてお話しましょう。

Windows Vistaから導入されたUAC(ユーザアカウント制御)の機能により、管理者権限グループ(Administratorsグループ)に所属する管理者ユーザは、ログオン時には標準ユーザレベルの権限しか持たないように制限がかけられています。この状態は「管理者承認モード」と呼ばれますが、管理者承認モードでログオン中の管理者ユーザがシステム管理に関する操作を実行する際、つまり管理者権限を必要とする操作を行う際には「権限昇格ダイアログ」ウィンドウによってユーザに実行の同意が求められます。ここで「はい」ボタンを押すことによりはじめて本来の管理者権限が与えられ、システム管理操作を実行することが可能になります。

XPまではこのような機能がなかったため、管理者ユーザが例えばWebブラウザの脆弱性によりマルウェアに感染した場合、マルウェアはユーザの管理者権限をフルに利用してシステム全体を制御することができました。しかしVista以降ではたとえ管理者ユーザがマルウェアに感染したとしても、ユーザが権限昇格ダイアログで「はい」を押さない限りシステム全体に影響を与えるような行為は制限されます。つまり「比較的」安全に管理者ユーザとしてログオンし、システムを利用することができるようになったということですね。

一方Vistaでは管理者ユーザがログオンしてシステム管理操作を頻繁に行う場合、この権限昇格ダイアログがそのたびに表示されるのでユーザにとって利便性が悪いというネガティブな面も表面化しました。そこでWindows 7では、デフォルト設定で一定の条件下における権限昇格については権限昇格ダイアログを表示しない(「自動昇格」と呼ばれています)ように変更が加えられました。どのような場合に自動昇格するかについては下記の資料に書かれていますが、基本的にはWindows OSに含まれる機能で、かつ利便性向上のために必要なものをマイクロソフトが選択したと考えていただければよいかと思います。

  • Windows 7 ユーザーアカウント制御の内部
    http://technet.microsoft.com/ja-jp/magazine/2009.07.uac.aspx

この自動昇格の機能を巧みに利用し、管理者承認モードから通常の管理者へとダイアログによる意志確認なしに権限昇格するのが「BypassUAC」という攻撃手法です。この攻撃手法はWindows 7のリリース当初から公開されており、Metasploit Frameworkの中ではBypassUACというモジュール名で実装されています(そのため本稿ではこれをBypassUACと呼んでいます)。ちなみに昨年リリースされたWindows 8もこの辺りの仕様は基本的に変更されていませんので、この攻撃手法はWindows 7および8の両方において有効です。

  • Windows 7 UAC whitelist: Proof-of-concept source code
    http://www.pretentiousname.com/misc/W7E_Source/win7_uac_poc_details.html

  • Windows Escalate UAC Protection Bypass
    http://metasploit.org/modules/post/windows/escalate/bypassuac

さてBypassUACの中身を見ていきましょう。BypassUACは以下の二つの自動昇格を利用することで攻撃を実現しています。

  1) 自動昇格COMオブジェクトを利用して保護領域に不正なDLLをコピー
  2) 自動昇格プログラムを利用して当該DLLをロードさせ不正行為を実行
通常、WindowsフォルダやSystem32フォルダ以下のような保護領域は管理者権限がないとファイルの作成ができません。しかしファイルのコピーや削除等を行う特定のCOMオブジェクトは、Windowsの標準プログラムから呼ばれた場合に限り自動昇格しますので、このCOMオブジェクトを利用すると権限昇格ダイアログなしでファイルを作成することが可能になります。BypassUACはまず、エクスプローラ(explorer.exe)のプロセスにこのCOMオブジェクトを呼び出させることで、不正なDLLファイルを以下のパスに作成します。
  C:\Windows\System32\sysprep\CRYPTBASE.DLL
次にBypassUACは、Windows OSにもともと存在する下記のプログラムファイルを実行します。
  C:\Windows\System32\sysprep\sysprep.exe
sysprep.exeが何であるかはこの際あまり関係がありません。重要なのはこのプログラムが起動時に管理者権限へと自動昇格すること、そして、同一フォルダに存在するCRYPTBASE.DLLという名称のDLLファイルをロードすることです。sysprep.exeは本来であればSystem32フォルダにある本物のCRYPTBASE.DLLをロードするのですが、同一フォルダに同じ名前のDLLがあればそちらを優先して使用する性質を持っています。そのためsysprep.exeは偽のCRYPTBASE.DLLをロードし、その中の不正なプログラムコードを管理者権限で実行してしまうのです。

このようにBypassUACはWindowsの仕様として実装されている機能を利用した攻撃手法であるため、Windows 7および8のデフォルト設定下において管理者ユーザでログオンしマルウェアに感染した場合、比較的容易に管理者権限で不正行為を行われてしまう危険性があります。

それでは、このような攻撃に対処するためにはどうすればよいのでしょうか?

一つはすべての権限昇格でダイアログを表示させるように、UACの設定を変更することが考えられます。具体的にはコントロールパネルの「ユーザーアカウント制御の設定」でスライダーを一番上の「常に通知する」にセットします。この設定により、Vistaがそうであったように管理者ユーザのすべての権限昇格についてダイアログで同意が求められるようになりますので、たとえマルウェアがBypassUACを実行しようとしても権限昇格ダイアログの表示によりユーザに気づく機会が与えられます。

ただこのような設定で運用すると、ユーザは頻繁に出現するダイアログに慣れてしまい、盲目的に「はい」を押すようになるかもしれません。あるいは面倒なのでユーザがUACの機能そのものをOFFにしてしまう危険性もあるでしょう。まさに「痛し痒し」の状況ですが、管理者ユーザとして日常的にログオンする必要がある限り、自動昇格機能を不正に利用されるリスクは避けるべきだと私は思います。

もう一つの方法は、システム管理者であっても管理者ユーザではなく標準ユーザとしてログオンして使用することです。標準ユーザ(Usersグループ所属)が権限昇格する際には管理者ユーザのIDとパスワードが必要なため、常にそれらを要求するダイアログが表示されます。当然のことながら自動昇格は行われないので、ユーザがわざわざダイアログで管理者のパスワードを入力しない限りBypassUACは成功しません。ですので日常的にシステム管理業務を行わないのであれば、極力標準ユーザでログオンすることが推奨されます。

安全性と利便性のバランスをどのようにとるかは非常に難しい問題です。マイクロソフトはWindows 7および8のデフォルトとしてUACの設定を現状のように決定しましたが、これがすべての環境にとって必ずしもベストであるとは限りません。選択肢は用意されています。UACのスライダーをどの位置にセットするかはみなさん次第です。

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

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