製品・ソフトウェアに関する情報
LinuxのLinux Kernelにおける境界外読み取りに関する脆弱性
Title LinuxのLinux Kernelにおける境界外読み取りに関する脆弱性
Summary

Linuxカーネルにおいて、以下の脆弱性が修正されました。ALSAのcaiaqでのinit_card関数におけるスタックの境界外読み取りの問題です。このループはカードの短縮名から空白を除去したコピーを作成しますが、境界チェックに`len sizeof(card-id)`を使用していました。sizeof(card-id)は16であり、ローカルのidバッファも16バイトです。そのため、16文字の空白以外の文字を書き込むとバッファ全体が埋まり、終端のヌルバイトが上書きされてしまいます。その後、このヌル終端されていない文字列がsnd_card_set_id()からcopy_valid_id_string()に渡されると、`while (*nid && ...)`のループによりスタックバッファの終端を越えて読み取り、スタックの内容を読み出してしまいます。多くの非ASCIIかつ非空白文字(例えばマルチバイトUTF-8)を含む製品名のUSBデバイスでは、以下のように確実にこの問題が発生します。BUG: KASAN: stack-out-of-bounds in copy_valid_id_string sound/core/init.c:696 [inline] BUG: KASAN: stack-out-of-bounds in snd_card_set_id_no_lock+0x698/0x74c sound/core/init.c:718。オフバイワン問題は2009年6月(v2.6.31-rc1)のコミットbafeee5b1f8d("ALSA: snd_usb_caiaq: give better shortname")以来存在していました。この空白除去ループを最初に導入したコードは、コピーの際にヌル終端文字を考慮していませんでした。本問題はループの境界値を`sizeof(card-id) - 1`に変更し、少なくとも1バイトをヌル終端のために確保することで修正されました。

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

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

Publication Date May 1, 2026, midnight
Registration Date May 13, 2026, 10:25 a.m.
Last Update May 13, 2026, 10:25 a.m.
CVSS3.0 : 重要
Score 7.1
Vector CVSS:3.0/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:H
Affected System
Linux
Linux Kernel 2.6.31 以上 5.10.253 未満
Linux Kernel 5.11 以上 5.15.203 未満
Linux Kernel 5.16 以上 6.1.168 未満
Linux Kernel 6.13 以上 6.18.22 未満
Linux Kernel 6.19 以上 6.19.12 未満
Linux Kernel 6.2 以上 6.6.134 未満
Linux Kernel 6.7 以上 6.12.81 未満
Linux Kernel 7.0
CVE (情報セキュリティ 共通脆弱性識別子)
CWE (共通脆弱性タイプ一覧)
その他
Change Log
No Changed Details Date of change
1 [2026年05月13日]
  掲載
May 13, 2026, 10:25 a.m.

NVD Vulnerability Information
CVE-2026-31778
Summary

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

ALSA: caiaq: fix stack out-of-bounds read in init_card

The loop creates a whitespace-stripped copy of the card shortname
where `len < sizeof(card->id)` is used for the bounds check. Since
sizeof(card->id) is 16 and the local id buffer is also 16 bytes,
writing 16 non-space characters fills the entire buffer,
overwriting the terminating nullbyte.

When this non-null-terminated string is later passed to
snd_card_set_id() -> copy_valid_id_string(), the function scans
forward with `while (*nid && ...)` and reads past the end of the
stack buffer, reading the contents of the stack.

A USB device with a product name containing many non-ASCII, non-space
characters (e.g. multibyte UTF-8) will reliably trigger this as follows:

BUG: KASAN: stack-out-of-bounds in copy_valid_id_string
sound/core/init.c:696 [inline]
BUG: KASAN: stack-out-of-bounds in snd_card_set_id_no_lock+0x698/0x74c
sound/core/init.c:718

The off-by-one has been present since commit bafeee5b1f8d ("ALSA:
snd_usb_caiaq: give better shortname") from June 2009 (v2.6.31-rc1),
which first introduced this whitespace-stripping loop. The original
code never accounted for the null terminator when bounding the copy.

Fix this by changing the loop bound to `sizeof(card->id) - 1`,
ensuring at least one byte remains as the null terminator.

Publication Date May 2, 2026, 12:16 a.m.
Registration Date May 2, 2026, 4:07 a.m.
Last Update May 2, 2026, 12:24 a.m.
Related information, measures and tools
Common Vulnerabilities List