CVE-2026-89722 in Linux
要約
〜によって VulDB • 2026年09月12日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
PCI/sysfs: pci_write_legacy_io()における配列外読み込みの修正
pci_write_legacy_io()は、ユーザー空間が実際に書き込んだバイト数に関係なく、kernfsの書き込みバッファから4バイトを読み出します。
if (count != 1 && count != 2 && count != 4) return -EINVAL;
return pci_legacy_write(bus, off, *(u32 *)buf, count);
kernfs_fop_write_iter()はkmalloc(len + 1)でバッファを割り当てるため、legacy_io sysfsファイルへの1バイトの書き込みでは2バイトが割り当てられます。しかし、無条件なu32読み出しにより、割り当てられた領域の末尾から最大2バイト分先を読み出すことになり、これはKASANによってslab-out-of-bounds read(スラブ配列外読み込み)として報告されます。同様に、2バイトの書き込みでは1バイト分過剰に読み出します。
したがって、リクエストされた数のバイトのみを取得し、2バイトおよび4バイトの場合それぞれget_unaligned_le16()とget_unaligned_le32()を使用します。これにより、PCI I/Oポート空間のバイト順序に合わせてバッファをリトルエンディアンとして解釈します。
PowerPC実装では、以前はジェネリックコードによるネイティブエンディアンの32ビット読み出しに対して、1バイトおよび2バイトの場合に値を適切な位置へシフトさせることで補償していました。しかし、このシフト処理はビッグエンディアンのカーネルでのみ正しく動作しました。
リトルエンディアンPowerPC(POWER8以降)では、間違ったバイトが抽出されるため、1バイトの書き込みで要求された値ではなく配列外にあるバイトが書き込まれていました。また、ビッグエンディアン環境でも、ネイティブ読み出しによりout_le16()およびout_le32()がネットワーク上の2バイトおよび4バイトの書き込みにおいてユーザーからのバイト順を逆転させてしまう問題がありました。リトルエンディアンのヘルパー関数はこれらの両方の問題を解決するため、シフト処理は削除されました。
Alphaプラットフォームでは変更は不要です。
legacy_ioファイルはroot専用であり、HAVE_PCI_LEGACYを定義する2つのアーキテクチャであるAlphaおよびPowerPCでのみ存在します。
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.