| Title | Debian等の複数ベンダの製品における初期化されていないリソースの使用に関する脆弱性 |
|---|---|
| Summary | Linuxカーネルにおいて、以下の脆弱性が修正されました。nsh:nsh_gso_segment()関数で外側ヘッダーのskb-{protocol, data, mac_header}を正しく復元しなかった問題です。syzbotは、VIRTIO_NET_HDR_GSO_UDPで階層化された以下のプロトコルを持つ細工されたGSOパケットにより、様々なクラッシュ([0]およびリンク参照)を引き起こしました。対象のプロトコルはETH_P_8021AD + ETH_P_NSH + ETH_P_IPV6 + IPPROTO_UDPです。NSHはIPv4、IPv6、イーサネット、NSH、およびMPLSをカプセル化できます。内側のプロトコルがイーサネットの場合、NSHのGSOハンドラであるnsh_gso_segment()はskb_mac_gso_segment()を呼び出して内側プロトコルのGSOハンドラを起動します。nsh_gso_segment()はskb_mac_gso_segment()を呼び出す前に元のskbに対して以下の処理を行います。1. skb-network_headerをリセットする。2. 元のskbの{mac_header, mac_len}をローカル変数に保存する。3. NSHヘッダーをプルする。4. skb-mac_headerをリセットする。5. 内側プロトコルのためにskb-mac_lenとskb-protocolを設定する。segmented skbに対しては以下の処理を行います。6. ntohs(ETH_P_NSH)をskb-protocolにセットする。7. NSHヘッダーをプッシュする。8. skb-mac_headerを復元する。9. skb-mac_header + mac_lenをskb-network_headerにセットする。10. skb-mac_lenを復元する。6-7および8-9の段階に二つの問題が存在します。(a) 6および7の後、skb-dataはNSHヘッダーを指すため、skbがnetdevから送信される際に外側ヘッダー(この場合はETH_P_8021AD)が剥がされます。また、NSHがNSH+Ethernet(NSH-Ethernet-NSH)でカプセル化されている場合、最初のnsh_gso_segment()のskb_pull()でskb-dataが外側NSHまたはイーサネットヘッダーの途中を指してしまいます。これは2回目のnsh_gso_segment()でイーサネットヘッダーがプルされないために起こります。(b) 8および9でskb-{mac_header, network_header}を復元する際、nsh_gso_segment()は線形バッファ内のデータシフトを考慮していません。しかし、udp6_ufo_fragment()はデータをシフトし、syzbotで示されたようにskb-mac_headerを変更する可能性があります。これが起こると、復元したskb-mac_headerが外側ヘッダーの途中を指すことになります。これまでnsh_gso_segment()は外側ヘッダーと連携して動作していませんでした。nsh_gso_segment()の最後には、NSHヘッダーではなく、細分化されたskbの外側ヘッダーが復元される必要があります。そのために、内側ヘッダーからの相対位置で外側ヘッダーの位置を計算し、skb-{data, mac_header, protocol}を適切に設定します。[0]: BUG: KMSAN: uninit-value in ipvlan_process_outbound drivers/net/ipvlan/ipvlan_core.c:524 [inline] 以下略。 |
| Possible impacts | 当該ソフトウェアが扱う情報について、外部への漏えいは発生しません。 また、当該ソフトウェアが扱う情報について、書き換えは発生しません。 さらに、当該ソフトウェアが完全に停止する可能性があります。 そして、この脆弱性を悪用した攻撃の影響は、他のソフトウェアには及びません。 |
| Solution | 正式な対策が公開されています。ベンダ情報を参照して適切な対策を実施してください。 |
| Publication Date | May 30, 2024, midnight |
| Registration Date | Jan. 27, 2026, 5:37 p.m. |
| Last Update | Jan. 27, 2026, 5:37 p.m. |
| CVSS3.0 : 警告 | |
| Score | 5.5 |
|---|---|
| Vector | CVSS:3.0/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H |
| Debian |
| Debian GNU/Linux 10.0 |
| Linux |
| Linux Kernel 4.14 以上 4.19.314 未満 |
| Linux Kernel 4.20 以上 5.4.276 未満 |
| Linux Kernel 5.11 以上 5.15.159 未満 |
| Linux Kernel 5.16 以上 6.1.91 未満 |
| Linux Kernel 5.5 以上 5.10.217 未満 |
| Linux Kernel 6.2 以上 6.6.31 未満 |
| Linux Kernel 6.7 以上 6.8.10 未満 |
| Linux Kernel 6.9 |
| No | Changed Details | Date of change |
|---|---|---|
| 1 | [2026年01月27日] 掲載 |
Jan. 27, 2026, 5:37 p.m. |
| Summary | In the Linux kernel, the following vulnerability has been resolved: nsh: Restore skb->{protocol,data,mac_header} for outer header in nsh_gso_segment(). syzbot triggered various splats (see [0] and links) by a crafted GSO ETH_P_8021AD + ETH_P_NSH + ETH_P_IPV6 + IPPROTO_UDP NSH can encapsulate IPv4, IPv6, Ethernet, NSH, and MPLS. As the inner nsh_gso_segment() does the following for the original skb before 1. reset skb->network_header and does the following for the segmented skb 6. set ntohs(ETH_P_NSH) to skb->protocol There are two problems in 6-7 and 8-9. (a) Also, if NSH is encapsulated by NSH + Ethernet (so NSH-Ethernet-NSH), (b) However, udp6_ufo_fragment() could shift the data and change If this happens, even the restored skb->mac_header points to It seems nsh_gso_segment() has never worked with outer headers so far. At the end of nsh_gso_segment(), the outer header must be restored for To do that, let's calculate the outer header position relatively from [0]: Uninit was created at: |
|---|---|
| Publication Date | May 31, 2024, 1:15 a.m. |
| Registration Date | May 31, 2024, 10 a.m. |
| Last Update | Nov. 21, 2024, 6:22 p.m. |