В njs 0.9.9 исправлена критическая уязвимость переполнения буфера кучи (CVE-2026-8711)

njs

Вышла версия 0.9.9 модуля njs (язык JavaScript для nginx). Этот релиз прежде всего важен исправлением опасной уязвимости, которая позволяла вызвать переполнение буфера кучи в рабочем процессе nginx. Проблема затрагивает всех, кто использует механизм js_fetch_proxy для маршрутизации запросов с клиентскими переменными. Учитывая масштаб распространения nginx, новость касается тысяч систем по всему миру.

Уязвимость CVE-2026-8711

Уязвимость получила идентификатор CVE-2026-8711. Она присутствует во всех версиях njs начиная с 0.9.4 (изменение dea83189) и до 0.9.8 включительно. Причина кроется в обработке значений директивы js_fetch_proxy, которые содержат переменные nginx, управляемые клиентом: $http_*, $arg_*, $cookie_* и подобные. Если в такой конфигурации JavaScript-обработчик локации вызывает метод ngx.fetch(), злоумышленник может отправить специально сформированный HTTP-запрос. В результате происходит запись за границы выделенной области памяти в куче (CWE-122, общий перечень слабостей - Heap-based Buffer Overflow).

По шкале CVSS версии 3.1 (Common Vulnerability Scoring System - общая система оценки уязвимостей) проблема получила 8,1 балла из десяти - уровень HIGH. В четвёртой версии CVSS оценка поднялась до 9,2 - уже CRITICAL. Эксплуатация требует высокой сложности атаки, однако аутентификация не нужна, а доступ по сети возможен. Особую тревогу вызывает то, что атака приводит к потенциальному выполнению кода, если на сервере отключена рандомизация адресного пространства (ASLR, Address Space Layout Randomization). В противном случае атака ограничивается перезапуском рабочего процесса nginx, что всё равно приводит к отказу в обслуживании.

Помимо исправления уязвимости, разработчики njs добавили несколько новых возможностей. Во-первых, появилась директива js_access, которая позволяет выполнять JavaScript-код на этапе проверки доступа к ресурсу. Во-вторых, доступны три асинхронных метода чтения тела запроса: r.readRequestText(), r.readRequestArrayBuffer() и r.readRequestJSON(). Они работают в контексте директив js_access и js_content и упрощают работу с входящими данными. Особого внимания заслуживает метод r.readRequestForm(), который парсит тело HTML-формы (типы application/x-www-form-urlencoded и multipart/form-data) и возвращает структурированный объект для доступа к полям. Наконец, добавлен метод jsVarNames(), возвращающий имена переменных, объявленных с помощью js_var.

Что касается самого исправления уязвимости, оно реализовано в новой версии njs 0.9.9, выпущенной одновременно с патчем. Пользователям, использующим nginx с модулем njs, настоятельно рекомендуется обновиться до этой версии. Если обновление невозможно по какой-либо причине, следует временно отказаться от использования js_fetch_proxy с переменными, поступающими от клиента, либо тщательно валидировать все входящие параметры.

Важно отметить, что атака возможна только при определённых условиях: директива js_fetch_proxy должна содержать хотя бы одну клиентскую переменную (например, $arg_id), а код JavaScript в соответствующей локации обязан вызывать ngx.fetch(). Таким образом, далеко не каждая конфигурация с js_fetch_proxy уязвима. Тем не менее, специалистам по безопасности стоит проверить свои инфраструктуры на соответствие этим условиям.

В целом, выход njs 0.9.9 - это стандартный шаг поддержки популярного продукта. Однако инцидент напоминает, что даже небольшие утилиты, интегрированные в высоконагруженные системы, могут стать источником серьёзных рисков. Особенно когда они имеют доступ к сетевым данным и переменным запросов. Уязвимость CVE-2026-8711 демонстрирует, как комбинация динамического программирования и пользовательского ввода без должной проверки приводит к классическому переполнению буфера.

По оценкам команды F5, которая развивает njs, проблема была выявлена в ходе внутреннего аудита кода. Разработчики указывают, что версии, достигшие окончания технической поддержки (EoTS), не проверялись на эту уязвимость, но обновление до актуальной ветки рекомендуется всем без исключения.

В заключение стоит подчеркнуть: обновление до njs 0.9.9 должно быть выполнено в ближайшее время, особенно для систем, где директива js_fetch_proxy используется с переменными от клиента. Дополнительной мерой защиты может стать включение ASLR на уровне операционной системы - это снизит риск выполнения кода даже в случае успешной эксплуатации. Но самый надёжный способ - своевременная установка патча.

Ссылки

Комментарии: 0