CVE-2026-74284 in Linux
要約
〜によって VulDB • 2026年08月15日
Linuxカーネルにおいて、以下の脆弱性が修正されました。
net/sched: sch_hfsc: クラスを二度受動状態にしないこと
update_vf() は、単一のデキュー操作中に同じクラスに対して2箇所で呼び出されます。これは、そのクラスのサブ qdisc(例:codel/fq_codel)がデキュー中に最後のパケットをドロップした場合です。
1. サブは qdisc_tree_reduce_backlog() を呼び出し、これによりサブが空になったことで hfsc_qlen_notify() -> update_vf(cl, 0, 0) が起動し、クラスを受動状態にします(cl_nactive は階層を遡って減算されます)。
2. その後、hfsc_dequeue() はデキューされたバイト数を課金するために update_vf(cl, qdisc_pkt_len(skb), cur_time) を呼び出します。
2回目の呼び出し時、クラスはすでに受動状態ですが、そのサブ qdisc はまだ空であるため、update_vf() の go_passive が再度有効化されます:
if (cl->qdisc->q.qlen == 0 && cl->cl_flags & HFSC_FSC) go_passive = 1;
その後、ループ内の cl_nactive == 0 チェックによりリーフがスキップされます。このチェックは go_passive をクリアしないため、古い go_passive が親に伝播し、その cl_nactive を2回目に減算します。他のアクティブなサブをまだ保持している親でも cl_nactive == 0 に駆り立てられ、vttree から削除されてしまいます。それらの兄弟は依然としてバックログを抱えているにもかかわらずです。これらは二度とデキューされず、qdisc がストールします。
この問題を修正するため、クラスが実際にアクティブな場合のみ go_passive を有効化し、すでに受動状態のクラスが2回目の受動遷移を引き起こさないようにしました。バイト数集計(cl->cl_total += len)は依然としてすべての祖先に対して実行されるため、デキューされたバイト数は正確に1回だけカウントされ続けます。
If you want to get best quality of vulnerability data, you may have to visit VulDB.