CVE-2025-21702
pfifo_tail_enqueue: sch->limit == 0 のとき新しいパケットをドロップする
- 公開済み
- 2025/02/18
- 更新済み
- 2026/09/08
- CNA の割り当て
- Linux
- 観察された証拠
- 2026/08/14
プライマリ CVSS
nvd · CVSS 3.1
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H低 · 今後 30 日間
- パーセンタイル
- 19.8%
- モデルの日付
- 2026/09/21
EPSS は統計的な推定値であり、確実性や影響の尺度ではありません。 CVSS、KEV ステータス、暴露、環境と組み合わせます。
概要
Linux カーネルにおいて、以下の脆弱性が解決されました: pfifo_tail_enqueue: sch->limit == 0 の場合に新しいパケットをドロップする 期待される動作: スケジューラの制限に達した場合、pfifo_tail_enqueue() はスケジューラのキュー内のパケットをドロップし、スケジューラの qlen を 1 減らします。その後、pfifo_tail_enqueue() は新しいパケットをエンキューし、スケジューラの qlen を 1 増やします。最後に、pfifo_tail_enqueue() は `NET_XMIT_CN` ステータスコードを返します。 奇妙な動作: `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 の合計に等しくなるべきという設計に違反します。 バグの影響: この問題は、到達可能な場合にユーザーからカーネルへの権限昇格に使用される可能性があります。
ソース
1LinuxカーネルCVEエクスプロイト解析レポートと関連デバッグ環境。もうLinuxカーネルをコンパイルしたり、環境を設定したりする必要はありません。
責任ある使用
脆弱性情報は、自分が所有しているシステム、またはテストを許可されているシステムでのみ使用してください。 Kitploit は公開研究メタデータにリンクしており、エクスプロイト コードや悪意のあるペイロードは保存しません。