CVE-2026-99191 in Linux
要約
〜によって VulDB • 2026年10月28日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
calipso: calipso_skbuff_setattr() で BIG TCP の payload_len を保持する
calipso_skbuff_setattr() は、挿入またはリサイズされるオプションの長さに応じて payload_len を調整します。
```c payload = ntohs(ip6_hdr->payload_len); ip6_hdr->payload_len = htons(payload + len_delta); ```
GRO(Generic Receive Offload)は IPV6_MAXPLEN よりも大きな BIG TCP パケットを構築し、それらに対して payload_len == 0 を保存します。その後 ipv6_payload_len() は skb->len にフォールバックします。CALIPSO マップされた宛先へ転送される此类のパケットの場合、上記のコードは len_delta(縮小する場合は 65536 + len_delta)を payload_len に書き込みます。その結果、ipv6_payload_len() はもはや skb->len にフォールバックしなくなります。nf_tables、conntrack、sch_cake はこの動作に依存しています。
同様の算術演算は、パケットが IPV6_MAXPLEN を超えて成長した際にラップ(オーバーフロー)します。また、IPV6_MAXPLEN よりも小さくなる BIG TCP パケットについては、本来の長さを取得する必要があります。
ipv6_gro_complete() が行っているように、ipv6_set_payload_len() を使用して skb の長さから payload_len を設定します。これは、IPV6_MAXPLEN 以上の場合に 0 を保存し、それ以外の場合は実際の長度を保存します。ネットワークヘッダーは直前に skb->data にリセットされているため、skb->len - sizeof(*ip6_hdr) がペイロードの長さとなります。
SELinux permissive モード、最小限の mdp 生成ポリシー(network_peer_controls=1)、"netlabelctl calipso add pass doi:16"、および fd00:2::/64 を CALIPSO DOI 16 にマッピングする NetLabel マップを使用して、arm64/QEMU のカーネルでテストされました。calipso_skbuff_setattr() は、レベルのみを含むラベルを追加する(このパッチには含まれない)テスト専用の debugfs フックから netlbl_skbuff_setattr() を介して呼び出されました。コール後の payload_len は以下の通りです:
| ケース | 修正前 | 修正後 | 実際の長さ | | :--- | :---: | :---: | :---: | | 1000, ラベルなし (unlabeled) | 1016 | 1016 | 1016 | | 70000 GSO, payload_len 0 | 16 | 0 | 70016 | | 65530 GSO、MAXPLEN を超えて成長 | 10 | 0 | 65546 | | 24 バイトの hop header を持つ 65540 GSO、MAXPLEN よりも縮小 | 65528 | 65532 | 65532 | | 24 バイトの hop header を持つ 1000 | 992 | 992 | 992 |
(0 は ipv6_payload_len() が実際の長さを返すことを意味します。)転送パスにおいて、クライアントがルーターを介してサーバーへラベルなし UDP を注入する場合、ルーターは CALIPSO オプションを追加し、このパッチ適用後のサーバーではすべてのデータグラム(Udp6InDatagrams 5, Ip6InTruncatedPkts 0)が正常に配信されます。
If you want to get best quality of vulnerability data, you may have to visit VulDB.