Уязвимость ядра при обработке MSS. Ядро версии выше 2.6.29
Компания Netflix выявила несколько критических уязвимостей в TCP-стеках Linux и FreeBSD, которые позволяют удалённо инициировать крах ядра или вызвать чрезмерное потребление ресурсов при обработке специально оформленных TCP-пакетов (packet-of-death). Проблемы вызваны ошибками в обработчиках максимального размера блока данных в TCP-пакете (MSS, Maximum segment size) и механизма выборочного подтверждения соединений (SACK, TCP Selective Acknowledgement).

CVE-2019-11477 (SACK Panic) - проблема проявляется в ядрах Linux начиная с 2.6.29 и позволяет вызвать крах (panic) ядра через отправку серии SACK-пакетов из-за возникновения целочисленного переполнения в обработчике. Для атаки достаточно выставить для TCP-соединения значение MSS в 48 байт и отправить последовательность определённым образом скомпонованных SACK-пакетов.

Суть проблемы в том, что структура tcp_skb_cb (Socket Buffer) рассчитана на хранение 17 фрагментов ("define MAX_SKB_FRAGS (65536/PAGE_SIZE + 1) => 17"). В процессе отправки пакета он размещается в очереди на отправку, а в tcp_skb_cb сохраняются детали о пакете, такие как номер последовательности, флаги, а также поля "tcp_gso_segs" и "tcp_gso_size", которые применяются для передачи драйверу информации о сегментировании (TSO, TCP Segmentation Offload) для обработки сегментов на стороне сетевой карты.
Фрагменты сохраняются при возникновении потери пакета или необходимости выборочной повторной передачи пакетов, в случае если включен механизм SACK и драйвером поддерживается TSO. При минимальном MSS выделяется всего 8 байт на один сегмент данных, соответственно, возрастает число сегментов, необходимых для отправки всех данных, и структура может достичь лимита в 17 фрагментов. Для защиты от переполнения в коде имеется проверка, которая приводит к вызову функции BUG_ON() и переводу ядра в состояние panic.

В качестве обходных путей защиты можно отключить обработку SACK (записать 0 в /proc/sys/net/ipv4/tcp_sack) или заблокировать соединения с небольшим MSS (работает только при выставлении sysctl net.ipv4.tcp_mtu_probing в 0 и может нарушить работу некоторых нормальных соединений с низким MSS).

CVE-2019-11478 (SACK Slowness) - приводит к нарушению работы механизма SACK (при использовании ядра Linux младше 4.15) или избыточному потреблению ресурсов. Проблема проявляется при обработке специально оформленных SACK-пакетов, которые можно использовать для фрагментирования очереди повторной передачи (TCP retransmission). Обходные пути защиты аналогичны предыдущей уязвимости;
CVE-2019-5599 (SACK Slowness) - позволяет вызвать фрагментацию карты отправленных пакетов при обработке специальной последовательности SACK в рамках одного TCP-соединения и вызвать выполнение ресурсоёмкой операции перебора списка. Проблема проявляется во FreeBSD 12 с механизмом определения потери пакетов RACK. В качестве обходной меры можно отключить модуль RACK (по умолчанию не загружается, отключается через указание sysctl net.inet.tcp.functions_default=freebsd);
CVE-2019-11479 - атакующий может вызвать в ядре Linux разделение ответов на несколько TCP-сегментов, каждый из которых включает только 8 байт данных, что может привести к существенному повышению трафика, увеличению нагрузки на CPU и забиванию канала связи. В качестве обходного метода защиты рекомендовано заблокировать соединения с низким MSS.

В ядре Linux проблемы устранены в выпусках 4.4.182, 4.9.182, 4.14.127, 4.19.52 и 5.1.11. Исправление для FreeBSD доступно в виде патча. В дистрибутивах обновления пакетов с ядром выпущено для Debian, RHEL, SUSE/openSUSE, ALT, Ubuntu, Fedora и Arch Linux.

 
Источник: www.opennet.ru
Публикации по теме:
подробнее скрыть
Вы должны войти

loading