LinuxのLinux Kernelにおける不特定の脆弱性
タイトル LinuxのLinux Kernelにおける不特定の脆弱性
概要

Linuxカーネルにおいて、以下の脆弱性が解決されました。net: GSOフレームの送信(xmit)エラーを適切に処理するようになりました。現在、udpgro_frglist.shとudpgro_bench.shはNIPAで最も不安定なテストであり、両方とも同じ方法で失敗します。また、TCP GROテストは時々停止し、約10分後にテストが終了します。これらのテストはvethを使用してGROをシミュレートし、単純な(「return XDP_PASS;」)XDPプログラムをvethにアタッチしてTSOをオフにし、NAPIをオンにしています。障害モードを調査した結果、接続はパケットドロップの連続後に完全に停止していることが判明しました。送信者のsnd_nxtはシーケンス番号Nですが、受信者はN + 3 * MSSまで受信したと主張しています。問題の最後の部分では、送信者の再送キューが空でなく(キューのブロックはシーケンス番号N - 4 * MSSにあると仮定)、送信者はこの状態で再送キューから単一セグメント(シーケンス番号N-4*MSSからN-3*MSS)を再送します。受信者はそれを受け入れてACKをN + 3 * MSSまで返しますが、送信者はこれをTCP_ACK_UNSENT_DATAとして拒否します。なぜなら、その範囲までデータを送信した記憶がないからです。そして、システムは停止します。根本原因はxmitの戻り値コードの混乱にあります。vethはフレームを送信できない場合にエラーを返しますが、これにより損失イベントが発生します。図ではGSOスーパーフレームの各セグメントのうち1番目と8番目のパケットがvethで失われています。vethはこのテストでTSOを無効にしているため個々のセグメントを見ており、セグメント1は再送キューにあり再送されます。ではなぜ送信者は8番目のセグメントまで送信しているにもかかわらずsnd_nxtを進めないのでしょうか。tcp_write_xmit()はコアからの戻り値をデータが送信されていないと解釈しているからです。TCPはGSOスーパーフレーム単位で処理しているため、単一セグメントの損失を全体の損失と見なしてしまうことが問題の核心です。TCPはGSOフレームの最後のセグメントの戻り値コードのみを参照します。この問題の発生にはQdiscがない環境やデバイスが必要です。通常、Qdiscはプロトコル層をデバイスエラーから切り離しています。修正方法はいくつかあります。1) vethがパケットを失ってもエラーを返さないようにする方法。過去にこの方法を試みましたが問題は繰り返し発生し、デバッグが困難でした。2) 戻り値コードを修正する方法。ドキュメントではNETDEV_TX_OKとNETDEV_TX_BUSYのみが言及されているため、ndo_start_xmit()の戻り値をbooleanにするのが良いかもしれません。ただし古い非ネットワークプロトコルに影響が出る可能性があります。3) TCPがエラーを無視する方法。ip_queue_xmit()の結果をTCPが解釈する利点は不明であり、接続確立後のデータ送信中はパケット損失を単なる損失として扱うべきかもしれません。4) 今回の修正方法。QdiscがなくかつGSOケースで戻り値を無視し、TCQ_F_CAN_BYPASSの場合は常にOKを返しますが、QdiscなしではGSOエラーのみをマスクします。この方法はCANやMCTPなどの非IPネットワークにも影響を及ぼすため古い環境での後退が懸念されます。これが最も単純である反面、最もハッキング的な修正かもしれません。似た修正は以前Ericにより提案されましたが、報告者がアウトオブツリーのドライバを使用しフィードバックがなかったため採用されませんでした(詳細は参照してください)。

想定される影響 当該ソフトウェアが扱う情報について、外部への漏えいは発生しません。 また、当該ソフトウェアが扱う情報について、書き換えは発生しません。 さらに、当該ソフトウェアが完全に停止する可能性があります。 そして、この脆弱性を悪用した攻撃の影響は、他のソフトウェアには及びません。 
対策

リリース情報、またはパッチ情報が公開されています。参考情報を参照して適切な対策を実施してください。

公表日 2026年5月6日0:00
登録日 2026年5月13日10:23
最終更新日 2026年5月13日10:23
CVSS3.0 : 重要
スコア 7.5
ベクター CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
影響を受けるシステム
Linux
Linux Kernel 3.18 以上 5.10.252 未満
Linux Kernel 5.11 以上 5.15.202 未満
Linux Kernel 5.16 以上 6.1.165 未満
Linux Kernel 6.13 以上 6.18.16 未満
Linux Kernel 6.19 以上 6.19.6 未満
Linux Kernel 6.2 以上 6.6.128 未満
Linux Kernel 6.7 以上 6.12.75 未満
Linux Kernel 7.0
CVE (情報セキュリティ 共通脆弱性識別子)
CWE (共通脆弱性タイプ一覧)
その他
変更履歴
No 変更内容 変更日
1 [2026年05月13日]
  掲載
