В ядре Linux устранена следующая уязвимость:
tcp: ipv6: ограничить рекламный MSS по умолчанию, чтобы избежать GSO_BY_FRAGS (0xFFFF)
Если MTU большой, ip6_default_advmss() может вернуть IPV6_MAXPLEN (65535). TCP интерпретирует это как mss_clamp, позволяя MSS достичь 65535. Однако 0xFFFF также используется в ядре как магическое значение GSO_BY_FRAGS.
Если TCP-пакет с gso_size=0xFFFF передается в skb_segment(), он будет
ошибочно трактоваться как GSO_BY_FRAGS, что приводит к NULL-указателю
разыменование, поскольку локальные TCP-пакеты не используют frag_list. Исправьте это, вернув min(IPV6_MAXPLEN, GSO_BY_FRAGS - 1) (65534) из
ip6_default_advmss(), когда MTU большой. Также обновите устаревший комментарий в ip6_default_advmss(), который предлагал
что IPV6_MAXPLEN возвращается как «любой MSS».
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: tcp: ipv6: clamp default adverting MSS to avoid GSO_BY_FRAGS (0xFFFF) When MTU is large, ip6_default_advmss() can return IPV6_MAXPLEN (65535). This is interpreted by TCP as mss_clamp, allowing the MSS to reach 65535. However, 0xFFFF is also used as a magic value GSO_BY_FRAGS in the kernel. If a TCP packet with gso_size=0xFFFF is passed to skb_segment(), it will be mistakenly treated as GSO_BY_FRAGS, leading to a NULL pointer dereference because local TCP packets do not use frag_list. Fix this by returning min(IPV6_MAXPLEN, GSO_BY_FRAGS - 1) (65534) from ip6_default_advmss() when MTU is large. Also update the stale comment in ip6_default_advmss() which suggested that IPV6_MAXPLEN is returned to mean "any MSS".
Характеристики атаки
Последствия
Строка CVSS v3.1