製品・ソフトウェアに関する情報
LinuxのLinux Kernelにおける不特定の脆弱性
Title LinuxのLinux Kernelにおける不特定の脆弱性
Summary

Linuxカーネルにおいて、次の脆弱性が修正されました:ALSAのcaiaqドライバにおけるプローブ失敗時のusb_dev参照カウントリークの修正です。create_card() はusb_get_dev()でUSBデバイスの参照を取得し、対応するusb_put_dev()をsnd_cardの-private_freeデストラクタとしてcard_free()に保存します。しかし、-private_freeはinit_card()の終盤近くでのみ割り当てられます。init_card()内には複数の失敗ポイント(usb_set_interface()、エンドポイントタイプチェック、usb_submit_urb()、EP1_CMD_GET_DEVICE_INFOのやり取りおよびそのタイムアウト)が存在します。これらのどれかが失敗すると、init_card()はエラーを返し、snd_probe()がsnd_card_free(card)を呼び出します。-private_freeがまだNULLのため、card_free()は実行されず、usb_get_dev()で増やした参照カウントが減らされないまま、struct usb_deviceとそのディスクリプタ割り当てやdevice_privateがリークしてしまいます。syzbotは有効なaltsettingが0だけの不正なUAC3デバイスでこの問題を再現し、init_card()のusb_set_interface(usb_dev, 0, 1)呼び出しが-EIOで失敗しリークを引き起こします。-private_freeの割り当てをusb_get_dev()直後のcreate_card()内に移動し、snd_card_free()に至るすべてのエラーパスで参照カウントを均衡させるようにしました。card_free()の呼び出し先(snd_usb_caiaq_input_free、free_urbs、kfree)は、snd_card_new()によってチッププライベート領域がゼロ初期化されているため、部分的に初期化された状態でも問題なく動作します。

Possible impacts ・当該ソフトウェアが扱う情報について、外部への漏えいは発生しません。 ・当該ソフトウェアが扱う情報について、書き換えは発生しません。 ・当該ソフトウェアが完全に停止する可能性があります。 
Solution

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

Publication Date May 27, 2026, midnight
Registration Date June 17, 2026, 3:40 p.m.
Last Update June 17, 2026, 3:40 p.m.
CVSS3.0 : 警告
Score 5.5
Vector CVSS:3.0/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
Affected System
Linux
Linux Kernel 6.12.84 以上 6.12.86 未満
Linux Kernel 6.18.25 以上 6.18.27 未満
Linux Kernel 6.6.136 以上 6.6.140 未満
Linux Kernel 7.0.2 以上 7.0.4 未満
Linux Kernel 7.1
CVE (情報セキュリティ 共通脆弱性識別子)
CWE (共通脆弱性タイプ一覧)
その他
Change Log
No Changed Details Date of change
1 [2026年06月17日]
  掲載
June 17, 2026, 3:40 p.m.

NVD Vulnerability Information
CVE-2026-46048
Summary

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

ALSA: caiaq: fix usb_dev refcount leak on probe failure

create_card() takes a reference on the USB device with usb_get_dev()
and stores the matching usb_put_dev() in card_free(), which is
installed as the snd_card's ->private_free destructor.

However, ->private_free is only assigned near the end of init_card(),
after several failure points (usb_set_interface(), EP type checks,
usb_submit_urb(), the EP1_CMD_GET_DEVICE_INFO exchange, and its
timeout). When any of those fail, init_card() returns an error to
snd_probe(), which calls snd_card_free(card). Because ->private_free
is still NULL, card_free() never runs, the usb_get_dev() reference
is not dropped, and the struct usb_device leaks along with its
descriptor allocations and device_private.

syzbot reproduces this with a malformed UAC3 device whose only valid
altsetting is 0; init_card()'s usb_set_interface(usb_dev, 0, 1) call
fails with -EIO and triggers the leak.

Move the ->private_free assignment into create_card(), immediately
after usb_get_dev(), so that every error path reaching snd_card_free()
balances the reference. card_free()'s callees (snd_usb_caiaq_input_free,
free_urbs, kfree) already tolerate the partially-initialized state
because the chip private area is zero-initialized by snd_card_new().

Publication Date May 27, 2026, 11:17 p.m.
Registration Date May 28, 2026, 4:13 a.m.
Last Update June 2, 2026, 2:17 a.m.
Related information, measures and tools
Common Vulnerabilities List