Защита от вклинивания в стороннее TCP-соединение Linux Kernel

Материал из support.qbpro.ru

Суть проблемы в недоработке механизмов ограничения интенсивности обработки ACK-пакетов, описанных в спецификации RFC 5961, что позволяет вычислить информацию о номере последовательности, идентифицирующей поток в TCP-соединении, и со стороны отправить подставные пакеты, которые будут обработаны как часть атакуемого TCP-соединения. Представленный метод не специфичен для конкретных TCP-стеков и проявляется при наличии расширений ограничения интенсивности обработки пакетов (RFC 5961), реализованных для борьбы с подбором номера последовательности TCP.

Суть атаки в наводнении хоста запросами для срабатывания ограничения в обработчике ACK-пакетов, который манипулирует общим для всей системы счётчиком, параметры которого можно получить меняя характер нагрузки. Атакующий может создать "шумовую завесу" для определения значения общего счётчика ограничения интенсивности ACK-ответов, после чего на основании оценки изменения числа отправленных пакетов, укладывающихся в лимит, определить номер клиентского порта и осуществить подбор номера последовательности для конкретного TCP-соединения (при совпадении счётчик лимита ACK уменьшится при неизменном потоке). Метод существенно упрощает подбор, позволяя осуществить его менее чем за минуту. В зависимости от условий успешность атаки составляет от 88 до 97 процентов.

Проблема уже подтверждена в Linux (CVE-2016-5696) и проявляется c 2012 года в выпусках ядра Linux c 3.6 по 4.7. В качестве обходного метода защиты рекомендуется увеличить лимит на число одновременно обрабатываемых ACK-пакетов, установив переменную /proc/sys/net/ipv4/tcp_challenge_ack_limit в очень большое значение. Для новых ядер значение по умолчанию увеличено со 100 до 1000 и добавлена дополнительная рандомизация для снижения предсказуемости параметров работы системы ограничения ACK-пакетов.

Пример: Example (refer to your system(s)' *nix documentation for exact steps):

sysctl net.ipv4.tcp_challenge_ack_limit=1073741823; grep -q
tcp_challenge_ack_limit /etc/sysctl.conf || echo
"net.ipv4.tcp_challenge_ack_limit=1073741823" >> /etc/sysctl.conf