Windowsセキュリティ・ワンポイントレッスン

第1回 ハイバネーションの危険性



みなさんはノートPCを持ち歩く際に、どのような状態でパワーオフしていますか?

お仕事で外回りなどをされている方などは特にそうでしょうが、いちいちOSをシャットダウンするのは手間と時間がかかりますので、多くの場合、ログオンしたまま一時停止の状態にしておき、パワーオン後すぐさま継続してお使いになっているかと思います。そのようなケースでよく利用されるのが「ハイバネーション」(いわゆる休止状態)ですが、ハイバネーション機能は注意して使わないと思わぬ情報漏洩に結びつきかねません。

今回の「Windowsセキュリティ・ワンポイントレッスン」は、このハイバネーション機能の危険性について解説します。




ハイバネーションとは


Windows PCを「一時停止」の状態にする場合、一般的には以下のニ種類の選択肢があります。

  • スタンバイ状態にする
      メモリにデータを保持している状態を保ったままパワーオフ。CPUやハードディスク、ディスプレイなどメモリ以外への電源供給は停止する。すばやい停止/再開が可能だがメモリには電源が供給され続けるため、バッテリーはパワーオフの間も若干消費される。

    図1 スタンバイ


  • 休止状態にする(ハイバネーション)
      メモリ内容をハードディスクに書き出してパワーオフ。すべてのデバイスへの電源供給は停止する。再開時にメモリ内容をハードディスクから読み出すため、スタンバイに比べると停止/再開に時間がかかるが、バッテリー消費は最低限に抑えられる。

    図2 ハイバネーション


    ちなみにWindows Vistaでは、スタンバイとハイバネーションを組み合わせた「ハイブリッドスリープ」というモードが導入されています。




    ハイバネーション状態における脅威


    さてハイバネーション状態のノートPCを紛失し、悪意を持った攻撃者の手に渡ってしまったとしましょう。その際に直面する脅威として、どのようなものがあるでしょうか?

    前述の通り、ハイバネーション状態ではメモリの内容がハードディスクに保存され、再開時にはその情報がメモリへと復元されます。ハードディスク上では、システムドライブ(通常はCドライブ)のルートフォルダ直下にある「hiberfil.sys」というファイルがその保存場所です。つまりハイバネーションファイル(hiberfil.sys)には、ハイバネーションを行った際のメモリ内容と同等の情報が記憶されていることになります。


    図3 hiberfil.sysファイル


    2007年に東京で開催されたPacSecカンファレンスにて、「Sandman」というツールを使用したハイバネーションファイルのフォレンジック分野への応用や、攻撃側における悪用方法などが紹介されました。SandmanはハイバネーションファイルをRead/WriteアクセスするためのCおよびPythonライブラリ集で、「Sandman Project[1]」というWebサイトで公開されています。私は残念ながらこのカンファレンスには参加できなかったのですが、その際のプレゼンテーション資料やその他の各種ドキュメントも当該Webサイトから入手することができます。

    このプレゼンテーション資料によりますと、ハイバネーションファイルを利用した攻撃方法として以下の二つがあげられています。

  • ハイバネーションファイルから各種のデータ抽出を行う
  • ハイバネーションファイルにパッチをあててシステムの動作を変更させる

    それではこれらの攻撃手法について、少し詳しく見ていきましょう。




    ハイバネーションファイルからの情報収集


    コンピュータのメモリ中には、実行中の各種プロセスの状態や、ネットワーク接続状況、カーネルモジュール、実行プログラムコード、プロセスが使用しているデータなど、さまざまな情報が含まれています。ハイバネーションファイルには一時停止した時点でのメモリ内容のスナップショットが保存されますので、休止状態のPCからハイバネーションファイルを抽出して調査することにより、その時点でどのようなプロセスが動いていたか、また各プロセスがどのようなデータを持っていたか、などを知ることができます。

    例えば機密情報の漏洩を防ぐために、ファイルを暗号化する仕組みを導入していたとしましょう。確かにハードディスク内ではファイルは暗号化されているため、PCが盗難に遭ったとしても、暗号化鍵の管理さえ適切であればハードディスク上のファイルから情報が漏洩する可能性は極めて低くなります。しかしアプリケーションプログラムがそのファイルにアクセスしている場合(ワープロソフトで編集中など)、通常メモリ中にはデータは復号して格納されますので、その状態でハイバネーションを行うとハイバネーションファイルには機密情報が平文で保存されます。つまり暗号化していたつもりの情報が、ハイバネーションファイル経由で漏洩してしまう危険性があるというわけです。


    図4 ハイバネーションファイル経由での機密情報の漏洩


    さらに暗号化システムが暗号化鍵をメモリ中に保持しているような場合は、ハイバネーションファイルから暗号化鍵を探し出して抽出し、ハードディスク等の暗号化を解除する攻撃手法が考えられます。2008年に公開された「Cold Boot Attacks on Encryption Keys[2]」という論文では、物理メモリ中から暗号化鍵を抽出してBitLockerやTrueCryptといったディスク暗号化システムを攻撃する手法が紹介されていますが、この手法はハイバネーションファイル自体が暗号化されていない限り、ハイバネーションファイルに対して応用することも可能だと思われます。

    近年、PCのメモリ内容を解析することで、マルウェアの存在を検出したり、あるいはコンピュータフォレンジックを効果的に実施したりするための研究が多数行われており、そのためのツールも各種開発されています[3]。オープンソースとして公開されている「Volatility Framework[4]」というツールもそのうちの一つですが、このようなツールを使えばハイバネーションファイルを物理メモリイメージに復元し、その内容をさまざまな角度で解析することが可能となります。




    ハイバネーション・パッチによる認証回避


    ハイバネーション状態から復帰する際、一般的にはログオンパスワードを入力しなければなりません。つまり復帰時にユーザ認証の処理が行われ、そのチェックを通って初めてハイバネーションを行う直前の状態に戻ることができます。ところでこの「ユーザ認証の処理」を行うプログラムコードはどこにあるかというと、当然のことながらメモリの中にあります。ハイバネーションからの復帰時にメモリの内容をどこから持ってくるかというと、ディスク上のハイバネーションファイルから読み込んできます。すなわち、ディスク上のハイバネーションファイルの中にある「ユーザ認証処理を行うプログラムコード(msgina.dllやmsv1_0.dllなど)」を改変することにより、復帰時に実行されるユーザ認証処理をバイパスし、ユーザ認証なしでハイバネーション前の状態(ユーザがログオンして操作している状態)に戻ることができてしまいます。


    図5 ハイバネーション・パッチによるユーザ認証の回避


    ハイバネーションファイルはメモリ内容を圧縮/エンコードした形で格納しているので、ハイバネーションファイル中のプログラムコードを改変する(パッチをあてる)ためには一旦デコードしてメモリ形式に変換し、パッチをあてた後にハイバネーション形式に戻す必要があります(前述のSandmanにはその機能が含まれています)。ですがハイバネーションファイルの圧縮方式はそれほど複雑ではないため、数バイト程度であれば特にデコード/エンコードを行わなくても直接パッチをあてることは多くの場合可能です。

    2006年、オーストラリアで開催されたセキュリティカンファレンスで「Physical Access Attacks with Firewire[5]」というセッションが行われました。そこではスクリーンセーバなどでパスワードロックされている状態のPCに対し、FireWire(IEEE 1394)経由でメモリにDMAアクセスすることにより、直接メモリ内のプログラムコードを改変してパスワードロックを解除するという攻撃手法が報告されたのですが、ハイバネーション・パッチによる認証回避は、まさにこの攻撃手法の応用になります。ちなみにFireWireを使用してメモリパッチを行う攻撃プログラムは、「Firewire, DMA & Windows[6]」というサイトで公開されています。

    ユーザ認証をバイパスしてログオン状態に復帰できるということは、極めて危険性が高いといえます。例えばWindowsのEFS(暗号化ファイルシステム)などは、ユーザがパスワードを入力してログオンすることによってはじめて暗号化したファイルにアクセスできるようになりますので、オフライン・パスワードリセットのような攻撃[7]で強制的にログオンできたとしても、ユーザのパスワードを知らない限りEFSファイルにアクセスすることはできません。またWindowsはSyskeyの設定を強化することにより、一般的なオフライン攻撃からシステムの機密情報を強固に保護することができるように設計されています。しかし、ハイバネーション・パッチによりユーザ認証なしで復帰できてしまうと、攻撃者はすでにOSが起動してユーザがログオンしている状態、つまり建物内の金庫の中にたどり着けてしまいます。当然そのユーザのEFSファイルにアクセスすることができますし、仮にSyskey設定が強化されていても、パスワードハッシュやLSAシークレットといったOS機密情報を正しくダンプすることが可能です。




    対策


    以上述べてきましたとおり、ハイバネーション機能の使用はさまざまなリスクを伴います。最も安全な停止方法がOSのシャットダウンであることは言うまでもないですが、それでは身も蓋もありませんので、ここではどうすれば安全性と利便性、およびコストとの折り合いをつけることができるかを考えてみましょう。


    システムドライブ全体の暗号化


    最も適したソリューションは、「システムドライブ全体の暗号化」です。Windows VistaのEnterpriseまたはUltimateエディションには、BitLocker[8]というディスクボリューム暗号化機能が含まれています。BitLockerを使用すればOSがインストールされているボリューム全体を暗号化できますので、ハイバネーションファイルも暗号化され、そこからの情報漏洩やハイバネーション・パッチによる認証回避といった攻撃は不可能になります。

    オープンソースのTrueCrypt[9]という暗号化システムも、システムドライブ全体を暗号化する機能があります。Windows XPやVistaの他のエディション等、BitLockerが使えない場合には、このTrueCryptを利用するのも一つの手だと思われますし、他にハイバネーションに対応したドライブ暗号化の各種サードパーティ製品もいろいろと開発されています。

    システムドライブ暗号化は優れた解決策ですが、導入のためにはいろいろな意味でコストがかかります。またハードウェア環境によっては導入できない場合もあるかも知れません。さらにTrueCryptの開発者によると、Windows OSのハイバネーション周りのAPIは公開されていないため、マイクロソフト以外のドライブ暗号化システムがハイバネーションに完全に対応することは現時点では困難だと言われています。ですのでシステムドライブ暗号化製品を導入する際には、ハイバネーションへの対応状況を事前に十分に確認した方がよいでしょう。


    強固なハードディスクパスワードの設定


    システムドライブの暗号化を導入しないケースでは、安全にハイバネーションを行うことは基本的にできませんので、何らかの別の対策を施すことで攻撃者が超えなければならないハードルを高くする必要があります。そのために有効な機能として、最近のPCには「ハードディスクパスワード」が備わっています。

    ハードディスクパスワードはATAの規格で定められているハードディスクのセキュリティ 機構で、設定したパスワードを入力しない限りハードディスクに対してアクセスすることができないというものです。もちろんある程度のツールや設備、そして技術と根性(もしくはお金)があれば、このセキュリティ機構を回避することは可能ですが、複雑なパスワードを設定することで一般的なハードディスクに対するアクセス制御としては十分役に立つと思われます。


    ハイバネーションとスタンバイ、どちらを選択?


    ちなみにバッテリーの寿命など他の要素はさておき、安全性にのみ注目した場合、ハイバネーションとスタンバイのいずれを選択すべきでしょうか?

    システムドライブの暗号化が行われている(つまりハイバネーションファイルが暗号化されている)ケースでは、ハイバネーションの方が明らかに安全だといえます。スタンバイ状態は物理メモリ内にデータを保持していますので、前述したCold Boot Attackなど物理メモリに対する攻撃の脅威にさらされてしまいます。一方ハイバネーションはメモリ内容が暗号化状態でハードディスクに保持され、電源OFF後は物理メモリからデータは消失しますので、平文のメモリ情報はどこにも存在しなくなります。

    システムドライブ暗号化を導入していないケースでは、個人的にはスタンバイの方がハイバネーションよりは安全性が高いと考えています。たとえハードディスクパスワードが破られたとしても、スタンバイの場合、攻撃者は物理メモリへの直接的なアクセス(DMA等)が必要となりますが、ハイバネーションの場合は攻撃者はディスクアクセスさえできれば事足りるからです。



    ハイバネーション機能は非常に便利ではあるものの、使い方を一つ間違えると容易に情報漏洩を引き起こしてしまいます。ハイバネーションファイルにはメモリ内容が保存されること、メモリ内容は機密情報を含んでいること、そしてその内容を改変することにより認証処理が回避されてしまう危険性があることを認識していただき、本資料を安全なシステム運用そして情報漏洩対策に役立てていただければ幸いです。

    ※ ハイバネーション・パッチによるユーザ認証回避がいかに容易に実行できるかをご理解いただくため、デモ用の映像を用意しております(WMV形式、約2.7MB、約2.5分)。興味のある方はご覧ください。



    
    [1]  Sandman Project
         http://sandman.msuiche.net/
    
    [2]  Lest We Remember: Cold Boot Attacks on Encryption Keys
         http://citp.princeton.edu/memory/
    
    [3]  稼動中システムの調査対応・メモリ分析
         http://www.digitalforensic.jp/archives/2008/808.pdf
    
    [4]  Volatility Framework
         https://www.volatilesystems.com/default/volatility
    
    [5]  Hit by a Bus: Physical Access Attacks with Firewire
         http://www.ruxcon.org.au/files/2006/firewire_attacks.pdf
    
    [6]  Firewire, DMA & Windows
         http://storm.net.nz/projects/16
    
    [7]  Offline NT Password & Registry Editor
         http://home.eunet.no/~pnordahl/ntpasswd/
    
    [8]  BitLocker ドライブ暗号化
         http://technet.microsoft.com/ja-jp/windows/aa905065.aspx
    
    [9]  TrueCrypt
         http://www.truecrypt.org/
    
    


    2009年4月執筆
    塩月 誠人
    ネットワークセキュリティコンサルタント
    合同会社セキュリティ・プロフェッショナルズ・ネットワーク