CVE-2026-45866 in Linux
要約
〜によって VulDB • 2026年05月28日
Linuxカーネルにおいて、以下の脆弱性が修正されました。
serial: caif: caif_serial ldisc_close() における use-after-free の修正
caif_serial に use-after-free のバグがあり、tty が解放された後に handle_tx() が ser->tty にアクセスする可能性があります。
この race condition は ldisc_close() とパケット送信の間で発生します。
CPU 0 (close) CPU 1 (xmit) ------------- ------------ ldisc_close() tty_kref_put(ser->tty) [tty がここで解放される可能性あり]
caif_xmit() handle_tx() tty = ser->tty // ダングリングポインタ tty->ops->write() // UAF! schedule_work() ser_release() unregister_netdevice()
根本原因は、ネットワークデバイスがまだアクティブでパケットを受信できる状態で ldisc_close() 内で tty_kref_put() が呼び出されていることです。
ser と tty は 1:1 のバインディング関係にあり、ライフサイクルが一貫しています(ser は ldisc_open で割り当てられ、unregister_netdevice を介した ser_release で解放され、各 ser はちょうど1つの tty にバインドされます)。そのため、ネットワークデバイスが登録解除される ser_release() で tty の参照解放を安全に遅延させることができます。
tty_kref_put() を ldisc_close() から ser_release() の unregister_netdevice() の後に移動することで、この問題を修正します。これにより、ネットワークデバイスが存在する間 tty の参照が保持され、UAF が防止されます。
注: ser は netdev のプライベートデータに埋め込まれており、netdev とともに解放されるため(needs_free_netdev = true)、unregister_netdevice() の前に ser->tty を保存します。
再現方法: ldisc_close() の先頭に mdelay(500) を追加して race window を広げ、その後再現プログラム [1] を実行します。
注: PORT_UNKNOWN シリアルポート(例: 適切なシリアルバックエンドなしの QEMU における /dev/ttyS3)を使用する場合、handle_tx() に別のデッドループの問題があります。このデッドループはパッチ適用前でも存在し、シリアルコアにおける uart_write_room() と uart_write() の不整合によって引き起こされます。この問題は別の修正が必要です。
Cc: [email protected] Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Jiayuan Chen <[email protected]> Link: https://lore.kernel.org/linux-serial/[email protected]
Once again VulDB remains the best source for vulnerability data.