В TCP-стеке Linux и FreeBSD выявлена уязвимость, приводящая к отказу в обслуживании
Как сообщает opennet.ru в TCP-стеке ядра Linux выявлена опасная уязвимость (CVE-2018-5390), которая позволяет удаленно вызвать отказ в обслуживании из-за исчерпания доступных ресурсов CPU. Для совершения атаки достаточно отправить поток специальным образом оформленных пакетов на любой открытый TCP-порт. Атака может быть совершена только с реального IP-адреса (спуфинг невозможен так как требуется установка TCP-соединения).
Суть проблемы в том, что при определенных параметрах сегментирования ядро при поступлении каждого пакета вызывает достаточно ресурсоемкие функции tcp_collapse_ofo_queue и tcp_prune_ofo_queue. Из-за неэффективности применяемого алгортима необходимые для обработки сегментов ресурсы CPU линейно возрастают в зависимости от числа сегментов в очереди пересборки пакетов. При выполнении операции пересборки большого числа сегментов cоздаваемой нагрузки достаточно, чтобы полностью загрузить процессор при обработке потока с незначительной интенсивностью. Например, для появления существенных задержек в обработке запросов системой для каждого ядра CPU достаточно потока интенсивностью всего 2 тысячи пакетов в секунду.
141 root 20 0 0 0 0 R 97.3 0.0 1:16.33 ksoftirqd/26 151 root 20 0 0 0 0 R 97.3 0.0 1:16.68 ksoftirqd/28 136 root 20 0 0 0 0 R 97.0 0.0 0:39.09 ksoftirqd/25 161 root 20 0 0 0 0 R 97.0 0.0 1:16.48 ksoftirqd/30
Уязвимость проявляется на всех ядрах Linux, начиная с выпуска 4.9 (атака может быть проведена и против более старых ядер, но требует существенного более интенсивного потока пакетов). Проблема устранена в обновлении ядра 4.17.12. Обновления пакетов подготовлены для Debian, SUSE и Fedora, и ожидаются для Ubuntu и RHEL.
Дополнение: Проблема также проявляется во FreeBSD и вероятно в других операционных системах. Во FreeBSD проблема пока временно решена через ограничение размера очереди пересборки пакетов (net.inet.tcp.reass.maxqueuelen).