Разбираем механику уязвимости CVE-2026-88772 в NetScaler ADC и NetScaler Gateway: почему переполнение памяти в обработчике DTLSпротокол защиты датаграмм, UDP-вариант TLS оказывается pre-authдо аутентификации пользователя и как из расхождения двух полей в заголовке DTLS вырастает перенаправление потока управления на shellcodeнабор машинных инструкций, который внедряется в память и исполняется процессом с правами root. Нетривиальность здесь в том, что уязвимость возникает не из-за ошибки в криптографии, а из-за несоответствия между тем, что заявляет заголовок записи, и тем, что реально копируется в буфер.
Что за уязвимость и почему она критична
CVE-2026-88772 классифицируется как memory overflow (переполнение памяти) при обработке DTLS (UDP-вариант TLS). Последствия — удалённое выполнение кода (RCE) или отказ в обслуживании (DoS). Уровень критичности по CVSS 4.0 — 9.5 CRITICAL с вектором AV:N/AC:H/PR:N/UI:N и высокими подоценками C/I/A. Метрики вектора означают: атака проводится по сети (AV:N), требует сложных условий (AC:H), не требует привилегий (PR:N) и участия пользователя (UI:N); высокий AC:H не снижает итоговую оценку, поскольку последствия по конфиденциальности, целостности и доступности оцениваются как высокие.
Эксплуатация возможна при включённом DTLS. На Gateway DTLS включён по умолчанию для VPN-виртуальных серверов, если администратор не установил -dtls OFF. В зону действия входят и vServers типа DTLS. Citrix подтвердила активную эксплуатацию CVE-2026-88771 и CVE-2026-88772 на незащищённых устройствах как zero-dayуязвимость, эксплуатируемая до выпуска исправления.
Анализ watchTowr показал, что переполнение можно использовать для перенаправления потока управления на произвольный shellcode с root-привилегиями, применив системный вызов mprotect() для обхода NXаппаратный запрет на исполнение данных в памяти. mprotect() меняет права доступа к страницам памяти, снимая этот запрет с области, куда записан shellcode, после чего управление передаётся на него.
Почему уязвимость pre-auth
Уязвимость считается pre-auth, потому что атака выполняется через DTLS-обработку в NetScaler Packet Processing Engine (NSPPE) — то есть до какой-либо аутентификации пользователя. Условие эксплуатации — наличие DTLS на NetScaler ADC или NetScaler Gateway. Поскольку на Gateway DTLS включён по умолчанию для VPN-виртуальных серверов, администратор, не выставивший -dtls OFF, оставляет эту поверхность открытой без дополнительных действий.
Архитектура уязвимой поверхности: DTLS в NetScaler
DTLS на NetScaler ADC/Gateway обрабатывается при включённом DTLS; на Gateway он включён по умолчанию для VPN-виртуальных серверов, если администратор не установил -dtls OFF. В область действия также входят vServers типа DTLS. Сама уязвимость — переполнение памяти при обработке DTLS, приводящее к RCE или DoS.
Исправленные пороги по веткам:
| Ветка | Исправленная сборка |
|---|---|
| ADC / Gateway 14.1 | 14.1-73.37 и новее |
| ADC / Gateway 13.1 | 13.1-64.23 и новее |
| ADC 14.1 FIPS | 14.1-73.37 FIPS |
| ADC 13.1 FIPS / NDcPP | 13.1.37.279 |
Более ранние сборки августа (14.1-73.32, 13.1-63.21) эту проблему не исправляют. PoC выполняет UDP/443 DTLS-пробу для обнаружения Gateway и сравнения сборки с 14.1-73.37 / 13.1-64.23.
Механика эксплойта: пошагово
В основе — несоответствие при разборе DTLS-заголовка. NetScaler неявно доверяет объявленному размеру фрагмента в поле fragment_length заголовка DTLS handshake (1 байт), тогда как поле length заявляет, что всё сообщение — 120 байт. fragment_lengthполе заголовка DTLS handshake, в котором отправитель указывает, сколько байт содержит данный фрагмент сообщения описывает один кусок, а lengthполе заголовка DTLS handshake, в котором отправитель указывает полный размер всего сообщения — всё сообщение целиком; расхождение возможно потому, что сервер проверяет эти поля по отдельности и не сверяет их между собой. Это позволяет атакующему создать запись, которая выглядит маленькой, но фактически копирует в буфер гораздо больше данных.
Атакующий присылает 120-байтовое handshake-сообщение как 120 фрагментов: у каждого length=120, но fragment_length=1, со смещениями 0, 1, 2…119. Когда все позиции получены, сервер считает сообщение полным — соединение кусков называется reassemblyсборка целого сообщения из пришедших по частям фрагментов.
Каждый принятый пакет размером 1 459 байт хранится в NetScaler Buffersвнутренние буферы NetScaler, в которых накапливаются принятые по сети пакеты до сборки сообщения, а затем сшивается в единый scratch bufferпромежуточный буфер, в который по частям собирается целое сообщение перед обработкой. Уязвимая версия не проверяет, поместится ли следующий пакет в scratch buffer, поэтому данные пишутся за его границу — это и есть переполнение буфера.
После 120 записей handshake-сообщение считается полным, но его цепочка NSBвнутренние буферы NetScaler, в которых накапливаются принятые по сети пакеты до сборки сообщения содержит около 174 КБ данных. По анализу watchTowr это переполнение можно использовать, чтобы перенаправить поток управления на произвольный shellcode с привилегиями root, применив mprotect() для обхода NX.
Как PoC из репозитория реализует проверку
PoC запускается через pip install -r requirements.txt, затем python poc.py с флагами. Режим --mode check выполняет проверку; добавление --dtls-probe включает опциональную отправку безопасного DTLS ClientHello. Флаг --build 14.1-73.32 задаёт проверяемую сборку, а --list targets.example.txt с -j 12 запускает проверку списка целей в 12 потоков.
PoC выполняет фингерпринт login-поверхностей Gateway/ADC, парсит build-строки при их наличии, проверяет UDP/443 и опционально шлёт benign DTLS ClientHello probe. Триггер переполнения памяти в PoC не включён — он не содержит оружия, применённого в реальных атаках.
Точные условия и пороги
Для эксплуатации требуется включённый DTLS; на Gateway он включён по умолчанию для VPN-виртуальных серверов, если администратор не установил -dtls OFF; DTLS-типы vServers также входят в область действия. Влияние конфигурации VPN описано так: эксплуатация возможна, когда DTLS включён на NetScaler ADC или NetScaler Gateway.
Версии и сборки в каталоге загрузок Citrix
В каталоге загрузок Citrix сборки NetScaler ADC/Gateway перечислены в двух фазах: Feature Phase (фаза новых функций) и Maintenance Phase (фаза поддержки).
Ветка 14.1, Feature Phase: 14.1-60.58 (NetScaler VPX Release, 23 марта 2026), 14.1 Build 60.58 (NetScaler Release, 24 марта 2026), 14.1-60.57 (NetScaler SDX Bundle, 24 марта 2026), 14.1 Build 56.74 (11 ноября 2025), 14.1 Build 51.80 (29 сентября 2025), 14.1 Build 47.48 (26 августа 2025), 14.1 Build 43.56 (17 июня 2025), 14.1 Build 38.53 (18 декабря 2024), 14.1 Build 34.42 (28 октября 2024), 14.1 Build 29.72 (12 ноября 2024), 14.1 Build 25.56 (7 июля 2024), 14.1 Build 21.57 (23 апреля 2024), 14.1 Build 17.38 (20 февраля 2024), 14.1 Build 12.30/12.35 (16 января 2024), 14.1 Build 8.50 (25 сентября 2023), 14.1 Build 4.42 (7 августа 2023).
Ветка 13.1, Maintenance Phase: 13.1 Build 64.24 (27 сентября 2026), 13.1-64.22 (3 сентября 2026), 13.1 Build 63.21 (19 августа 2026), 13.1 Build 62.23 (23 марта 2026), 13.1 Build 61.26 (20 января 2026), 13.1 Build 60.32 (11 ноября 2025), 13.1 Build 59.22 (26 августа 2025), 13.1 Build 58.32 (17 июня 2025), 13.1 Build 57.26 (4 февраля 2025), 13.1 Build 56.18 (18 ноября 2024), 13.1 Build 55.34 (12 ноября 2024), 13.1 Build 54.29 (22 июля 2024), 13.1 Build 53.24 (8 июля 2024), 13.1 Build 52.19 (11 марта 2024), 13.1 Build 51.14/51.15 (16 января 2024), 13.1 Build 50.23 (23 октября 2023), 13.1 Build 49.13/49.15 (10 октября 2023).
Ветка 13.1, Feature Phase: 13.1 Build 48.47 (12 июня 2023), 13.1 Build 45.61/45.64 (18 мая 2023), 13.1 Build 37.38 (29 ноября 2022), 13.1 Build 33.54 (1 декабря 2022), 13.1 Build 30.52 (30 августа 2022), 13.1 Build 27.59 (11 июля 2022), 13.1 Build 24.38 (7 июня 2022), 13.1 Build 17.42 (23 февраля 2022), 13.1 Build 12.50/12.51 (24 декабря 2021), 13.1 Build 9.60 (22 ноября 2021), 13.1 Build 4.43/4.44 (15 ноября 2021).
FIPS-сборки: 14.1 Build 73.37 (27 сентября 2026), 14.1 Build 72.61 (30 июня 2026), 14.1 Build 66.68 (6 мая 2026), 13.1 Build 37.279 (27 сентября 2026).
Ветка 13.0: SDX Bundle (Maintenance Phase) 13.0-92.31 (9 июля 2024) и Citrix ADC CPX Release (Maintenance Phase) 13.0 Build 92.31.
Пограничные случаи и наблюдаемые аномалии
При эксплуатации в режиме DoS для CVE-2026-88772 описаны только общие последствия: RCE или отказ в обслуживании при включённом DTLS. Наблюдаемые эффекты в виде краша, перезагрузки или отказа сервиса описаны для другой уязвимости — CVE-2026-88779, которую Citrix называет DoS-уязвимостью, но администраторы и исследователи наблюдали активность, указывающую на возможность RCE.
Сообщалось о неожиданных перезагрузках уже пропатченных устройств, повторных принудительных перезагрузках на NetScaler 14.1-73.37 и о том, что процесс nsaaad многократно падал, пока процесс Pitboss не достиг предела перезапусков и не перезагрузил устройство. Один администратор видел подготовленные имена пользователей аутентификации с shell-командами, которые скачивали полезную нагрузку с IP 213.209.159[.]55, сохраняли её как /v и исполняли файл; эти запросы появлялись непосредственно перед тремя подтверждёнными последовательностями краха nsaaad. При этом логи показывали попытки эксплуатации и коррелированные краши, но не подтверждали успешное выполнение команд.
Отдельно отмечена эксплуатация до и после публичного раскрытия: часть активности после раскрытия произошла примерно в течение 24 часов. Зафиксирована активность в honeypot без валидного SSL-сертификата — сертификат был намеренно оставлен просроченным. Подход описывается как «spray and pray».
Пост-эксплуатация: что делает атакующий
Описан Perl-скрипт update_c08937.pl, который среди пост-эксплуатационных действий создаёт локальную учётную запись sec_monitor с ролью суперпользователя, изменяя /flash/nsconfig/ns.conf. Скрипт размещает PHP-веб-шелл по пути /var/netscaler/logon/LogonPoint/.local_journal для удалённого выполнения команд и загрузки/скачивания файлов. Он также правит /etc/httpd.conf, чтобы включить выполнение PHP и сопоставить веб-шелл с URL, похожими на легитимные NetScaler CSS-ресурсы: запросы к файлам, выглядящим как CSS (включая receiver.min.css), вместо этого открывают скрытый PHP-веб-шелл. В другом наблюдении запросы к .ico-изображениям под /vpn/media/ перенаправлялись на вредоносные PHP-файлы, чтобы запросы к веб-шеллу выглядели как запросы к изображениям или CSS.
Для закрепления root-доступа скрипт архивирует /flash/nsconfig в /tmp/update_result_3567cs.tgz и выгружает архив на 64.94.85[.]67:443, после чего удаляет архив и сам себя, чтобы уменьшить след на диске.
Почему команды через веб-шелл обычно не работают с root-правами
Эксплуатация уязвимости изначально даёт root-права, но команды, выполняемые через веб-шелл, обычно запускаются под менее привилегированной учётной записью, под которой работают веб-серверы NetScaler. Чтобы сохранить root-доступ, атакующие изменяют права на /bin/sh, устанавливая бит setuid, после чего команды выполняются с повышенными привилегиями. Для применения изменений конфигурации они также перезагружают устройства NetScaler или перезапускают веб-сервер. Это позволяет выполнять команды с правами root через веб-шелл, создавать привилегированные учётные записи и обеспечивать постоянный root-доступ.
Что видит клиент и администратор
Unit 42 рекомендует искать подозрительные административные сессии, неизвестные исходящие соединения и необъяснимые пробелы в логах. Атакующие помещали закодированные команды в HTTP-запросы и добивались их выполнения через обработку журналов NetScaler, а также меняли конфигурацию HTTP-сервера, включали PHP и размещали доступную из интернета веб-оболочку.
NCSC-NL до публичного раскрытия разослал предварительное уведомление организациям в Нидерландах о двух критических zero-day в NetScaler, указав, что одна уязвимость позволяла размещать shellcode прямо в памяти, а технические детали второй ещё исследовались. NCSC также предупредил, что попытки эксплуатации могут возрасти после выпуска патчей.
Unit 42 предупреждает, что установка исправленной версии не удалит доступ злоумышленника, если тот успел закрепиться раньше, поэтому организациям рекомендуют сохранить снимки виртуальных устройств, журналы, дампы памяти и другие материалы для расследования. История CitrixBleed показывает, почему проверка на компрометацию нужна даже после обновления: украденные сессионные данные позволяли сохранять доступ к инфраструктуре, поэтому администраторам приходилось завершать активные сессии и принимать дополнительные меры уже после установки безопасной версии.
Рекомендации по реагированию
Администраторы получали закрытые предупреждения с необычно жёсткой рекомендацией немедленно отключить NetScaler. После выхода исправлений администраторам следует как можно скорее обновить затронутые устройства NetScaler ADC и NetScaler Gateway. Тем, кто не может сразу установить обновления, советуют уменьшить доступность из интернета, где это операционно возможно.
Такая рекомендация об отключении связана с риском простоя при обновлении: обновления NetScaler могут вызывать простой, поэтому предупреждение было дано заранее — чтобы организации успели подготовиться, внедрить защитные меры и быстро установить патчи, как только они появятся. Одного обновления может быть недостаточно, если злоумышленник уже закрепился: рекомендуют сохранять снимки, журналы и дампы памяти и искать подозрительные административные сессии, неизвестные исходящие соединения и пробелы в логах.
Связь с CVE-2026-88779
CVE-2026-88772 — это переполнение памяти, которое может привести к удалённому выполнению кода или отказу в обслуживании, тогда как CVE-2026-88779 описывается Citrix как уязвимость отказа в обслуживании, но исследователи наблюдали признаки удалённого выполнения кода.
Обе уязвимости эксплуатировались как zero-day. CVE-2026-88772 использовалась для обхода аутентификации, завершения NSPPE и получения root-доступа с последующей установкой веб-оболочек; CVE-2026-88779 проявлялась в неожиданных перезагрузках NetScaler и крафтовых именах аутентификации с shell-командами, загружающими полезную нагрузку. Патчинг обеих критичен: Citrix подтвердила эксплуатацию CVE-2026-88772 на незащищённых системах, а для CVE-2026-88779 администраторы сообщали о крашах даже на пропатченных версиях 14.1-73.37.
Что добавляет отчёт Mandiant
Mandiant описывает атаки как эксплуатацию, при которой эксплойты обходят аутентификацию и вызывают неожиданное завершение NSPPE, давая root-доступ. Механизм — передача специально искажённых или фрагментированных заголовков записей, вызывающая повреждение границ кучи в пакетном движке и перенаправление потока управления на произвольный shellcode с root-правами на FreeBSD. Это дополняет данные watchTowr о перенаправлении потока управления через mprotect() для обхода NX.
Mandiant также подтверждает постэксплуатационные шаблоны: установку PHP-веб-шеллов и правку конфигурации веб-сервера NetScaler, чтобы неисполняемые расширения обрабатывались как PHP, включая изменение /etc/httpd.conf для исполнения .deb-файлов как PHP и использование .sig-файлов с перенаправлением запросов к .ico в /vpn/media/ на вредоносные PHP-файлы. Кроме того, Mandiant сообщает о двух ранее недокументированных семействах вредоносного ПО: WHIPSHOTPHP-веб-шелл, замаскированный под Debian-пакет и хранящийся в каталоге скриптов NetScaler VPN и SLAPSHOTPython-инструмент TCP-туннелирования, соединяющий скомпрометированное устройство NetScaler и внутренние устройства, позволяя распространяться дальше в сеть.
Компромиссы и почему сделано именно так
DTLS на NetScaler Gateway включён по умолчанию для VPN-виртуальных серверов, если администратор не выставил -dtls OFF, поэтому pre-auth поверхность доступна без аутентификации. Уязвимость коренится в NSPPE. Причина — доверие объявленному fragment_length (1 байт) в заголовке DTLS handshake, тогда как поле length заявляет 120 байт; это расхождение позволяет собрать маленькие фрагменты, но скопировать большой объём данных. Каждый пакет 1 459 байт хранится в NSB и сшивается в единый scratch buffer всего 35 840 байт, при этом уязвимая версия не проверяет, поместится ли следующий пакет. В результате после 120 записей handshake считается завершённым, но цепочка NSB содержит около 174 КБ данных.
Почему «memory overflow → RCE», а не просто DoS
Уязвимость описывается как переполнение памяти, ведущее к RCE или DoS, а не только к DoS, потому что переполнение позволяет перенаправить поток управления на произвольный shellcode с привилегиями root. watchTowr показал это через mprotect() для обхода NX; Mandiant подтверждает, что специально сформированные или фрагментированные заголовки записей вызывают повреждение границ кучи в пакетном движке, перенаправляя поток управления на выполнение произвольного shellcode с root-привилегиями на FreeBSD. Эксплуатация требует включённого DTLS; на Gateway DTLS включён по умолчанию для VPN-виртуальных серверов, если администратор не установил -dtls OFF. Эксплойты обходят аутентификацию и вызывают неожиданное завершение NSPPE, давая root-доступ, а также наблюдались на неустранённых развёртываниях.
Что из этого следует на практике
- Поверхность открыта по умолчанию. На Gateway DTLS включён для VPN-виртуальных серверов, если явно не выставлен
-dtls OFF. Это значит, что уязвимость pre-auth доступна без каких-либо действий администратора, и в зону действия попадают также vServers типа DTLS. - Порог исправления — конкретные сборки, а не «последняя доступная». Для 14.1 это 14.1-73.37 и новее, для 13.1 — 13.1-64.23 и новее, для FIPS — 14.1-73.37 FIPS и 13.1.37.279. Сборки 14.1-73.32 и 13.1-63.21 проблему не исправляют.
- Обновление не закрывает вопрос компрометации. Если злоумышленник успел закрепиться (создать учётную запись
sec_monitor, поставить setuid на/bin/sh, развернуть веб-шелл), установка исправленной версии не удалит его доступ. Нужны снимки, журналы, дампы памяти и поиск подозрительных административных сессий, неизвестных исходящих соединений и пробелов в логах. - Признаки в трафике стоит искать по маскировке веб-шеллов. Правка
/etc/httpd.confпревращает запросы к файлам, похожим на CSS (receiver.min.css),.icoпод/vpn/media/или.deb, в исполнение PHP — то есть легитимные на вид пути могут вести к вредоносному коду. - Отключение шлюза — крайняя мера с ценой простоя. Обновления NetScaler могут вызывать простой, поэтому предупреждение об отключении давалось заранее: организациям нужно время на подготовку и защитные меры. Тем, кто не может обновиться сразу, рекомендуют уменьшить доступность из интернета.
- PoC для проверки не оружие. Публичный PoC фингерпринтит login-поверхности, парсит build-строки, проверяет UDP/443 и опционально шлёт benign DTLS ClientHello, но триггер переполнения в него не включён — оружие, применённое в реальных атаках, остаётся за пределами публичного кода.
Где смотреть в коде
Источники
- www.citrix.com/downloads/citrix-adc/
- github.com/…/README.md
- thehackernews.com/…/citrix-netscaler-cve-2026-88772-exploit.html
- www.bleepingcomputer.com/news/security/hackers-exploit-citrix-netscaler-zero-day-to-deploy-web-shells/
- www.bleepingcomputer.com/news/security/citrix-admins-warned-to-shut-down-netscalers-over-2-exploited-zero-days/
- www.bleepingcomputer.com/news/security/citrix-patches-netscaler-saml-zero-day-exploited-in-attacks/
- www.securitylab.ru/…/578029.php
- thehackernews.com/…/citrix-netscaler-post-exploitation.html