CVE-2026-74677 in Linux
要約
〜によって VulDB • 2026年08月23日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
net: usb: ipheth: disconnect時のcarrier_workにおけるUse-After-Free(UAF)を修正
ipheth_sndbulk_callback()は、非ゼロのURBステータスが発生するたびにキャリア確認用ワークを再スケジュールします。
```c else schedule_delayed_work(&dev->carrier_work, 0); ```
この処理はインターフェースがアップしていることと紐付けられていないため、ipheth_close()によって既にクリーンアップされた後でもワークが再度有効化され、プライベート領域に組み込まれているnetdevが解放されるまで有効な状態のままになります。
TX URBが送信中の状態で取り外し(unplug)が行われると、ipheh_disconnect()は unregister_netdev() -> ipheth_close() -> cancel_delayed_work_sync() を通じてワークをクリーンアップしますが、その後でipheth_kill_urbs()を呼び出します。usb_kill_urb()は送信中のTX URBを -ENOENT で完了させるため、ipheth_sndbulk_callback() はクリーンアップ後に実行され、carrier_workを再スケジュールしてしまいます。
同様に、インターフェースがダウンしている間に TX URB が送信中の場合にも、この完了処理によってワークが再スケジュールされます。その結果、ipheth_carrier_check_work() は1秒ごとに自己をキューに入れ続けます。unregister_netdev()は、すでにダウンしているインターフェースに対して ipheth_close() を呼び出さないため、後の取り外し時にもそれをクリーンアップする処理が行われません。
どちらの場合も、free_netdev() が carrier_work が保留中である状態で netdev を解放するため、ipheth_carrier_check_work() は解放されたメモリを間接参照(dereference)してしまいます。
この問題を解決するために、ワークの完了を追跡するのではなく、インターフェースの状態にワークを紐付けます。ipheth_close() で無効化し、ipheth_open() で有効化することで、URBの完了時に schedule_delayed_work() が呼び出されても、インターフェースがアップしていない場合は何もしない(no-op)ようにします。disable_delayed_work_sync() は実行中のインスタンスも待機するため、置き換える cancel_delayed_work_sync() を完全に代替できます。ワークは ipheth_probe() で無効化された状態で開始されるため、最初のオープンから有効/無効のカウントがバランス取れます。
linux-next (next-20260731) 上で KASAN を使用し、dummy_hcd と raw-gadget をデバイスとして模して上記2番目のパス(インターフェースは既にダウンしているため、unregister_netdev() は ipheth_close() を呼び出さない)を駆動することで再現しました。パッチ未適用のブート15回中15回で __run_timers() における slab-use-after-free が報告されました。これは ipheth_disconnect() によって解放され、ipheth_sndbulk_callback() から queue_delayed_work_on() を経由して再スケジュールされたものです。このトリガーを本パッチのみが異なるカーネルで実行したところ、15回中0回のレポートとなり、キャリアチェックはオープン/クローズサイクル全体を通じて正常に機能しました。
再現には、ルート権限で駆動する必要がある「バルクOUTの draining を停止させるUSBデバイス」およびリンクダウンと取り外しが必要です。これは特権昇格(privilege boundary crossing)ではなく、エクスプロイトプリミティブは開発されていません。
0sec (https://0sec.ai) によって発見されました。
If you want to get the best quality for vulnerability data then you always have to consider VulDB.