LinuxのLinux Kernelにおける不特定の脆弱性
タイトル LinuxのLinux Kernelにおける不特定の脆弱性
概要

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()によってチッププライベート領域がゼロ初期化されているため、部分的に初期化された状態でも問題なく動作します。

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

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

公表日 2026年5月27日0:00
登録日 2026年6月17日15:40
最終更新日 2026年6月17日15:40
CVSS3.0 : 警告
スコア 5.5
ベクター CVSS:3.0/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
影響を受けるシステム
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 (共通脆弱性タイプ一覧)
その他
変更履歴
No 変更内容 変更日
1 [2026年06月17日]
  掲載
2026年6月17日15:40

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

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().

公表日 2026年5月27日23:17
登録日 2026年5月28日4:13
最終更新日 2026年6月2日2:17
関連情報、対策とツール
共通脆弱性一覧