SPN通信 2019年12月19日

Windowsのシャットダウンは安全か?


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

みなさんはノート型やタブレット型のWindows PCを持ち運ぶ際に、どうやって電源停止していますか? スリープ派? 休止状態派? それともシャットダウン派?

スリープや休止状態ではログオンセッションが継続されるので素早く作業を再開したい時には便利ですが、安全性を考えると確実にログオンセッションをクリアしてくれるシャットダウンを選択する場合もあるかと思います。ところが安全であるはずのシャットダウンが、実は安全ではなかったとすればどうでしょう・・・?

最近のWindowsにはシステム起動の際に、最後にログオンしていたユーザで自動的にログオンするという機能(ARSO:Automatic Restart Sign-On)があり、スタンドアローンコンピュータはデフォルトでそれが有効になっています[1]。例えばユーザAがログオンしており、ログオン中にシャットダウンしたとしましょう。次に起動したときにシステムは自動的にユーザAでログオンを開始し、その後スクリーンをロックします。ユーザAがログオン画面で認証するとスクリーンロックが外れ、すでに開始している自分のログオンセッションを使用します。

ちなみに別のユーザBがログオン画面で認証した場合はその時点でユーザBのログオンセッションが開始し、ユーザAのログオンセッションはバックグラウンドで動き続けることになります。複数のユーザアカウントがあるWindowsマシンをシャットダウンしようとしたときに「他のユーザがまだ使っているけど強制終了していい?」って感じで聞かれることがありますが、その原因の一つがこのARSOによるものですね。

マイクロソフトの文書によるとこの機能のそもそもの目的はWindowsのアップデート時に必要なログオン後の処理を自動的に行うことで、アップデートプロセスを高速化させる(ユーザのログオンを待たずにアップデートを完了させる)ところにあるようです。ドメインメンバーの場合はその目的通り、通常はアップデートのリブート時に限ってARSOが行われるとのことですが、スタンドアローン環境ではユーザ操作による再起動やシャットダウンからの起動の際にもこの機能が働きます。そのため再起動後に同じユーザでログオンする場合、パスワードを入れて認証する前にログオン処理がほぼ完了しているので、認証してから作業が開始できるまでの時間が短縮され、そのことが操作性の向上にもつながっています。

一方でこの機能を実現するため、シャットダウン時にOSはユーザの認証情報をLSAシークレット内に一時的に保存します[2][3]。以下はシャットダウン状態のマシンからローカルアカウントに関する認証情報をMimikatzでダンプした例です。

【 MimikatzによるLSAシークレットのダンプ例(抜粋)】

  Secret  : M$_MSV1_0_TBAL_PRIMARY_{22BE8E5B-58B3-4A87-BA71-41B0ECF3A9EA}
  cur/hex : 00 00 00 00 94 00 00 00 05 00 00 00 00 00 00 00 b2 58 04 42 
            8b eb 48 76 a0 ac 06 6d 1d 2d 28 60 00 00 00 00 00 00 00 00 
            00 00 00 00 00 00 00 00 07 57 a8 17 50 fb 97 31 0e bb 28 53 
            06 9d 42 82 5e ff c0 50 00 00 00 00 00 00 00 00 00 00 00 00 
            00 00 00 00 00 00 00 00 68 00 00 00 02 00 20 00 88 00 00 00 
            0a 00 0c 00 2e 00 00 00 10 00 00 00 30 03 00 00 04 00 00 00 
            01 00 00 00 03 06 00 00 1c 00 00 00 00 00 00 00 61 00 64 00 
            6d 00 69 00 6e 00 00 00
      User   : admin
      Domain : .
      * NTLM : b25804428beb4876a0ac066d1d2d2860
      * SHA1 : 0757a81750fb97310ebb2853069d42825effc050

ここで注目すべきはログオンパスワードのSHA-1ハッシュが保存されている点です。ユーザのさまざまな秘密情報はDPAPI(データ保護API)という暗号化機能で保護されていますが、DPAPIはこれらの秘密情報の暗号化や復号にユーザごとのマスターキーを使用します。ローカルアカウントではログオンパスワードのSHA-1ハッシュがマスターキーの保護に用いられますので、SHA-1ハッシュの漏洩はDPAPIにとって致命的と言えるでしょう。DPAPIが保護する秘密情報にはEFSやS/MIMEの秘密鍵、ファイル共有時、リモートデスクトップアクセス時、ブラウザでのベーシック認証、Webサイトのフォーム認証、そのほかサードパーティのソフトウェアなどにより保存されたユーザID/パスワードといったものがあります。つまりBitLocker等でCドライブが暗号化されていない場合、物理的にアクセス可能な第三者にこれらの秘密情報が漏洩してしまうことになります。

