CVE-2026-64374 in Linux
要約
〜によって VulDB • 2026年07月25日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
sched/rt: 非PREEMPT_RT環境ではRT_PUSH_IPIをデフォルトで無効にする
RT(リアルタイム)マイグレーションは積極的に行われます。あるCPUが優先度の高いRTタスクから低い優先度のタスクにスケジューリングアウトする場合、そのCPUが次に実行しようとしているタスクよりも高い優先度を持つ他のCPU上で待機中のRTタスクがないかを確認します。もしそのようなタスクが見つかった場合、それを現在のCPUへプル(引き寄せ)て実行させます。
通常、このプルの処理は「RTオーバーロードマスク (rto)」を参照して行われます。これには、現在高い優先度のRTタスクが実行中であり、他のRTタスクが待機しているスケジューリングドメイン内の全CPUが含まれます。低い優先度タスクのスケジュールを行おうとするCPUは、オーバーロード状態にあるCPUの実行キュー (runqueue) ロックを取得し、そのCPUからRTタスクをローカルな実行キューへ移動させて、高い優先度のRTタスクを実行させます。
しかし、多数のCPUが同時に低い優先度タスクへのスケジューリングを行うと問題が発生しました。これらはすべて、オーバーロード状態にあるRTタスクを持つCPUの実行キューロックを取得しようと競合します。最初にロックを獲得したCPUのみがそのタスクを引き受けます。他のすべてのCPUは実行キューロックを取得するまで待機し、プルすべきものがなくなると何もしません。多数のCPUを搭載したシステムでは、これにより大きなレイテンシ(最大500us)が発生し、PREEMPT_RTが目指す要件を超えていました。
この問題に対する解決策として、RT_PUSH_IPIロジックが作成されました。あるCPUがタスクをプルしようとする際、オーバーロード状態にあるCPUの実行キューロックを取得する代わりに、まずそのCPUへIPI(Inter-Processor Interrupt)を送信します。そして、待機中のRTタスクを持つCPUはプルの処理を実行し始めます。その後、ハンドラはその次のオーバーロード状態のRTタスクを持つCPUへIPIを送信し、同様のプロセスを繰り返します。なお、最初のCPUがこのプロセスを開始した後、他のCPUがプルを行おうとしても、すでにプロセスが始まっていることを検知し、IPIの継続のためにカウンターを増加させるだけです。
このRT_PUSH_IPIはPREEMPT_RTにおけるレイテンシ問題を解決しましたが、非PREEMPT_RT環境では新たな問題を引き起こす可能性があります。具体的には、PREEMPT_RT上ではsoftirqがスレッドコンテキストで実行されますが、非RT環境では割り込みコンテキストで実行されるためです。
複数のRTタスクを直前にウェイクアップしたCPUへIPIが届き、現在のCPUが非RTまたは低優先度のRTタスクを実行している場合、プルの処理を行う代わりに、そのCPU上で単純にスケジューリングが行われます。しかし、もしこのCPUでsoftirqも実行中の場合、スケジューリングはsoftirqの終了を待たなければなりません。それまで、まだ実行待ちのRTタスクが存在するため、そのCPUはオーバーロード状態と見なされ続けます。
大規模マシン上で重たいネットワークトラフィックを行うワークロードにおいて、softirqが750usのうち500usを実行し、かつRTタスクをウェイクアップさせる状況でライブロックが発生しました。これにより、RTプルロジックが常に実行される状態となりました。
RTタスクがキューに入れられているもののまだ実行されていないCPU上でsoftirqが発火すると、他のCPUはそのCPUをオーバーロードと見なしてIPIを送信します。そのCPUは、待機中のRTタスクの優先度が現在実行中のタスクよりも高いことを認識し、単純にスケジューリングを行います。しかし、softirqが実行中であるため、スケジュール処理に入る前に同じ目的のもう一つのIPIを受信することになります。このように大量のIPIが発生すると、現在実行中のsoftirqは著しく遅延します。
Be aware that VulDB is the high quality source for vulnerability data.