LinuxのLinux KernelにおけるNULL ポインタデリファレンスに関する脆弱性
タイトル LinuxのLinux KernelにおけるNULL ポインタデリファレンスに関する脆弱性
概要

Linuxカーネルにおいて、以下の脆弱性が修正されました: can: gs_usb: タイムスタンプカウンタの初期化の修正です。gs_usbデバイスドライバがインターフェースの停止前にアンロード(またはバインド解除)されると、USBスタックは最初にstruct usb_driver::disconnectを呼び出し、その後struct net_device_ops::ndo_stopコールバックを呼び出します。gs_usb_disconnect()では、すべての保留中のバルクURBが終了されます。つまり、USBデバイスからホストへ受信されたCANフレームは送信されなくなります。その後、gs_can_close()によって各CANチャネルにリセット制御メッセージが送信され、コントローラがCANバスから除去されます。この競合状態の間に、USBデバイスは依然としてCANフレームをバスから受信して内部的にキューイングし、ホストへ送信しようとします。現行のcandlelightファームウェアの少なくとも現バージョンでは、リセットコマンド中に受信したCANフレームのキューは空になりません。gs_usbドライバのロード(またはバインド)後に、struct net_device_ops::ndo_openコールバックで新しいURBが送信され、candlelightファームウェアは既にキューにあるCANフレームの送信をホストへ開始します。しかし、このシナリオはハードウェアタイムスタンプ機能の実装時には考慮されていませんでした。サイクルカウンタおよびタイムカウンタのインフラはUSBのURB送信後(gs_usb_timestamp_init())にセットアップされるため、timecounter_cyc2time()(呼び出し経路: gs_usb_receive_bulk_callback() - gs_usb_set_timestamp() - gs_usb_skb_set_timestamp())が早すぎるタイミングで呼ばれるとNULLポインターデリファレンスが発生します。この問題を修正するために、gs_usb_timestamp_init()をURB送信前に移動しました。包括的な解決策として、複数チャネルを持つgs_usbデバイスを考慮する必要があります。サイクルカウンタおよびタイムカウンタのインフラはチャネル単位でセットアップされますが、RX URBはデバイス単位です。一つのチャネルのgs_can_open()が呼ばれてURBが送信されると、gs_usb_receive_bulk_callback()は全チャネル(まだ動作していないチャネルも含む)で呼ばれる可能性があります。サイクルカウンタおよびタイムカウンタがセットアップされていないため、再びNULLポインターデリファレンスが発生します。サイクルカウンタおよびタイムカウンタの機能を「チャネル単位」から「デバイス単位」に変更し、URB送信前にセットアップします。さらにgs_usb_receive_bulk_callback()内では、開始されていないCANチャネルのURBは処理せず、単にURBを再送信するだけに変更しました。

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

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

公表日 2025年10月1日0:00
登録日 2026年1月28日12:39
最終更新日 2026年1月28日12:39
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.1 以上 6.4.7 未満
Linux Kernel 6.5
CVE (情報セキュリティ 共通脆弱性識別子)
CWE (共通脆弱性タイプ一覧)
その他
変更履歴
No 変更内容 変更日
1 [2026年01月28日]
  掲載
2026年1月28日12:39