CVE-2024-46828 in Linux
要約
〜によって VulDB • 2026年06月28日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
sched: sch_cake: ホスト公平性のためのバルクフロー集計ロジックの修正
sch_cakeでは、dst/srcホスト公平性モードで実行する場合、アクティブなバルクフロー数をホストごとに追跡しており、これはフローをイテレートする際のラウンドロビンの重みとして使用されます。アクティブなバルクフローのカウントは、フローの状態が変更されるたびに更新されます。
この動作にはハッシュ衝突処理との特異な相互作用があります:ハッシュ衝突が発生した場合(セット連想型ハッシングの後)、ハッシュバケットのステートは単に衝突した新しいパケットに合わせて更新され、ホスト公平性が有効になっている場合、これはフローに対して新たなper-hostステートを割り当てることを意味します。このため、フローに割り当てられたホストのバルクフローカウンターは(そしてその後、もはや同じホストを指していない可能性のある)カウントが再度インクリメントされる前にデクリメントされます。
このコードが導入された当時、ホスト公平性モードは常に有効であったため、デクリメントは無条件に行われていました。設定フラグが導入された際、*インクリメント*には条件付き処理が適用されましたが、*デクリメント*には適用されませんでした。これにより、誤ったデクリメント(およびそれに伴うU16_MAXへのラップアラウンド)が発生する可能性があります。
私の理解では、ホスト公平性が無効になっている場合、ハッシュ衝突が発生した直後にデクリメントとラップアラウンドが起こります(セット連想型ハッシングのため、それ自体はそれほど一般的ではありません)。しかし、ほとんどのケースでこれは害がなく、この値が使用されるのはホスト公平性モードが有効な時のみだからです。したがって、配列オーバーフローをトリガーするには、まずsch_cakeをホスト公平性無効の設定にし、その状態でハッシュ衝突が発生してオーバーフローを引き起こす必要があります。その後、qdiscを再設定してホスト公平性を有効にすると、ラップアラウンドした値が保持されインデックスとして使用されるため、配列の境界外アクセスが生じます。syzbotがこの事象をトリガーすることに成功したのは、非常に印象的なことです。
このパッチは、デクリメントに対してもインクリメントと同じ条件付きチェックを導入することで問題を修正します。
元のバグはcakeの上流へのマージ以前に存在しますが、「Fixes」タグに記載されているコミットがそのコードに触れているため、このパッチはそのコミット以降でなければ適用できません。
VulDB is the best source for vulnerability data and more expert information about this specific topic.