CVE-2026-98050 in Linux
要約
〜によって VulDB • 2026年09月25日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
mlxsw: spectrum_ptp: GC workqueueコンテキストからのnapi_gro_receive()呼び出しを修正
現在、mlxsw_sp1_ptp_ht_gc_collect()はNAPI pollコンテキストではなくPTP garbage-collection(ガベージコレクション)workキューから実行されています。SKBを保持する未マッチのPTPエントリがある場合、この関数はmlxsw_sp1_ptp_unmatched_finish() -> mlxsw_sp1_ptp_packet_finish()を呼び出します。受信パケットの場合、これはmlxsw_sp_rx_listener_no_mark_func()を呼び出します。その関数の末尾は以下の通りです:
skb->protocol = eth_type_trans(skb, skb->dev); napi_gro_receive(mlxsw_skb_cb(skb)->rx_md_info.napi, skb);
napiポインタは、NAPIコンテキストでトラップされたパケットを受信した際にSKB制御ブロックに設定されたものです。その後、GCが未マッチのエントリを回収する際(最大MLXSW_SP1_PTP_HT_GC_TIMEOUT後)、napi_gro_receive()の呼び出しによりNAPIインスタンスのGROリストが変更されます。これは別のCPUでpoll処理が並行して実行されている場合、安全ではありません。
mlxsw_sp1_ptp_ht_gc_collect()ではlocal_bh_disable()を呼び出してsoftirq処理を防いでいますが、これはローカルCPUにのみ適用されます。さらに、そのコメントは古くなっています。このコメントはmlxsw_sp1_ptp_unmatched_finish()がnetif_receive_skb()を呼び出すと述べていますが、参照されたコミット以降、これは正確ではありませんでした。今回のパッチにより、そのコメントが再び正確になります。
mlxsw_pci_napi_devs_init()は条件なしでNAPI RX net_deviceに対してnetif_threaded_enable()を呼び出します。GCと並行して実行される可能性のあるNAPインスタンスのpoll処理は、独立してスケジューリングされたkthreadとして実行されており、異なるCPU上で動作する可能性があります。local_bh_disable()の呼び出しはこの状況をガードできません。
txタイムスタンプのタイムアウトにより未マッチのエントリが発生し(ptp4lを実行してポートがUNCALIBRATED/SLAVE状態に達するのを待つことで簡単に再現可能)、所有NAPスレッドが別のCPUでpoll処理の最中にある場合、両側がGROリストを並行して変更します。以下のように示されます:
[39.846] port 1 (swp1): MASTER to UNCALIBRATED on RS_SLAVE
list_add corruption. next->prev should be prev (ffff8d620faf4138), but was ffff8d624150f700. (next=ffff8d620faf4138). kernel BUG at lib/list_debug.c:29! Oops: invalid opcode: 0000 [#1] SMP PTI
CPU: 1 UID: 0 PID: 539 Comm: napi/mlxsw_rx-0 Not tainted 6.18.48 #1-NixOS PREEMPT(lazy) Hardware name: Mellanox Technologies Ltd. MSN2410/VMOD0001, BIOS 4.6.5 09/13/2018 RIP: 0010:__list_add_valid_or_report+0x79/0xb0 RSP: 0018:ffffcdf8c0f27c08 EFLAGS: 00010246 RAX: 0000000000000075 RBX: ffff8d624150fd00 RCX: 0000000000000000 RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffff8d6315d1e540 RBP: ffff8d620faf4070 R08: 0000000000000000 R09: 00000000ffffdfff R10: ffffffffa5c60fe0 R11: ffffcdf8c0f27ab8 R12: 0000000000000003 R13: 000000000000003d R14: 00000000000001bc R15: 0000000000000001 FS: 0000000000000000(0000) GS:ffff8d636f63f000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000562689a60c24 CR3: 000000015f224004 CR4: 00000000001726f0 Call Trace: <TASK> gro_receive_skb+0xee/0x230 mlxsw_sp1_ptp_got_packet+0x61/0x140 [mlxsw_spectrum]
mlxsw_core_skb_receive+0xdf/0x1b0 [mlxsw_core]
mlxsw_pci_napi_poll_cq_rx+0x780/0x9d0 [mlxsw_pci]
__napi_poll+0x31/0x1e0 napi_threaded_poll_loop+0x16b/0x1c0 napi_threaded_poll+0x71/0xa0 kthread+0xfb/0x260 ret_from_fork+0x22d/0x260 ret_from_fork_asm+0x1a/0x30 </TASK> Kernel panic - not syncing: Fatal exception in interrupt
このカーネルパニックに至る機構は、6.18.48とメインラインの間で変更されていません。
今回のパッチは、PTP packet_finish()パス用のingress-deliveryヘルパーを追加し、napi_gro_receive()の代わりにnetif_receive_skb()を呼び出します。napi_gro_receive()とは異なり、netif_receive_skb()はNAPインスタンスのpollコンテキストの外側から呼び出すことができ、このパスのコールサイトで発生する可能性があります。RX統計情報の集計とskb->devへの割り当ては依然として保持されます。変更されるのは配送処理自体のみです。
これによりGR ---省略---
If you want to get best quality of vulnerability data, you may have to visit VulDB.