Статья Как обнаружить уязвимость SACK Panic с помощью Wireshark

Недавно мы провели углубленный анализ уязвимости SACK Panic (которая впервые была раскрыта в июне 2019 года), чтобы выяснить ее эффективность для машин Linux. В ходе этого исследования мы нашли новый метод обнаружения уязвимых серверов с помощью популярного анализатора сетевого трафика Wireshark. В этой статье приводятся сведения об уязвимости SACK Panic, новом методе обнаружения и ряде мер по смягчению, рекомендованных для защиты от SACK Panic.

SACK-PANIC-VULNERABILITY-1.png


Хотя воздействие, по-видимому, ограничивается , эту проблему необходимо решить, чтобы пользователи поняли, как эти недостатки могут нарушить их сетевую инфраструктуру и почему исправления необходимы.

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;

};

}
Это поле tcp_gso_segs является двухбайтовым целым числом без знака и ограничивает его 65536 (64 КБ).

Как определено :
Код:
#define MAX_SKB_FRAGS (65536 / PAGE_SIZE + 1)
максимальное количество фрагментов в 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 пакетов.

Код:
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
Если он возвращает 1, то он включен.

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-адреса.

Идем дальше к фактическому обнаружению:

tcp_options_target.png


На изображении выше вы можете увидеть, как должны выглядеть параметры клиента. Важным является то, что значение параметров MSS равно 48, а параметр SACK-enabled включен.

tcp_options_client.png


Так реагирует уязвимая цель. Это показывает, что опция SACK включена. В этом случае MSS обычно устанавливается по умолчанию, как указано в приведенной выше главе, на самое низкое используемое значение MSS.

tcp_traffic_after.png


Некоторые веб-сайты не соблюдают согласование 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. Не обязательно применять их все .

Перевод:
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!