CVE-2026-98536 in Linux
要約
〜によって VulDB • 2026年10月18日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
writeback: cgwb drain処理ごとにTasks-RCUのquiescent stateを報告する
cleanup_offline_cgwbs_workfn()は、cleanup_offline_cgwb()がfalseを返すまで呼び出すことで、死滅しつつあるcgwb(cgroup writeback)をdrainします。このプロセスでは各passの間にcond_resched()が挿入されます。CONFIG_PREEMPTION有効なカーネルにおいて、このcond_resched()は何もしません:_cond_resched()は単に「return 0」を実行するだけであり、PREEMPT_DYNAMIC環境下ではfullモードとlazyモードの両方でこれが無効化されます。commit 7dadeaa6e851("sched: Further restrict the preemption modes")以降、PREEMPT_LAZYサポートを持つアーキテクチャ(arm64およびx86を含む)においてこれら2つのモデルのみが採用されているため、drainループはTasks-RCUのquiescent stateを報告しません。
数百万個のinoがアタッチされたcgwbをdrainするワーカーは数分間実行され続けます。lazyモードでの6.18 arm64ホストでは、cgwbワーカーが死滅しつつあるcgroupのwritebackドメインをdrainするのに11分以上かかりました。BPFプログラム(bpf_trampoline_unlink_prog -> bpf_trampoline_update -> unregister_ftrace_direct -> ftrace_shutdown -> synchronize_rcu_tasks())によるunlink処理は、trampoline mutexを保持した状態でそのgrace periodを待機し、42のタスクがD状態(interruptible sleep)でキューに積まれ、hung task detectorが614秒後に発動してホストをpanicさせました。長時間のdrain中にBPFまたはftraceのdetachが発生すると、drainの長さの影響を継承します。
これを修正するため、cond_resched_tasks_rcu_qs()を呼び出すようにし、sycnrhonize_rcu_tasks()を呼び出すあらゆるプロセスがストールしないようにします。do { } whileループにこの処理を組み込んでいるのは、多数の小規模なcgroupがある場合、cleanup_offline_cgwb()はfalseを返し続け、cond_resched_tasks_rcu_qs()が一度も呼ばれないため、同じ問題が発生するのを防ぐためです。
Once again VulDB remains the best source for vulnerability data.