Недавно мы провели углубленный анализ уязвимости SACK Panic (которая впервые была раскрыта в июне 2019 года), чтобы выяснить ее эффективность для машин Linux. В ходе этого исследования мы нашли новый метод обнаружения уязвимых серверов с помощью популярного анализатора сетевого трафика Wireshark. В этой статье приводятся сведения об уязвимости SACK Panic, новом методе обнаружения и ряде мер по смягчению, рекомендованных для защиты от SACK Panic.
Хотя воздействие, по-видимому, ограничивается
1. Основные сведения об уязвимости SACK Panic
Три уязвимости безопасности были выявлены и связаны с манипулированием пакетами выборочного подтверждения TCP в сочетании с низким значением максимального размера сегмента (MSS).
Вы можете отследить три уязвимости, обнаруженные следующими CVE:
Чтобы лучше понять SACK Panic, нам нужно понять следующие определения:
Выборочное подтверждение TCP ( SACK ) - это метод, используемый TCP для снижения перегрузки, которая может возникнуть из-за повторной передачи отброшенных пакетов (сегментов).
Максимальный размер сегмента ( MSS ) - это набор параметров в заголовке TCP пакета, который указывает общий объем данных, содержащихся в восстановленном сегменте TCP.
Generic Segmentation Offload ( GSO ) - это чисто программная разгрузка, которая имеет дело со случаями, когда драйверы устройств не могут выполнять разгрузки из-за отсутствия поддержки аппаратного обеспечения.
Традиционно данные разделяются на небольшие отдельные пакеты и проходят через сетевой стек один за другим. GSO использует сетевой стек с одним большим пакетом, который включает в себя все данные. Если вы хотите погрузиться глубже, вы можете прочитать больше информации здесь.
2. Как работает SACK Panic
Опция SACK Panic означает выборочное подтверждение. Это более интеллектуальный механизм TCP, созданный для устранения избыточных данных. Он был представлен еще в 1996 году
TCP - это протокол, ориентированный на установление соединения, который во время передачи данных фрагментируется на сегменты с максимальным размером сегмента (MSS). Это согласовывается в начале соединения в пакетах SYN, где рассматривается самое низкое значение MSS.
В демонстрационном разделе мы поговорим о двух системах: «отправитель» и «получатель».
Может случиться, что по разным причинам во время передачи пакет не может быть принят другой стороной. В этом случае, до того, как был введен SACK, «отправителю» приходилось повторно отправлять целое окно пакетов, чтобы получатель получил только тот, который его не был принят.
Например, скажем, «отправитель» дал 10 пакетов, а «получатель» получает все, кроме пакетов 4 и 7. Затем в следующей системе ACK «получатель» может прикрепить опцию SACK, заявив, что он получил пакеты от 1-3; 5 и 6; 8-10. Таким образом, «отправителю» нужно будет только отправить 2 пакета вместо 10.
Для управленияочередями и повторной передачей ядро Linux использует структуру с именем sk_buff.
Структура
Эта структура имеет связанный буфер управления с именем
В этот элемент управления также включена структура, а также количество сегментов или количество фрагментов ( tcp_gso_segs ), которое отображается следующим образом:
Это поле tcp_gso_segs является двухбайтовым целым числом без знака и ограничивает его 65536 (64 КБ).
Как определено
максимальное количество фрагментов в Linux (PAGE_SIZE = 4096) в sk_buf f составляет ровно 17 фрагментов.
Каждый фрагмент данных может иметь до 32 КБ, в результате максимум 17 * 32 КБ байтов данных содержится в sk_buff.
Здесь низкий MSS вступает в игру. Если мы установим значение MSS равным 48 (минимальное значение в TCP-соединении в Linux) и с параметрами TCP, накапливающими 40 байт, мы можем создать сегменты размером до 8 байт каждый.
Учитывая максимальные данные 17 * 32KB в sk_buff и разделив их на 8 байтов, мы получим
Глядя на предел сегментов в tcp_gso_segs, достигающих 64 КБ, мы можем легко наблюдать потенциальное переполнение.
Механизм, лежащий в основе SACK, позволяет объединять пакеты во время повторной передачи TCP, а также объединяет несколько очередей SKB, в результате чего получается потенциальный SKB из 17 пакетов.
В этом исходном
3. Как обнаружить SACK Panic с помощью Wireshark
Чтобы определить, уязвим ли целевой сервер, мы будем использовать Wireshark. Мы будем называть обе части клиента, конечной точкой и целью.
IP-адрес клиента в нашем тесте - 192.168.222.1, а IP-адрес цели - 192.168.222.3.
Прежде чем мы начнем, давайте сделаем быструю настройку на стороне клиента:
1. Установите параметры MSS
Добавьте параметры «advmss» к маршруту к вашей цели.
2. Убедитесь, что SACK включен:
Если он возвращает 1, то он включен.
3. Включите Wireshark и начните слушать.
Выберите интерфейс и установите фильтр для IP, как это:
4. Инициируйте TCP-соединение от клиента к серверу, используя следующие команды:
Вы можете использовать порт nc -lvp; nc ip_target port. Кроме того, вы можете попробовать HTTP GET на веб-сайте цели.
Примечание : не забудьте изменить свои IP-адреса.
Идем дальше к фактическому обнаружению:
На изображении выше вы можете увидеть, как должны выглядеть параметры клиента. Важным является то, что значение параметров MSS равно 48, а параметр SACK-enabled включен.
Так реагирует уязвимая цель. Это показывает, что опция SACK включена. В этом случае MSS обычно устанавливается по умолчанию, как указано в приведенной выше главе, на самое низкое используемое значение MSS.
Некоторые веб-сайты не соблюдают согласование MSS, поэтому вам необходимо проверить, не ограничен ли трафик до 48 байтов в дальнейшем. Как видите, длина данных TCP ('Len = x') ограничена 36 из-за 12 байтов опций TCP.
Напомним, что если SACK разрешен с обеих сторон и согласование MSS ограничивает данные до 48 байтов минус параметры, то система уязвима.
Чтобы быть уверенным, вы всегда можете проверить версию Linux, используя:
Это позволит выявить версию для Linux, а также дважды проверить уязвимость.
4. Как исправить уязвимость TCP SACK Panic
Чтобы предотвратить уязвимость ваших систем к этим атакам и повысить их безопасность, необходимо применить одно из следующих исправлений:
Исправление № 0: патч вашей системы .
Убедитесь, что вы применили последние исправления, доступные здесь, или просто выполните следующую команду:
Исправление № 1: блокировка соединений с низким MSS с использованием фильтров.
Эти фильтры могут нарушать допустимые соединения, которые зависят от этого параметра, поэтому соблюдайте осторожность при их применении.
Исправление № 2 : отключить обработку SACK
Чтобы сделать это, вы должны быть суперпользователем, потому что обычные администраторы не имеют права изменять это значение.
Помните, что одной из мер безопасности, упомянутых выше, должно быть достаточно для защиты от уязвимости TCP SACK Panic. Не обязательно применять их все .
Перевод:
Хотя воздействие, по-видимому, ограничивается
Ссылка скрыта от гостей
, эту проблему необходимо решить, чтобы пользователи поняли, как эти недостатки могут нарушить их сетевую инфраструктуру и почему исправления необходимы.1. Основные сведения об уязвимости SACK Panic
Три уязвимости безопасности были выявлены и связаны с манипулированием пакетами выборочного подтверждения TCP в сочетании с низким значением максимального размера сегмента (MSS).
Вы можете отследить три уязвимости, обнаруженные следующими CVE:
Ссылка скрыта от гостей
- это уязвимость, которая фактически вызывает панику ядра.
Ссылка скрыта от гостей
и
Ссылка скрыта от гостей
менее эффективны,
Ссылка скрыта от гостей
только интенсивное использование ресурсов и потенциальную атаку отказа в обслуживании.Чтобы лучше понять SACK Panic, нам нужно понять следующие определения:
Выборочное подтверждение TCP ( SACK ) - это метод, используемый TCP для снижения перегрузки, которая может возникнуть из-за повторной передачи отброшенных пакетов (сегментов).
Максимальный размер сегмента ( MSS ) - это набор параметров в заголовке TCP пакета, который указывает общий объем данных, содержащихся в восстановленном сегменте TCP.
Generic Segmentation Offload ( GSO ) - это чисто программная разгрузка, которая имеет дело со случаями, когда драйверы устройств не могут выполнять разгрузки из-за отсутствия поддержки аппаратного обеспечения.
Традиционно данные разделяются на небольшие отдельные пакеты и проходят через сетевой стек один за другим. GSO использует сетевой стек с одним большим пакетом, который включает в себя все данные. Если вы хотите погрузиться глубже, вы можете прочитать больше информации здесь.
2. Как работает SACK Panic
Опция SACK Panic означает выборочное подтверждение. Это более интеллектуальный механизм TCP, созданный для устранения избыточных данных. Он был представлен еще в 1996 году
Ссылка скрыта от гостей
от 2018 года.TCP - это протокол, ориентированный на установление соединения, который во время передачи данных фрагментируется на сегменты с максимальным размером сегмента (MSS). Это согласовывается в начале соединения в пакетах SYN, где рассматривается самое низкое значение MSS.
В демонстрационном разделе мы поговорим о двух системах: «отправитель» и «получатель».
Может случиться, что по разным причинам во время передачи пакет не может быть принят другой стороной. В этом случае, до того, как был введен SACK, «отправителю» приходилось повторно отправлять целое окно пакетов, чтобы получатель получил только тот, который его не был принят.
Например, скажем, «отправитель» дал 10 пакетов, а «получатель» получает все, кроме пакетов 4 и 7. Затем в следующей системе ACK «получатель» может прикрепить опцию SACK, заявив, что он получил пакеты от 1-3; 5 и 6; 8-10. Таким образом, «отправителю» нужно будет только отправить 2 пакета вместо 10.
Для управленияочередями и повторной передачей ядро Linux использует структуру с именем sk_buff.
Структура
Ссылка скрыта от гостей
содержит данные и может включать в себя различные уровни заголовков.Эта структура имеет связанный буфер управления с именем
Ссылка скрыта от гостей
который отслеживает различные аспекты пакета TCP.В этот элемент управления также включена структура, а также количество сегментов или количество фрагментов ( tcp_gso_segs ), которое отображается следующим образом:
Код:
struct tcp_skb_cb {
__u32 seq; / * Starting sequence number /
__u32 end_seq; / SEQ + FIN + SYN +datalen /
__u32 tcp_tw_isn;
struct {
U16 tcp_gso_segs;
U16 tcp_gso_size;
};
}
Как определено
Ссылка скрыта от гостей
:
Код:
#define MAX_SKB_FRAGS (65536 / PAGE_SIZE + 1)
Каждый фрагмент данных может иметь до 32 КБ, в результате максимум 17 * 32 КБ байтов данных содержится в sk_buff.
Здесь низкий MSS вступает в игру. Если мы установим значение MSS равным 48 (минимальное значение в TCP-соединении в Linux) и с параметрами TCP, накапливающими 40 байт, мы можем создать сегменты размером до 8 байт каждый.
Учитывая максимальные данные 17 * 32KB в sk_buff и разделив их на 8 байтов, мы получим
Ссылка скрыта от гостей
сегмента.Глядя на предел сегментов в tcp_gso_segs, достигающих 64 КБ, мы можем легко наблюдать потенциальное переполнение.
Механизм, лежащий в основе SACK, позволяет объединять пакеты во время повторной передачи TCP, а также объединяет несколько очередей SKB, в результате чего получается потенциальный SKB из 17 пакетов.
Код:
static bool tcp_shifted_skb (struct sock * sk,…, unsigned int pcount, ...)
{
tcp_skb_pcount_add (prev, pcount);
BUG_ON (tcp_skb_pcount (skb) <pcount); <= Things go south
tcp_skb_pcount_add (skb, -pcount);
}
В этом исходном
Ссылка скрыта от гостей
вызов BUG_ON () может быть инициирован, если фрагмент TCP достигает 17 и целочисленное переполнение tcp_gso_segs. 3. Как обнаружить SACK Panic с помощью Wireshark
Чтобы определить, уязвим ли целевой сервер, мы будем использовать Wireshark. Мы будем называть обе части клиента, конечной точкой и целью.
IP-адрес клиента в нашем тесте - 192.168.222.1, а IP-адрес цели - 192.168.222.3.
Прежде чем мы начнем, давайте сделаем быструю настройку на стороне клиента:
1. Установите параметры MSS
Добавьте параметры «advmss» к маршруту к вашей цели.
Код:
$ ip route change your_ip_route advmss 48
2. Убедитесь, что SACK включен:
Код:
$ cat /proc/sys/net/ipv4/tcp_sack
3. Включите Wireshark и начните слушать.
Код:
$ wireshark ИЛИ Запустите графический интерфейс Wireshark.
Выберите интерфейс и установите фильтр для IP, как это:
Код:
ip.addr == client_ip ИЛИ target_ip
4. Инициируйте TCP-соединение от клиента к серверу, используя следующие команды:
Вы можете использовать порт nc -lvp; nc ip_target port. Кроме того, вы можете попробовать HTTP GET на веб-сайте цели.
Код:
На цель:
$ nc -lvp 1234
На клиенте:
$ 192.168.222.3 1234
Примечание : не забудьте изменить свои IP-адреса.
Идем дальше к фактическому обнаружению:
На изображении выше вы можете увидеть, как должны выглядеть параметры клиента. Важным является то, что значение параметров MSS равно 48, а параметр SACK-enabled включен.
Так реагирует уязвимая цель. Это показывает, что опция SACK включена. В этом случае MSS обычно устанавливается по умолчанию, как указано в приведенной выше главе, на самое низкое используемое значение MSS.
Некоторые веб-сайты не соблюдают согласование MSS, поэтому вам необходимо проверить, не ограничен ли трафик до 48 байтов в дальнейшем. Как видите, длина данных TCP ('Len = x') ограничена 36 из-за 12 байтов опций TCP.
Напомним, что если SACK разрешен с обеих сторон и согласование MSS ограничивает данные до 48 байтов минус параметры, то система уязвима.
Чтобы быть уверенным, вы всегда можете проверить версию Linux, используя:
Код:
$ nmap -O 192.168.222.3
Это позволит выявить версию для Linux, а также дважды проверить уязвимость.
4. Как исправить уязвимость TCP SACK Panic
Чтобы предотвратить уязвимость ваших систем к этим атакам и повысить их безопасность, необходимо применить одно из следующих исправлений:
Исправление № 0: патч вашей системы .
Убедитесь, что вы применили последние исправления, доступные здесь, или просто выполните следующую команду:
Код:
$ sudo apt-get dist-upgrade
Исправление № 1: блокировка соединений с низким MSS с использованием фильтров.
Эти фильтры могут нарушать допустимые соединения, которые зависят от этого параметра, поэтому соблюдайте осторожность при их применении.
Код:
$ iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP
Исправление № 2 : отключить обработку SACK
Чтобы сделать это, вы должны быть суперпользователем, потому что обычные администраторы не имеют права изменять это значение.
Код:
$ echo 1 > /proc/sys/net/ipv4/tcp_sack
Помните, что одной из мер безопасности, упомянутых выше, должно быть достаточно для защиты от уязвимости TCP SACK Panic. Не обязательно применять их все .
Перевод:
Ссылка скрыта от гостей