LINUX.ORG.RU

18-летнее RCE в nginx (CVE-2026-42945)

 , ,


0

4

13 мая была исправлена уязвимость в популярном для нагруженных систем веб-сервере nginx: CVE-2026-42945, потенциально могущая привести к RCE. Уязвимость появилась 18 лет (2008 год) назад в версии 0.6.27.

Для её эксплуатации в конфиге сервера должна быть определённая комбинация директив, не так что бы у всех присутствующая, но местами имеющая место, например такая:

rewrite ^(.*) /new?c=1;
set $myvar $1;
return 200 $myvar;
Существенные детали:

  • сначала идёт директива rewrite, где (первый аргумент) регулярное выражение с выделяемым параметром (что-то в круглых скобках) заменяется на (второй аргумент) путь, содержащий в себе знак вопроса;
  • директива set (вместо неё так же подойдёт второй rewrite или if), которая использует выделенный параметр из исходного перезаписанного пути (в данном случае это $1).

Уязвимость работает так:

  • первая директива rewrite, натыкаясь на знак вопроса, устанавливает внутренний флаг is_args, означающий «сейчас собираем get-параметры для заменённого урла, надо всё экранировать», и (в этом и суть бага) забывает сбрасывать этот флаг в конце своей работы;
  • последующая директива set, при формировании значения для $myvar, ошибочно применяет установленный ранее is_args, и записывает в my_var экранированное значение выделенного параметра $1; проблема в том, что буфер для $myvar выделяется раньше, ещё до выполнения подстановок, и его длина считается с is_args=0, то есть экранированное значение оказывается длиннее чем выделенный буфер, из-за чего запись происходит вне выделенного буфера в другие структуры данных сервера. Чтобы это произошло, достаточно прислать запрос с символами, подлежащими экранированию, например знаками «плюс», в месте выделения параметра регулярного выражения.

Если на хосте нет ALSR, то данная уязвимость может эксплуатироваться для удалённого выполнения кода с правами рабочего процесса nginx, есть PoC (там не эксплойт в чистом виде, демонстрация в песочнице).

Уязвимость исправлена в стабильной ветке nginx 1.30.1, и в новой девелоперской 1.31.0. ссылка на коммит.

Примечательно, что 14 лет назад (2012 год) похожая ошибка уже исправлялась в другом месте рядом.

-------

На сайте F5 имеется рекомендация по временной нейтрализации уязвимости на случай невозможности быстро обновить версию nginx - нужно заменить неименованные выделенные параметры на именованые, и в этом случае, по их словам, уязвимость проявляться не будет. Пример оттуда:

было: rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;
стало: rewrite ^/users/(?<user_id>[0-9]+)/profile/(?<section>.*)$ /profile.php?id=$user_id&tab=$section last;

Информация об уязвимости была предоставлена Zhenpeng (Leo) Lin из DepthFirst. Кроме того, он же сообщил о следующих проблемах, которые тоже исправлены:

  • CVE-2026-40701 (коммит) use-after-free при использовании ssl_verify_client+ssl_ocsp (вроде бы без RCE)
  • CVE-2026-42934 (коммит) чтение за пределами буфера в utf-8 парсере при специфических обстоятельствах, может привести к небольшой утечке данных или крашу рабочего процесса
  • CVE-2026-42946 (коммит) чрезмерное выделение памяти и чтение за пределами буфера при использовании модулей scgi/uwsgi, проблема проявляется при наличии злонамеренного бекэнда (upstream) через указанные протоколы, либо при mitm канала общения с бекэндом, может привести к чтению памяти nginx или крашу рабочего процесса

>>> Официальное объявление F5

★★★★★

Проверено: maxcom ()
Последнее исправление: maxcom (всего исправлений: 16)

Мне лень подробно изучать, но, подозреваю, что выделяемый параметр и реврайт на урл с знаком вопроса могут и в разных директивах находиться. Хотя шансы встретить такое в конфиге ещё меньше.

firkax ★★★★★
() автор топика

Уязвимость появилась 18 лет (2008 год) назад

Забирай меня скорей, Увози на сто морей, И целуй меня везде, Восемнадцать мне уже!

seiken ★★★★★
()
Ответ на: комментарий от daniyal

Смотря где. В пиндосии с 21 вроде только, придётся подождать ещё три года.

Chiffchaff
()

Может уже вести дайджест уязвимостей. Раз в неделю. А не каждый день по отдельности, пропуская половину?

AlexVR ★★★★★
()
Ответ на: комментарий от Somebody

Да я не для себя спрашиваю, для моего друга rceши)