通常、DPAPIによって保護されたユーザデータの復号は以下のようにユーザの平文パスワードに基づいて行われます[4]。

【 DPAPIによるユーザデータの復号処理の流れ 】

  ローカルアカウントの
    平文パスワード
        ↓
     UTF16LE        ユーザSID
        ↓             ↓
    SHA-1ハッシュ → 復号処理 → マスターキー → 復号処理 → ユーザの各種秘密情報
                       ↑                          ↑        (保存されたパスワード等)
                   暗号化された                暗号化された
                   マスターキー               秘密情報データ

つまり通常はローカルログオンの認証画面でパスワードを入れることにより、ログオンしたユーザは自分の秘密情報にアクセスできるのですが、LSAシークレットにSHA-1ハッシュが保存されていると平文パスワードがわからなくてもCドライブ内の情報のみを使用して復号することができるわけですね。ちなみにMimikatzにはこれらの復号処理を実行する機能がすべて含まれています。

【 MimikatzによるWindows資格情報の復号手順 】

  1) LSAシークレットの復号
    lsadump::secrets  ← SYSTEMハイブファイル、SECURITYハイブファイル
      ↓
    SHA-1ハッシュ

  2) マスターキーの復号
    dpapi::masterkey  ← マスターキーファイル、SHA-1ハッシュ、ユーザSID
      ↓
    マスターキー

  3) Windows資格情報の復号
    dpapi::cred       ← Credentialファイル、マスターキー
      ↓
    保存されたユーザID/パスワード

このようにARSOが有効になっているWindowsマシンでは、シャットダウンによる電源停止が必ずしも安全性の向上にはつながらず、状況によってはむしろ悪化させることも考えられます。対策方法ですが、まずはBitLocker(あるいは「デバイスの暗号化」)でCドライブ全体を暗号化することです。それにより停止状態のマシンのCドライブから上記のような情報を抽出する攻撃は防げます。ただし起動後のマシンの物理メモリに対する攻撃(DMAやコールドブートアタック)まで考慮する必要がある場合は、このARSO自体を停止することが望まれます。

ユーザ単位でARSOを停止するには以下の設定を「オフ」にします[5]。ただしWindows 10のバージョンにより設定場所や表現が微妙に異なるので注意が必要です(下記はバージョン1909の場合)。ARSOの停止によりシャットダウン時に当該ユーザの認証情報がLSAシークレット内に保存されることはなくなります。

スタート
  設定
    アカウント
      サインインオプション
        プライバシー
          サインイン情報を使用してデバイスのセットアップを自動的に完了し、
          更新または再起動後にアプリを再び開くことができるようにします

バージョン1903以降はグループポリシーにより有効化/無効化、さらにBitLockerで暗号化されている場合のみ有効などの制御が可能になりました。詳細は参考資料[1]をご覧ください。

起動時に最後のユーザで自動的にログオンしスクリーンをロックするというのは、利便性を考えればグッドアイデアなのかもしれません。ただいくらCドライブを暗号化して保護しているとしても、「気持ちが悪い」という感覚はぬぐえないですね。まあ私はめったにシャットダウンしないので個人的にはあまり関係ありませんが・・・ :-)

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

[1] Winlogon automatic restart sign-on (ARSO)
https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/manage/component-updates/winlogon-automatic-restart-sign-on--arso-
[2] TBAL: an (accidental?) DPAPI Backdoor for local users
https://vztekoverflow.com/2018/07/31/tbal-dpapi-backdoor/
[3] DPAPI security flaw in Windows 10
https://www.passcape.com/index.php?section=blog&cmd=details&id=38
[4] Windows Data Protection
https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN
[5] 更新または再起動の後にPCのセットアップを自動的に完了する
https://support.microsoft.com/ja-jp/help/4027599/windows-10-automatically-finish-setting-up-pc-after-update-restart

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