| Title | LinuxのLinux Kernelにおける不特定の脆弱性 |
|---|---|
| Summary | 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により提案されましたが、報告者がアウトオブツリーのドライバを使用しフィードバックがなかったため採用されませんでした(詳細は参照してください)。 |
| Possible impacts | 当該ソフトウェアが扱う情報について、外部への漏えいは発生しません。 また、当該ソフトウェアが扱う情報について、書き換えは発生しません。 さらに、当該ソフトウェアが完全に停止する可能性があります。 そして、この脆弱性を悪用した攻撃の影響は、他のソフトウェアには及びません。 |
| Solution | リリース情報、またはパッチ情報が公開されています。参考情報を参照して適切な対策を実施してください。 |
| Publication Date | May 6, 2026, midnight |
| Registration Date | May 13, 2026, 10:23 a.m. |
| Last Update | May 13, 2026, 10:23 a.m. |
| CVSS3.0 : 重要 | |
| Score | 7.5 |
|---|---|
| Vector | 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 |
| No | Changed Details | Date of change |
|---|---|---|
| 1 | [2026年05月13日] 掲載 |
May 13, 2026, 10:23 a.m. |
| Summary | 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 These tests use veth to simulate GRO. They attach a trivial Digging into the failure mode we can see that the connection In this state, sender sends a retransmission from the rtx queue The root cause is the mess of the xmit return codes. veth returns ------------------------------------------------- "x" means packet lost by veth, and "ok" means it went thru. So why did the sender not advance snd_nxt even tho it clearly did Of course for the problem to occur we need a setup or a device We have multiple ways to fix this. 1) make veth not return an error when it lost a packet. 2) fix the damn return codes 3) make TCP ignore the errors 4) this fix Similar fix has been proposed by Eric in the past but never committed |
|---|---|
| Publication Date | May 6, 2026, 9:16 p.m. |
| Registration Date | May 7, 2026, 4:08 a.m. |
| Last Update | May 12, 2026, 5:11 a.m. |
| Configuration1 | or higher | or less | more than | less than | |
| 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:*:*:*:*:*:* | |||||