Атака даёт возможность атакующему отправить любые данные на любой порт пользователя, невзирая на применение на системе жертвы внутреннего диапазона адресов (192.168.x.x, 10.x.x.x), выход в сеть с которого напрямую закрыт и возможен только через транслятор адресов.
Принцип работы нового варианта атаки NAT slipstreaming (CVE-2021-23961, CVE-2020-16043) идентичен изначальному методу, отличия сводятся к использованию иных протоколов, которые для организации проброса через транслятор адресов или межсетевой экран обрабатываются механизмом отслеживания соединений ALG (Application Level Gateways). В первом варианте атаки для обмана ALG применялись манипуляции с протоколом SIP, в котором используется несколько сетевых портов (один для данных, а другой для управления). Второй вариант позволяет совершить подобные манипуляции с VoIP-протоколом H.323, в котором применяется TCP-порт 1720.
Кроме того, во втором варианте предложена техника обхода чёрного списка портов, недопустимых для использования с протоколом TURN (Traversal Using Relays around NAT), который применяется в WebRTC для взаимодействия двух хостов за разными NAT. TURN-соединения в WebRTC могут быть устанавлены браузерами не только для UDP, но и поверх TCP, и адресованы любому сетевому TCP-порту. Указанная особенность позволяет применить атаку NAT slipstreaming не только к H.323, но и к любым другим комбинированным протоколам, таким как FTP и IRC, которые входят в список портов, обращение по HTTP к которым не допускается, но не включены в список запрещённых портов для TURN. Метод также позволяет обойти добавленную в браузеры защиту от первого варианта атаки NAT slipstreaming, основанную на запрещение HTTP-запросов к порту 5060 (SIP).
Проблема уже устранена в недавних выпусках Firefox 85, Chrome 87.0.4280.141, Edge 87.0.664.75 и Safari 14.0.3. Помимо связанных с протоколом H.323 сетевых портов в браузерах также заблокирована отправка HTTP, HTTPS и FTP-запросов на TCP-порты 69, 137, 161 и 6566. В ядре Linux функциональность conntrack-модуля ALG в netfilter отключена по умолчанию начиная с выпуска 4.14, т.е. по умолчанию трансляторы адресов на базе свежих ядер Linux проблеме не подвержены.
Например, OpenWRT проблеме не подвержен даже при установке пакетов с модулями ALG. При этом уязвимость проявляется в дистрибутиве VyOS, в котором применяется ядро Linux 4.14, но явно включён флаг nf_conntrack_helper, активирующий ALG для FTP и H.323. Проблема касается и многих потребительских маршрутизаторов, поставляемых со старыми ядрами Linux или меняющих настройки ALG. Возможность совершения атаки также подтверждена для устанавливаемых на предприятиях межсетевых экранов и трансляторов адресов на базе оборудования Fortinet (FG64, 60E), Cisco (csr1000, ASA) и HPE (vsr1000).
Напомним, что для проведения атаки NAT slipstreaming достаточно, чтобы жертва запустила подготовленный атакующим JavaScript-код, например, открыв страницу на сайте злоумышленника или просмотрев вредоносную рекламную вставку на легитимном сайте. Атака состоит из трёх этапов:
- На первом этапе атакующий получает сведения о внутреннем адресе пользователя, который может быть определён при помощи WebRTC или, если WebRTC отключен, через перебор адресов с измерением времени отклика при запросе скрытого изображения (для существующих хостов попытка запроса картинки выполняется быстрее, чем для несуществующих за счёт таймаута перед возвращением ответа TCP RST).
- На втором этапе определяются параметры фрагментации пакетов, для чего выполняемый в браузере жертвы JavaScript-код генерирует большой (не вмещающийся в один пакет) запрос HTTP POST на сервер атакующего, используя нестандартный номер сетевого порта для инициирования настройки параметров сегментирования TCP и размера MTU в TCP-стеке жертвы. В ответ сервер атакующего возвращает TCP-пакет с опцией MSS (Maximum Segment Size), определяющей максимальный размер принимаемого пакета. В случае UDP манипуляция похожа, но основана на отправке крупного запроса WebRTC TURN для вызова фрагментации на уровне IP.
- На третьем этапе JavaScript-код генерирует и отправляет на TCP-порт 1720 (H.323) сервера атакующего специально подобранный HTTP-запрос (или TURN для UDP), который после фрагментации разделится на два пакета - первый включает HTTP-заголовки и часть данных, а второй образует корректный H.323-пакет, в котором указан внутренний IP жертвы. Суть в том, что, зная параметры фрагментации, можно отправить большой HTTP-запрос, хвост которого придётся на второй пакет. Попадающий во второй пакет хвост можно подобрать так, что он будет полностью соответствуют другому протоколу, для которого поддерживается обход NAT. В случае с H.323 можно симулировать пакет с командами перенаправления звонка, получив который система отслеживания соединений в сетевом стеке включит проброс пакетов для любого выбранного атакующим порта, считая, что данный порт используется для обработки звонка.