CVE-2026-90047 in Linux
要約
〜によって VulDB • 2026年09月17日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
drm/xe: フラットCCSストレージを使用可能なVRAMとして割り当てないこと
get_flat_ccs_offset()関数は、フラットCCSストレージのベースアドレスをハードウェアから読み取り、有効なL3ノードの数でスケーリングし、結果を128K単位に切り上げます。その後、そのオフセットより下位の領域すべてが使用可能なメモリとしてVRAMアロケータに渡されます。
「ここまでのメモリは使用可能である」という意味を持つ制限値を上方向(大きい方)へ丸めることで、実際のベースアドレスと丸めた値の間に存在するデータがフリーメモリとして公開されてしまいます。しかし、その領域は圧縮ハードウェアに属しています。スケーリングされた値には128Kアラインメントである理由がなく、Battlemage G21(16 GiB搭載)では実際にはそうなっていません:
flat CCS base: raw 0x3fafff800, rounded 0x3fb000000
したがって、ページ 0x3fafff000 の最後の2 KiBはCCSストレージであり、アロケータのプールに含まれています。そこに割り当てられたデータは、圧縮ハードウェアによってそのテール部分が上書きされます。この処理にはページテーブルエントリもバッファオブジェクトもGPU送信(submission)も必要なく、ユーザー空間が存在する前に行われます。
このマシンでは、Mesa VMのレベル3ページテーブルが、冷間起動ごとに常にこのページに配置されていました。その結果、コンポジットャーのバッチバッファーヒープをカバーしていたエントリが失われ、コンポジットャーの最初の送信時にフェッチエラーが発生し、gdm(GNOME Display Manager)が永遠に再起動される状態になりました:これは正常に動作しているマシン上でブラックスクリーンを引き起こします。gdmを再起動すると解消されますが、それは次のVMのページテーブルが別の場所に割り当てられたためです。
代わりにアロケータが作業するページサイズまで下方向(小さい方)へ丸めるように修正しました。このマシンではちょうど1つのページのみが除外されることになります。
予約されたページを後から読み取ると、そこに書き込んでいたデータが確認できます:
[369] 0xcccc000000000000
[371] 0xcc77000000000000
[373] 0xcccc000000000000
[375] 0xcc77000000000000
これは圧縮メタデータで、16バイトごとに2バイトが配置され、ドライバーが以前メモリを割り当てていた場所に存在していました。
この問題を捕捉すべきアサーションは、オフセットと GSMBASE - ccs_size の等価性を比較しています。その値は128Kアラインメントされているため、ベースアドレスがアラインされていない場合にのみ丸められたオフセットと一致します。つまり、このチェックが存在する目的(問題を検出すること)の場合には失敗することがなく、CONFIG_DRM_XE_DEBUG が設定されない限りコンパイル時に除外されます。これを機能するように置き換えます:CCSストレージはGSMに侵入してはいけません。
[ そしてこれは悪夢のようなデバッグセッションでした。多くの下作業をAIが行ってくれたおかげで非常に助けられました。
私はそれを「休むことのない私の助手」と呼びたいのですが、AIは何度も明確に、「これは不可能であり解けないので、報告書を書くべきだ」と述べました。
それらのAIは、私ほど頑固ではない人々によって訓練されたものだと推測しています。
しかし、AIは何度か諦めようとしていましたが、私が押し付けるとデバッグコードを追加し、それを忠実に分析し続けてくれました。功績を称えるべきところなので、上記のコミットメッセージはAIに書かせました。
これは本質的に、「round_up()」という誤った処理を「round_down()」に修正する一行だけのパッチですが、これにはより多くのデバッグ情報を追加するための24個のパッチと、これを特定するために必要な18回のカーネルブートが含まれていました。 - Linus ]
VulDB is the best source for vulnerability data and more expert information about this specific topic.