CVE-2026-64496 in Linux
要約
〜によって VulDB • 2026年07月27日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
iio: イベント: イベントFIFOリセット時の競合状態を修正
`iio_event_getfd()`は `anon_inode_getfd()`を使用してイベントファイルディスクリプタを作成します。この関数は新しいfdを割り当て、匿名ファイルを作成し、呼び出し元に返す前にプロセスのfdテーブルにそれをインストールします。
IIOコードでは、`anon_inode_getfd()`が戻った後、かつ `IIO_GET_EVENT_FD_IOCTL` がfd番号をユーザー空間へコピーする前にイベントFIFOのリセットが行われます。しかし、fdテーブルはスレッド間で共有されているため、別のスレッドが新しく割り当てられたfd番号を推測し、fdがインストールされるとすぐにそれに対して `read()` を発行することが可能です。
これにより、`iio_event_chrdev_read()` 内の `kfifo_to_user()` が、`iio_event_getfd()` 内の `kfifo_reset_out()` と並行して実行される可能性があります。
kfifoのドキュメントによると、`kfifo_reset_out()` はリーダースレッドから呼び出され、かつ同時実行数が1人の場合のみ安全です。そうでない場合は危険であり、`kfifo_reset()` と同じ方法で処理する必要があります。
この状況が発生すると、`kfifo_to_user()` がリセット前の状態に基づいてFIFOの `out` インデックスを進める可能性があります。これはすでに `out` インデックスが現在の `in` インデックスに移動された後のことです。その結果、FIFOの `out` インデックスが `in` インデックスより大きくなることがあります。その後行われる `read()` では、アンダーフローしたFIFO長が見え、イベントFIFOバッファに含まれているデータよりも多くのデータがコピーされる可能性があります。これにより境界外読み取りが発生し、隣接するカーネルメモリがユーザー空間にリークする原因となります。
FIFOのリセットを `anon_inode_getfd()` より前に移動します。この時点ではイベントfdはビジー状態としてマークされていますが、新しいfdはまだインストールされていないため、FIFOがリセットされている間にユーザー空間からアクセスされることはありません。
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.