2026年5月13日10:23

NVD脆弱性情報
CVE-2026-43194
概要

In the Linux kernel, the following vulnerability has been resolved:

net: consume xmit errors of GSO frames

udpgro_frglist.sh and udpgro_bench.sh are the flakiest tests
currently in NIPA. They fail in the same exact way, TCP GRO
test stalls occasionally and the test gets killed after 10min.

These tests use veth to simulate GRO. They attach a trivial
("return XDP_PASS;") XDP program to the veth to force TSO off
and NAPI on.

Digging into the failure mode we can see that the connection
is completely stuck after a burst of drops. The sender's snd_nxt
is at sequence number N [1], but the receiver claims to have
received (rcv_nxt) up to N + 3 * MSS [2]. Last piece of the puzzle
is that senders rtx queue is not empty (let's say the block in
the rtx queue is at sequence number N - 4 * MSS [3]).

In this state, sender sends a retransmission from the rtx queue
with a single segment, and sequence numbers N-4*MSS:N-3*MSS [3].
Receiver sees it and responds with an ACK all the way up to
N + 3 * MSS [2]. But sender will reject this ack as TCP_ACK_UNSENT_DATA
because it has no recollection of ever sending data that far out [1].
And we are stuck.

The root cause is the mess of the xmit return codes. veth returns
an error when it can't xmit a frame. We end up with a loss event
like this:

-------------------------------------------------
| GSO super frame 1 | GSO super frame 2 |
|-----------------------------------------------|
| seg | seg | seg | seg | seg | seg | seg | seg |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
-------------------------------------------------
x ok ok <ok>| ok ok ok <x>
\\
snd_nxt

"x" means packet lost by veth, and "ok" means it went thru.
Since veth has TSO disabled in this test it sees individual segments.
Segment 1 is on the retransmit queue and will be resent.

So why did the sender not advance snd_nxt even tho it clearly did
send up to seg 8? tcp_write_xmit() interprets the return code
from the core to mean that data has not been sent at all. Since
TCP deals with GSO super frames, not individual segment the crux
of the problem is that loss of a single segment can be interpreted
as loss of all. TCP only sees the last return code for the last
segment of the GSO frame (in <> brackets in the diagram above).

Of course for the problem to occur we need a setup or a device
without a Qdisc. Otherwise Qdisc layer disconnects the protocol
layer from the device errors completely.

We have multiple ways to fix this.

1) make veth not return an error when it lost a packet.
While this is what I think we did in the past, the issue keeps
reappearing and it's annoying to debug. The game of whack
a mole is not great.

2) fix the damn return codes
We only talk about NETDEV_TX_OK and NETDEV_TX_BUSY in the
documentation, so maybe we should make the return code from
ndo_start_xmit() a boolean. I like that the most, but perhaps
some ancient, not-really-networking protocol would suffer.

3) make TCP ignore the errors
It is not entirely clear to me what benefit TCP gets from
interpreting the result of ip_queue_xmit()? Specifically once
the connection is established and we're pushing data - packet
loss is just packet loss?

4) this fix
Ignore the rc in the Qdisc-less+GSO case, since it's unreliable.
We already always return OK in the TCQ_F_CAN_BYPASS case.
In the Qdisc-less case let's be a bit more conservative and only
mask the GSO errors. This path is taken by non-IP-"networks"
like CAN, MCTP etc, so we could regress some ancient thing.
This is the simplest, but also maybe the hackiest fix?

Similar fix has been proposed by Eric in the past but never committed
because original reporter was working with an OOT driver and wasn't
providing feedback (see Link).

公表日 2026年5月6日21:16
登録日 2026年5月7日4:08
最終更新日 2026年5月12日5:11
影響を受けるソフトウェアの構成
構成1 以上 以下 より上 未満
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 3.18 5.10.252
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.11 5.15.202
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.16 6.1.165
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.2 6.6.128
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.7 6.12.75
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.13 6.18.16
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.19 6.19.6
cpe:2.3:o:linux:linux_kernel:7.0:rc1:*:*:*:*:*:*
関連情報、対策とツール
共通脆弱性一覧