daniyal
()
Ответ на: комментарий от Sylvia

А в чём связь?

В http/3 много дыр скорее всего ещё, по-моему лучше его не трогать. https://nginx.org/en/security_advisories.html В относительно недавних 1.25-1.26 ещё 6 уязвимостей исправили.

firkax ★★★★★
() автор топика
Последнее исправление: firkax (всего исправлений: 1)

Шерето!

Буду переходить на HAProxy, раз такое дело…

BydymTydym ★★
()
Ответ на: комментарий от firkax

в том, что если меня заставили собирать новье под bookworm, то я размотаю его по-полной

от QUIC кстати сразу возникает «вау-эффект» у (постоянных) посетителей

Sylvia ★★★★★
()
Ответ на: комментарий от Sylvia

собрать новьё

Можно просто строчку дописать было

--- a/src/http/ngx_http_script.c
+++ b/src/http/ngx_http_script.c
@@ -1195,20 +1195,21 @@ void
 ngx_http_script_regex_end_code(ngx_http_script_engine_t *e)
 {
     u_char                            *dst, *src;
     ngx_http_request_t                *r;
     ngx_http_script_regex_end_code_t  *code;
 
     code = (ngx_http_script_regex_end_code_t *) e->ip;
 
     r = e->request;
 
+    e->is_args = 0;
     e->quote = 0;
 
     ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
                    "http script regex end");
 
     if (code->redirect) {
 
         dst = e->buf.data;
         src = e->buf.data;

от QUIC кстати сразу возникает «вау-эффект» у (постоянных) посетителей

Какой? В виде неработающего из-за ркн сайта?

firkax ★★★★★
() автор топика
Ответ на: комментарий от firkax

зачем патчить и пересобирать , если можно пересобрать новое? не понимаю логику, тем более для MLKEM надо тащить новую OpenSSL

Этот сервер в белом списке, так что с последствиями деятельности вышеумомянутой конторы проблем нет.

«вау» в том, что страница загружена еще до того, как отпускаешь кнопку мыши при переходе по щелчку

Sylvia ★★★★★
()
Последнее исправление: Sylvia (всего исправлений: 1)
Ответ на: комментарий от Sylvia

А зачем было ждать уязвимость чтобы собирать новое? Я вот это тоже не понимаю. Если хочется новых фич можно и раньше было пересобрать новую версию с ними. Раз это сделано не было, значит видимо нет времени на изучение и/или тестирование. Если же надо исправить баг, то дописать строчку и запустить пересборку можно за короткое время, как и раньше не тратя время на изучение смены версии. Вот если бы фикс был длинным и нетривиальным, то да, «не хотелось возиться, но вынудили обновить».

firkax ★★★★★
() автор топика
Ответ на: комментарий от firkax

см выше - «создали повод», а то ведь как известно - «работает - не трожь»

и да, патчить - искать старые исходники, накладывать патч, собирать
собрать новую версию - скачать с nginx.org, собрать

для самых ленивых - можно ждать обновления пакета в дистрибутиве, хотя они там не особенно шевелятся для oldstable

к тому же QUIC его не везде включишь и не везде он нужен, зависит от сервера и сайтов на нем,
MLKEM... ну вот тоже пока не совсем однозначно, надо или нет, квантовые компьютеры они пока в супермаркетах не стоят в коробках на стеллажах, опять же в том же debian не спешат обновлять OpenSSL для поддержки

Sylvia ★★★★★
()
Последнее исправление: Sylvia (всего исправлений: 1)
Ответ на: комментарий от Sylvia

и да, патчить - искать старые исходники, накладывать патч, собирать

А, ну если так то да.

У меня не «искать» а просто запустить заранее известную команду в заранее известном сборочном контейнере, где уже всё скачено и подготовлено с прошлой компиляции (ну патч то конечно наложить придётся но это недолго).

debian не спешат обновлять OpenSSL для поддержки

nginx же умеет собирать его сам из соседней директории (никого больше не затрагивая), всегда так делаю

квантовые компьютеры они пока в супермаркетах не стоят

Да их вроде и в других местах нет в пригодном для практического использования виде. И будут ли - спорный вопрос.

firkax ★★★★★
() автор топика
Последнее исправление: firkax (всего исправлений: 3)
Ответ на: комментарий от firkax

у меня контейнер уже имеет версию Glibc выше чем bookworm, что заставляет меня собирать непосредственно на самом сервере 🤷‍♀️

nginx умеет, а вот такие вещи как openssh заставляют новые версии клиента материться при подключении на отсутствие поддержки постквантовой криптографии

Sylvia ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.