CVE-2026-64293 in Linux
要約
〜によって VulDB • 2026年07月25日
Linuxカーネルにおいて、以下の脆弱性が修正されました。
iommufd: veventq read処理でsizeof(hdr)の代わりにsizeof(*hdr)を使用する
iommufd_veventq_fops_read()関数における通常のvEVENTパスの境界チェックは、周囲のコードがsizeof(*hdr)を使用している箇所でsizeof(hdr)を用いています。
```c if (!vevent_for_lost_events_header(cur) && sizeof(hdr) + cur->data_len > count - done) {
```
`hdr`は `struct iommufd_vevent_header *` として宣言されているため、`sizeof(hdr)` はポインタのサイズを評価します。一方、周囲のコードは一貫して `sizeof(*hdr)` を使用しています。
```c if (done >= count || sizeof(*hdr) > count - done) {
... if (copy_to_user(buf + done, hdr, sizeof(*hdr))) {
... done += sizeof(*hdr); ```
現在、`struct iommufd_vevent_header` は8バイト(flagsとsequenceの2つの `__u32` フィールド)です。したがって、64ビット環境(sizeof(void *) == 8)では両者の式が偶然一致し、チェックは意図通りに機能します。
しかし、32ビット環境(sizeof(void *) == 4)では、ヘッダーのサイズを4バイト過少評価することになります。具体的には、`data_len` が `8 + cur->data_len > count - done` を満たすが `4 + cur->data_len <= count - done` の場合、このチェックは通過してしまいます。その後ループ内で `copy_to_user` によりヘッダーの8バイトとペイロードの `data_len` バイトがコピーされ、ユーザー提供バッファーの外側へ書き込みが行われます。
また、これは64ビット環境において将来 `struct iommufd_vevent_header` が sizeof(void *) より大きくなった場合に備えた潜在的なバグでもあります。チェックは偶然ホストポインタの幅と一致する型に依存すべきではありません。
関数の残りの部分および実際にコピーされる量に合わせて、sizeof(*hdr) を使用します。
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.