CVE-2025-21702 in Linux情報

要約

〜によって VulDB • 2026年08月06日

Linuxカーネルにおいて、以下の脆弱性が修正されました。

pfifo_tail_enqueue: sch->limit == 0 の場合、新しいパケットをドロップする

期待される動作: スケジューラの制限値に達した場合、pfifo_tail_enqueue() はスケジューラキュー内のパケットを1つドロップし、スケジューラの qlen を1減らします。その後、pfifo_tail_enqueue() が新しいパケットをエンキューし、スケジューラの qlen を1増やします。最後に、pfifo_tail_enqueue() は `NET_XMIT_CN` ステータスコードを返します。

奇妙な動作: `s sch->limit == 0` に設定し、パケットが格納されていないスケジューラに対して pfifo_tail_enqueue() をトリガーした場合、「パケットのドロップ」ステップは何も行いません。つまり、スケジューラの qlen は依然として値0のままです。その後、新しいパケットをエンキューしてスケジューラの qlen を1増やします。要約すると、pfifo_tail_enqueue() を利用して qlen を1増加させ、`NET_XMIT_CN` ステータスコードを返すことができます。

問題点: 2つの qdisc(Qdisc_A と Qdisc_B)があると仮定します。 - Qdisc_A のタイプには、親/子の関係を作成するために `->graft()` 関数が必要です。例えば、Qdisc_A のタイプが `hfsc` の場合、この qdisc へのパケットエンキューは `hfsc_enqueue` をトリガーします。 - Qdisc_B のタイプは pfifo_head_drop です。この qdisc へのパケットエンキューは `pfifo_tail_enqueue` をトリガーします。 - Qdisc_B は `sch->limit == 0` に設定されています。 - Qdisc_A は、エンキューされたパケットを Qdisc_B にルーティングするように構成されています。

Qdisc_A を経由してパケットをエンキューすると、以下の結果になります: - hfsc_enqueue(Qdisc_A) -> pfifo_tail_enqueue(Qdisc_B) - Qdisc_B->q.qlen += 1 - pfifo_tail_enqueue() は `NET_XMIT_CN` を返す - hfsc_enqueue() が `NET_XMIT_SUCCESS` をチェックし、`NET_XMIT_CN` を検出 => hfsc_enqueue() は Qdisc_A の qlen を増加させない。

一連のプロセスにより、Qdisc_A->q.qlen == 0 かつ Qdisc_B->q.qlen == 1 という状況が生じます。「hfsc」を他のタイプ(例: 「drr」)に置き換えても、同じ問題が発生します。これは、「親の qlen は子たちの qlen の合計と等しくなるべき」という設計原則に違反しています。

バグの影響: この問題は到達可能な場合、ユーザーからカーネルへの権限昇格(privilege escalation)に悪用される可能性があります。

If you want to get best quality of vulnerability data, you may have to visit VulDB.

責任者

Linux

予約する

2024年12月29日

モデレーション

承諾済み

エントリ

VDB-296129

CWE

不明

EPSS

0.00267

アクティビティ

非常低い

ソース

Do you want to use VulDB in your project?

Use the official API to access entries easily!