
Gigabyte gdrv3.sysのIOCTLを悪用し、チェックされていない物理メモリ読み取りを通じてSYSTEMトークンをユーザープロセスに書き込むローカル権限昇格の概念実証。
ハッカー諸君。
gdrv3.sys は Gigabyte App Center と EasyTune に同梱されている署名済みカーネルドライバーだ。これはセキュリティ記述子なしで \.\GIOV3 を作成するため、ローカルユーザーなら誰でも管理者権限も UAC もなしに開くことができる。その IOCTL のうち2つが全ての話だ。
最初のもの(0xC3502019)は物理メモリを読み取ると称している。物理アドレス、長さ、出力ポインタを渡すと、そこにバイト列をコピーする。問題は出力ポインタだ。ドライバーはそれがユーザー空間であることを一切チェックしない。ProbeForWrite も境界チェックも何もない。つまり「読み取り」は実際には write-what-where であり、答えをどこに着地させるかを自分で選ぶだけだ。物理メモリから SYSTEM プロセスのトークンを読み取り、出力を自分の EPROCESS トークンフィールドに直接向ける。ドライバーが SYSTEM トークンをあなたのプロセスに書き込んでくれる。
これがエクスプロイトの全てだ。メモリ破壊もなく、カーネルモードのシェルコードもない。SMEP、SMAP、KVAS、CET、CFG は一切関係ない。CPL0 で本来実行されるべきでないものが動くわけではないからだ。データのみであり、毎回成功した。2つ目の IOCTL ペア(0xC3502584 読み取り、0xC3502580 書き込み)は古典的なものだ。任意の MSR で、インデックスのホワイトリストがない。IA32_LSTAR を読むだけでそれ自体が KASLR を破壊し、書き込めば syscall エントリをハイジャックする。SMEP/SMAP の回避が必要なので副次的な経路として残したが、それ単体でも危険だ。
通常のユーザーアカウントからビルドして実行する:
gcc -O2 -o poc.exe poc.c -lpsapi
poc.exe
Windows 10 x64 22H2(ビルド 19045)でテスト済み。このドライバーは Gigabyte App Center に同梱されているため、多くの Gigabyte マザーボードではすでにロードされている。
2026年6月に Gigabyte へ報告し、修正された。新しいビルドではデバイスに SDDL が設定されて管理者のみに制限され、MSR 書き込みにホワイトリストが追加されている。現在の gdrv3 はこの方法ではもはや悪用できない。
