プロダクト

Windowsの保護されたプロセスの保護

この短いブログは、James Forshaw氏とAlex Ionescu氏によって最初に公開された、ユーザーランドのWindowsエクスプロイトについて解説する2部構成シリーズの第1弾です。このエクスプロイトにより、攻撃者は通常カーネルドライバーを必要とする高度な権限を要するアクションを実行できるようになります。

Protected Process Light

Windows 8.1では、Protected Process Light(PPL)という概念が導入されました。これにより、特別な署名が施されたプログラムは、管理者ユーザーによる改ざんや終了操作に対しても耐性を持つ形で実行できるようになります。その目的は、マルウェアが暴走して重要なシステムプロセスを改ざんしたり、アンチマルウェアアプリケーションを終了させたりすることを防ぐことです。PPLには「レベル」の階層があり、権限の高いレベルは権限の低いレベルによる改ざんから保護されますが、その逆は当てはまりません。

PPLプロセスの詳細については、以下のリソースをご覧ください。

エクスプロイト

大まかに言うと、このエクスプロイトはキャッシュポイズニング攻撃であり、攻撃者はKnownDllsキャッシュ(Windows DLLの信頼されたリスト)にDLLを追加できます。KnownDllsは、PPLの最高形態であるWinTcbプロセスからのみ書き込み可能ですが…DefineDosDevice APIの実装におけるバグにより、攻撃者はWinTcbプロセスであるCSRSSを騙して、代わりにキャッシュエントリを作成させることができます。KnownDllsはWindowsローダーによって信頼されているため、PPLプロセス内であっても、KnownDllsが読み込まれる際にセキュリティチェックは追加で行われません。キャッシュを汚染した後、攻撃者は保護されたプロセスを立ち上げ、最終的にそのDLLを読み込んでペイロードを実行させます。

このエクスプロイトにより、攻撃者は任意のDLLをPPLプロセスにインジェクションできるため、WinTcb権限でどのようなアクションも実行可能になります。Microsoftは、この 脆弱性 の修正には 関心がない ことを示しています。Windows 10 21H1 バージョン 10.0.19043.985で動作することが確認されています。

オープンソース

私たちが把握している最初の公開エクスプロイトPOCは、最近リリースされたPPLDumpです。これは、RunAsPPLモードのLSASSのようなあらゆるPPLプロセスをダンプできる ツール です。PPLDumpのリリースから数週間後、 Sealighter-TI が登場しました。これはPPLDumpのエクスプロイトコードを再利用して、通常はNDA(秘密保持契約)の下でアンチマルウェア企業にのみ制限されているThreat-Intelligence ETWフィードへのアクセスを許可するものです。Sealighter-TIの迅速な展開は、エクスプロイトコードを再利用して新しいペイロードを実行することがいかに容易であるかを示しています。

エクスプロイトコードが公開されたことで、攻撃的なツールがこれを迅速に利用し、WinTcb PPLとしてペイロードを実行するようになると予想されます。これにより、以下のことが可能になります。

  • LSASSがPPLとして実行されるように強化されている場合でも、エンタープライズ認証情報をダンプします。
  • セキュリティ製品などのPPLプロセスを終了または密かに無効化する。
  • インプラント全体をWinTcb PPLプロセスとして実行します。これらのインプラントは、ユーザーモードのセキュリティ製品によって検査や終了を行うことはできません。Microsoftはセキュリティ製品をWinTcbよりも権限の低いAntiMalware PPLに制限しています。
  • 既存のPPLプロセスにコードを注入します。Windows Defender内部でCobalt StrikeのBeaconペイロードを実行することを想像してみてください。

脆弱性の解消

この脆弱性に対する公開された緩和策がないため、当社はこれを解消するためのツール「PPLGuard」をリリースします。許可を得てPPLDumpコードベースを基に作成されたPPLGuardは、エクスプロイトを使用してまずWinTcb PPLに昇格し、次にDACLを適用してKnownDllsオブジェクトディレクトリを読み取り専用にします。これにより、エクスプロイトチェーンの重要なステップであるCSRSSによる新しいエントリの追加が阻止され、エクスプロイトが防御されます。このDACLはメモリ上にのみ存在するため、再起動時に消去されます。

PPLGuardによってKnownDllsに追加されたGENERIC_WRITE DENY ACE

PPLGuardがエクスプロイトの基盤となる脆弱性を塞ぐため、その後の実行は失敗します。

C:\git\PPLGuard>x64\Release\PPLGuard.exe
[+] KnownDllsの強化に成功しました!:)
C:\git\PPLGuard>x64\Release\PPLGuard.exe
[-] DefineDosDeviceが失敗しました。エラーコード: 5 - アクセスが拒否されました。

PPLGuard概念実証(POC)ツールはこちらから入手できます。

結論

本ブログでは、Windowsの特権昇格エクスプロイトについて解説し、悪用された脆弱性を緩和するオープンソースツールを提供しました。本ブログのパート2では、Elastic Securityを使用して、このような種類の攻撃をハンティングする方法を解説します。どうぞご期待ください。

その間に、Elastic Cloud上のElasticsearch Serviceで最新バージョンをお試しください。また、成功を導く準備の一環として、クイックスタートトレーニングもぜひご活用ください。

更新 2021年6月3日:この記事の執筆後、PPLDumpエクスプロイトが.NETに移植され、Cobalt StrikeビーコンをWinTCB PPLとして実行できるようになりました。