
Windowsコマンドラインのユーティリティで、フォント検証実行リダイレクション技術を使用してAdministratorコンテキストからカーネルモードコードの読み取り、書き込み、実行を行い、高度なカーネルデバッグとシステムトラブルシューティングを可能にします。
r0ak は、Windows コマンドライン ユーティリティで、管理者特権以外は何も必要とせずに、コマンド プロンプトからカーネルモード コードの読み取り、書き込み、実行(一部制限あり)を簡単に行うことができます。
r0ak v1.0.0 -- Ring 0 Army Knife
http://www.github.com/ionescu007/r0ak
Copyright (c) 2018 Alex Ionescu [@aionescu]
http://www.windows-internals.com
USAGE: r0ak.exe
[--execute <Address | module.ext!function> <Argument>]
[--write <Address | module.ext!function> <Value>]
[--read <Address | module.ext!function> <Size>]

Windows カーネルは、一般的なシステムで何百ものドライバーが実行され、グローバル状態を含む何千もの変数が存在する豊かな環境です。高度なトラブルシューティングのために、IT エキスパートは通常、Windows デバッガー (WinDbg)、SysInternals ツールなどのツールを使用するか、独自のツールを作成します。残念ながら、これらのツールの使用はますます困難になっており、それら自体も Windows API と公開された機能へのアクセスに制限されています。
今日の課題には次のようなものがあります:
このような環境において、カーネル状態を分析することで明らかになる可能性のあるカーネル/システムレベルの問題を緊急の応急処置/ホットフィックスとして迅速にトラブルシューティングできるシンプルなツールが、コミュニティにとって貴重であることは明らかでした。

