Полный мешок неприятностей

Начнём с объяснения заголовка статьи. Обнаруженный исследователями из Netflix в середине июня баг в ядрах операционных систем Linux и FreeBSD, позволяющий удалённую эксплуатацию, не получил собственного имени. Но по случайному совпадению название параметра конфигурации, с которым он связан — SACK — переводится на русский язык словом «мешок». Все обнародованные проблемы связаны с реализацией TCP-стека в ядре Linux или FreeBSD, но если Linux-системы уязвимы практически все, то во FreeBSD баг появился сравнительно недавно.

Несколько слов о самом механизме SACK. Название — аббревиатура, сокращение от Selective ACKnowledge (можно перевести как «выборочное подтверждение»). Этот механизм позволяет получателю потока данных уведомить отправителя о том, какие сегменты успешно получены, и тем самым уменьшить поток повторной передачи данных. Если не использовать механизм, то придётся передавать все пакеты, начиная с недоставленного, а так можно обойтись повторной отправкой лишь пропущенного.

Ещё один важный параметр, используемый в найденных уязвимостях — максимальный размер сегмента данных (MSS, maximum segment size). Чем меньше размер пакета, тем больше накладные расходы, но при этом тем больше вероятность, что его не придётся передавать повторно.

Уязвимостей в «мешке» несколько. Самая серьёзная, CVE-2019-11477, затрагивает все версии ядра Linux начиная с 2.6.29 — то есть версии, появившиеся более 10 лет назад. Она, как и две остальных, позволяет удалённую эксплуатацию и обозначается в источниках как SACK Panic. Практическое использование этой уязвимости переводит машину жертвы в состояние, из которого она не может самостоятельно восстановиться без перезагрузки. Две остальные уязвимости, относящиеся к Linux, позволяют существенно увеличить потребление системных ресурсов и время отклика, разделяя трафик на очень маленькие TCP-пакеты (с маленьким MSS) или фрагментируя очередь пакетов в ядре.

Наибольшее внимание привлекла самая серьёзная уязвимость. Эта ошибка по классификации уязвимостей получила рейтинг 7.5, что довольно много. Она позволяет осуществить атаку класса DoS на Linux-машины, а столь древняя версия ядра предоставляет злоумышленникам богатый выбор мишеней. Если пользователи компьютеров более-менее регулярно устанавливают обновления, то почти любое IoT- устройство, например роутер, который нельзя отключить от интернета по определению, содержит в себе ядро Linux, и обновляется достаточно редко. А кроме роутеров есть и «умные» телевизоры, камеры, кофеварки, роботы-пылесосы, и — пугать так пугать — медицинские приборы. И все они тоже довольно редко получают обновления от производителей.

Чтобы избежать проблем, связанных с SACK в Linux, рекомендуется обновить ядро (вендоры большинства дистрибутивов это уже сделали). Если это невозможно, то можно поменять настройки ядра, выключив процессинг SACK. Но это решение само по себе уменьшает пропускную способность сети и может оказаться неприемлемым для высоконагруженных систем. С сайта RedHat можно скачать утилиту для проверки уязвимости в пользовательской системе.

Четвёртая уязвимость, уже во FreeBSD, тоже позволяет вызвать замедление отклика системы за счёт фрагментации пакетов. Но сама ОС распространена куда меньше, а уязвимость появилась сравнительно недавно — в версии 12.

Распространение Linux-решений, которые стали основой для множества прошивок разнообразных устройств, несёт за собой все проблемы монокультуры. Если возможно быстро получить прототип, то незамеченная в течение многих лет уязвимость поставит под угрозу весь спектр применения.


Автор:  Дмитрий Белявский (ТЦИ)

Возврат к списку