SPN通信 2012年11月12日

引用符で囲まれていないプログラムパスの処理問題


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

今回のSPN通信はSANS ISCダイアリーに投稿されていた以下の記事についてご 紹介します。

  • Help eliminate unquoted path vulnerabilities
    http://isc.sans.edu/diary.html?storyid=14464

Windows OSに古くから存在する問題として、プログラム起動時における引用符 で囲まれていない空白を含むパスの処理に関する問題があります。例えばある サービスの実行ファイルのパスが、

  "c:\program files\common files\service\file.exe"
だったとしましょう。このようにファイルのパスが引用符「"」で囲まれて設 定されていれば問題ないのですが、
  c:\program files\common files\service\file.exe
のように引用符なしで設定されていたとします。この場合に、もし、
  c:\program.exe
  c:\program files\common.exe
といったプログラムファイルが存在すると、Windowsはサービス起動時にそれ らを優先して実行してしまいます。これはWindowsが引用符で囲まれていない 空白を含むパスを解釈する際に、どこまでがプログラムのパスでどこからがパ ラメータなのか判断できないため、空白区切りに基づいてプログラムファイル を探し実行を試みることに起因します。
  c:\program files\common files\service\file.exe
  ----------
      ↓
  最初に"c:\program.exe"の実行を試みる

  c:\program files\common files\service\file.exe
  -----------------------
            ↓
  次に"c:\program files\common.exe"の実行を試みる
つまり空白の区切りがあるたびに、そこまでの文字列をプログラムファイルの パスだと考えて実行を試みるわけですね。

通常、"c:\program.exe"や"c:\program files\common.exe"は存在しませんの で、最終的には正しいプログラムファイルのパス"c:\program files\common files\service\file.exe"を試行することにより目的のプログラムが起動しま す。しかし誰かが不正なプログラムを"c:\program.exe"等のファイル名で設置 した場合、当該サービス起動時にこのプログラムが自動的に実行してしまうこ とになります。 このような振る舞いはそもそもWindowsの仕様によるものですので、サービス を開発するプログラマはこのことを理解し、プログラムファイルのパスに空白 が含まれる場合はサービス登録時に引用符で囲むことが求められます。

ではこの問題がどのようなセキュリティ脅威につながるのでしょうか?

まず考えられるものとして「権限昇格攻撃」があります。多くのWindowsのサ ービスはシステム権限のように非常に高い権限で実行します。システム権限で 動作するサービスにこの問題があった場合、低い権限でログオンしている攻撃 者はこの問題を利用して不正なプログラムを高い権限で実行させる可能性があ ります。 一方で一般的なWindows環境ではデフォルトのパーミッション設定により、Cド ライブ直下やProgram Filesフォルダに一般ユーザ権限でファイルを作成する ことができないため、この問題を権限昇格攻撃に利用できるケースはそもそも ある程度高い権限を有している場合(XPのPower Usersグループ等)か、ファイ ルシステムのパーミッション設定に問題がある場合などに限定されると思われ ます。

もう一つの脅威として不正プログラムの自動実行への利用が考えられます。マ ルウェア等の不正プログラムはシステム起動時やユーザログオン時に自動的に 実行するため、「自動起動設定」を行うという一般的特徴があります。自動起 動設定にはサービスとして登録したり、レジストリのRunキーに設定したりす るなど各種の手法があり、システム管理者が不正プログラムの存在を調査する 際にはこれらの自動起動設定ポイントに不審なプログラムがないかどうかをチ ェックします。 しかし不正プログラムが今回の問題を利用して"c:\program.exe"のようなファ イル名で設置された場合、通常の自動起動設定を調査してもそこには正しいプ ログラムしか設定されていないため見逃してしまうかも知れません。正規の自 動起動設定を、いわば「隠れ蓑」にするようなイメージですね。ちなみにXPで はレジストリのRunキーでも同様の現象が起こります。

プログラムファイルのパスに空白を含んでいるにもかかわらず、引用符で囲ま ずに設定されているようなサービスは、それほど稀な存在ではありません。さ すがにWindows標準のサービスにはそのようなものはないでしょうが、私が日 常的に使用しているノートPCで調べたところ三つのサードパーティ製のサービ スにこの問題がありました。XP以降では以下のコマンドラインで調べることが できるので、みなさんも一度ご自分の環境で調べてみることをお勧めします。

  wmic service get name,displayname,pathname,startmode 
                    | findstr /i /v "c:\windows\\" | findstr /i /v """
なお余談ですが"c:\program.exe"というファイルを作成した場合、Windowsは ログオン時に「ファイル名に関する警告」のダイアログを表示することでユー ザに警告します。このダイアログは以下のレジストリ設定によりOFFにするこ とが可能です。
  レジストリキー:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\
                  Explorer\DontShowMeThisDialogAgain
  レジストリ値:文字列型「RogueProgramName」に「no」を設定
それではみなさん、またお会いしましょう。

参考:

  • CreateProcess function
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx
  • Windows Service Trusted Path Privilege Escalation
    http://www.metasploit.com/modules/exploit/windows/local/trusted_service_path
  • Unquoted Service Paths
    http://www.commonexploits.com/?p=658
  • The Program.exe Problem
    http://xato.net/hardening/the-programexe-problem/

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