LinuxのLinux Kernelにおける整数オーバーフローの脆弱性
タイトル LinuxのLinux Kernelにおける整数オーバーフローの脆弱性
概要

Linuxカーネルにおいて、以下の脆弱性が修正されました:net: stmmac: チェーンモードにおける整数アンダーフローの修正です。jumbo_frm()のチェーンモード実装は無条件にlen = nopaged_len - bmax;を計算しています。ここで、nopaged_lenはskb_headlen(skb)(線形バイトのみ)を指し、bmaxはBUF_SIZE_8KiBまたはBUF_SIZE_2KiBです。しかし、呼び出し元のstmmac_xmit()はskb-len(ページフラグメントを含む全長)に基づきjumbo_frm()を呼び出すかどうかを決定しています:is_jumbo = stmmac_is_jumbo_frm(priv, skb-len, enh_desc); パケットの線形部分が小さい(nopaged_len = bmax)がページフラグメントにより全長が大きい場合(skb-len bmax)、引き算は符号なし整数でラップアラウンドし巨大なlen値(約0xFFFFxxxx)となります。これによりwhile (len != 0)ループが数十万回実行され、skb-data + bmax * iのポインタがskbバッファを大幅に超えてdma_map_single()に渡されます。IOMMU非搭載のSoC(stmmacの典型的な展開環境)では、これは任意のカーネルメモリをDMAエンジンにマップすることになり、カーネルメモリの情報漏洩およびハードウェアからの潜在的なメモリ破損を引き起こします。この問題はbuf_lenというローカル変数を導入し、min(nopaged_len, bmax)に制限することで修正しました。これによりlen = nopaged_len - buf_lenの計算は常に安全となります。線形部分が単一ディスクリプタに収まる場合はlenが0となり、while (len != 0)ループは自然にスキップされ、その後stmmac_xmit()内のフラグメントループがページフラグメントを処理します。

想定される影響 当該ソフトウェアが扱う全ての情報が外部に漏れる可能性があります。 また、当該ソフトウェアが扱う全ての情報が書き換えられる可能性があります。 さらに、当該ソフトウェアが完全に停止する可能性があります。 そして、この脆弱性を悪用した攻撃の影響は、他のソフトウェアには及びません。 
対策

リリース情報、またはパッチ情報が公開されています。参考情報を参照して適切な対策を実施してください。

公表日 2026年4月24日0:00
登録日 2026年4月30日12:32
最終更新日 2026年4月30日12:32
CVSS3.0 : 緊急
スコア 9.8
ベクター CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
影響を受けるシステム
Linux
Linux Kernel 3.2
Linux Kernel 3.2.1 以上 5.10.253 未満
Linux Kernel 5.11 以上 5.15.203 未満
Linux Kernel 5.16 以上 6.1.169 未満
Linux Kernel 6.13 以上 6.18.23 未満
Linux Kernel 6.19 以上 6.19.13 未満
Linux Kernel 6.2 以上 6.6.135 未満
Linux Kernel 6.7 以上 6.12.82 未満
Linux Kernel 7.0
CVE (情報セキュリティ 共通脆弱性識別子)
CWE (共通脆弱性タイプ一覧)
その他
変更履歴
No 変更内容 変更日
1 [2026年04月30日]
  掲載
2026年4月30日12:32

NVD脆弱性情報
CVE-2026-31649
概要

In the Linux kernel, the following vulnerability has been resolved:

net: stmmac: fix integer underflow in chain mode

The jumbo_frm() chain-mode implementation unconditionally computes

len = nopaged_len - bmax;

where nopaged_len = skb_headlen(skb) (linear bytes only) and bmax is
BUF_SIZE_8KiB or BUF_SIZE_2KiB. However, the caller stmmac_xmit()
decides to invoke jumbo_frm() based on skb->len (total length including
page fragments):

is_jumbo = stmmac_is_jumbo_frm(priv, skb->len, enh_desc);

When a packet has a small linear portion (nopaged_len <= bmax) but a
large total length due to page fragments (skb->len > bmax), the
subtraction wraps as an unsigned integer, producing a huge len value
(~0xFFFFxxxx). This causes the while (len != 0) loop to execute
hundreds of thousands of iterations, passing skb->data + bmax * i
pointers far beyond the skb buffer to dma_map_single(). On IOMMU-less
SoCs (the typical deployment for stmmac), this maps arbitrary kernel
memory to the DMA engine, constituting a kernel memory disclosure and
potential memory corruption from hardware.

Fix this by introducing a buf_len local variable clamped to
min(nopaged_len, bmax). Computing len = nopaged_len - buf_len is then
always safe: it is zero when the linear portion fits within a single
descriptor, causing the while (len != 0) loop to be skipped naturally,
and the fragment loop in stmmac_xmit() handles page fragments afterward.

公表日 2026年4月25日0:16
登録日 2026年4月25日4:08
最終更新日 2026年4月28日0:16
関連情報、対策とツール
共通脆弱性一覧