r0ak は、新しいフォントの読み込みを試みる際に、ウィンドウ マネージャーの信頼されたフォント検証チェックの実行フローをリダイレクトすることで動作します。具体的には、信頼されたフォント テーブルの比較ルーチンを、入力ノードに格納されたエグゼクティブ ワーク アイテム(WORK_QUEUE_ITEM)をスケジュールする代替関数で置き換えます。次に、信頼されたフォント テーブルの右子ノード(ルート ノードとして機能)を、カスタム ワーク アイテムが格納された名前付きパイプの書き込みバッファ(NP_DATA_ENTRY)で上書きします。このアイテムの基となるワーカー関数とそのパラメーターは、フォントの読み込みが試行され、比較ルーチンが実行されると、最終的に専用の ExpWorkerThread によって PASSIVE_LEVEL で実行されます。その際、名前パイプでバックアップされた親ノードを入力として受け取ります。リアルタイムの Event Tracing for Windows (ETW) トレース イベントを使用して、ワーク アイテムの実行完了の非同期通知を受信します。これにより、構造を安全に破棄し、カーネルモード バッファを解放し、通常の動作を復元できます。
--execute オプションを使用する場合、この関数とパラメーターはユーザーが提供します。
--write を使用する場合、カスタム ガジェットを使用して、カーネル メモリ内の任意の場所にある 32 ビット値を変更します。
--read を使用する場合、書き込みガジェットを使用してシステムの HSTI バッファ ポインターとサイズを変更します(注: これは、HSTI データを要求する他のアプリケーションに関しては破壊的な動作です。これはオプションの Windows 動作であり、このツールは緊急デバッグ/実験用であるため、このデータ損失は許容できると見なされました)。次に、HSTI Query API を使用してツールのユーザーモード アドレス空間にコピー バックし、16 進ダンプが表示されます。
組み込みの Microsoft 署名済み Windows 機能のみが使用され、呼び出されるすべての関数は KCFG ビットマップの一部であるため、セキュリティ チェックの違反はなく、デバッグ フラグや不適切に記述されたサードパーティ ドライバーの使用は必要ありません。
いいえ。このツール(およびその基盤となる手法)は、管理者アカウントで実行しているユーザーのみが取得できる SYSTEM レベルの特権トークンを必要とするため、効果を達成するためにセキュリティ境界がバイパスされることはありません。このツールの動作と有用性は、Windows 上の管理者アカウントの昇格/特権セキュリティ コンテキストによってのみ可能であり、設計上の動作として理解されています。
もちろんです!特権境界の違反が発生していないように見えても、セキュリティ問題を常に Microsoft に報告することが重要です。Microsoft の研究者や開発者のチームは、外部の研究者が思いつかなかった新しいベクトルや特定のコードパスに到達する方法を見つける可能性があります。
そのため、2014 年 11 月に Microsoft セキュリティ レスポンス センター (MSRC) にセキュリティ ケースが提出され、次のような回答がありました: 「[…] は、従来のセキュリティ情報発行の手段で対処するセキュリティ問題の範囲には該当しません。これは管理者権限を前提としています。アーキテクチャ上、現在防御可能なセキュリティ境界を定義していない場所です。したがって、修正は追求しません。」
さらに、2015 年 4 月の Infiltrate カンファレンスで、Insection : AWEsomely Exploiting Shared Memory Objects というタイトルの講演でこの問題が詳述され、出席していた Microsoft の開発者も、これは現在 Windows のアーキテクチャ上のセキュリティ境界の範囲外であることに同意しました。これは、管理者が Ring 0 メモリを読み取り/書き込み/実行できる方法が文字通り数十(それ以上)あるためです。このツールは、システム問題のデバッグおよびトラブルシューティングの目的で、そのようなベクトルの 1 つを簡単に利用できるようにするだけです。
このコードをライブラリとしてパッケージ化するには、すべてのインタラクティブなコマンドライン解析と標準出力を注意深く削除する必要があります。その場合、大幅な書き換えなしでは、その「キット」は以下の条件を満たす必要があります:
この特定のアプローチの使用に関心のある攻撃者は、よりクロス互換性が高く、SYSTEM 権限を必要としない他の多くの手法と比較して、おそらく 3 年以上前の 2015 年 4 月の Proof-of-Concept に基づいて独自のコードをすでに適応させているでしょう。
Windows シンボル エンジンを使用するため、Windows ソフトウェア開発キット (SDK) または Windows ドライバー キット (WDK) のいずれかが Debugging Tools for Windows と共にインストールされている必要があります。ツールはインストール パスを自動的に検索し、そのディレクトリにある DbgHelp.dll と SymSrv.dll を利用します。これらのファイルは再配布できないため、ツールのリリースに含めることはできません。
または、これらのライブラリを自分で入手した場合、ソース コードを変更して使用できます。
シンボルの使用には、ローカルに事前キャッシュしていない限り、インターネット接続が必要です。さらに、適切なシンボル サーバーとキャッシュ場所を指すように _NT_SYMBOL_PATH 変数を設定する必要があります。
カーネル メモリの読み取り/書き込み/実行が必要であり(適切なカーネル変数にアクセスする知識がある)IT エキスパートまたはトラブルシューターは、上記のセットアップ要件をすでに熟知しているものと想定されています。SDK とは何か、環境変数の設定方法について質問する issue を提出しないでください。
ntoskrnl.exe!ExFreePool を呼び出して、リークしているカーネル アドレスを渡してみてはどうでしょう?オブジェクト参照は?ntoskrnl.exe!ObfDereferenceObject を呼び出してクリーンアップしましょう。ntoskrnl.exe!KdPrintCircularBuffer の内部循環バッファをダンプしてみてはどうでしょう?ntoskrnl.exe!KeKernelStackSize を見てみましょう。ntoskrnl.exe!KiServiceTable を出力してみましょう。これらはほんの一例です。すべての Ring 0 アドレスは、module!symbol 構文、または既知の場合はカーネル ポインターを直接渡すことで受け入れられます。Windows シンボル エンジンを使用してこれらを検索します。
このツールは、最新バージョンの Windows 10 にのみ存在することが知られている特定のカーネル変数と関数を必要とし、64 ビット システムでのみ動作することを意図しています。これらの制限は、古いシステム(または x86 システム)ではこれらの厳格なセキュリティ要件が存在せず、代わりにより従来のアプローチを使用できるという事実によるものです。これは私が利用できるようにしている個人用ツールであり、代わりに単純なドライバーを使用できた古いシステムは必要ありませんでした。とはいえ、移植に関心のある方がいれば、このリポジトリはプル リクエストを受け付けています。
次に、ユースケースと私のニーズにより、次の制限が適用されます:
明らかに、これらの制限はプログラム的に別のアプローチを選択することで修正できますが、コマンド ライン ツールと私のユースケースのニーズに適合しています。繰り返しますが、他の方が独自の追加機能を提供したい場合は、プル リクエストを受け付けています。
すべての実行(--read および --write コマンドの実行を含む)は、PASSIVE_LEVEL のシステム ワーカー スレッドのコンテキストで発生することに注意してください。したがって、ユーザーモード アドレスをパラメーター/引数として渡さないでください。
プル リクエストは歓迎します。大きな変更については、まず issue を開いて変更内容を議論してください。
Copyright 2018 Alex Ionescu. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided
that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and
the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions
and the following disclaimer in the documentation and/or other materials provided with the
distribution.
THIS SOFTWARE IS PROVIDED BY ALEX IONESCU ``AS IS'' AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ALEX IONESCU
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those of the authors and
should not be interpreted as representing official policies, either expressed or implied, of Alex Ionescu.