LINUX.ORG.RU

В freenginx и nginx добавили проверку размера текстовой переменной перед тем как записывать в неё данные (+ CVE)

 , freenginx, ,


0

2

TL;DR: Столкнувшись с третьим обнаруженным за 2026 год переполнением буфера (и, по версии F5, RCE если нет ASLR) при работе с регэкспами и переменными, разработчик freenginx Максим Дунин решил, что пора это прекращать, и добавил в свой продукт проверку размера переменной перед тем как записывать в неё данные. Оттуда это нововведение утащили к себе и nginx, что даёт надежду на прекращение новых CVE на эту тему.

Теперь подробности.

19 июня был сделан коммит в freenginx, добавляющий в описатель переменной поле end, указывающее на конец буфера. Раньше там был только указатель на его начало (pos), нужная длина вычислялась (и сейчас вычисляется) заранее, и к моменту копирования в переменную данных предполагалось что правильно вычисленная ранее длина гарантирует, что данные в буфер влезут. К сожалению, уже два раза в мае 2026 года из-за различных недосмотров это оказывалось не так (1 (linux.org.ru), 2 (linux.org.ru)), что приводило к переполнениям буфера и плохим последствиям. Так вот, теперь при создании буфера переменной заполняется и указатель на её конец, а перед записью в переменную данных, если данные в неё не влезают, обработка запроса будет контролируемо завершаться с ошибкой. То есть ошибки вычисления длины могут находиться и дальше, но они будут теперь не бить память, а только фейлить конкретный http-запрос. Следующими коммитами (2 (freenginx.org), 3 (freenginx.org)) была добавлена аналогичная защита в другие места кода, включая код ведения access-лога. 7 июля была опубликована версия freenginx 1.31.3, включающая данное исправление.

15 июля данные коммиты были заимствованы nginx-ом (1 (github.com), 2 (github.com), 3 (github.com), почему-то поменяв местами второй и третий в цепочке), проблеме был назначен CVE-2026-42533, а F5 выпустило официальное SA (f5.com).

Касательно конкретной уязвимости на этот раз: она проявляется при использовании директивы map с регэкспами с выделяемыми параметрами. По поводу остальных необходимых для её срабатывания условий текст в описании коммита и текст в SA немного разнятся: в SA указано что в дальнейшем должно быть вычисление некоей строки, которое использует выделяемый параметр, оставшийся от map, раньше чем результат этого же map. В описании коммита в примере между этими шагами участвует ещё обнуление переменной, содержащей выделенный параметр. Как бы то ни было, в большинстве запущеных nginx-ов подобное скорее всего не встретится, и уязвимость таким образом мало кого затрагивала. Стоит так же отметить, что исправления расчёта длины конкретно в этом случае в закоммиченых правках кажется нет (или я плохо искал?), есть только защита, превращающая проблему в контролируемый фейл http-запроса. Хотя 19 июля в freenginx добавлены какие-то исправления (5bfb, 7622, b906) подсчёта длины для похожей ситуации, но точно сходу не понять, то это или нет.

Уязвимость появилась в версии nginx 0.9.6, исправления попали в версии freenginx 1.31.3, nginx 1.30.4, nginx 1.31.3.

В SA nginx указаны благодарности ряду лиц за независимые сообщения об уязвимости и соблюдение «стандартов скоординированного раскрытия информации»:

F5 acknowledges Ming Xuan, DKD (@pidifn), Ji'an Zhou, and Zhen Yan of AntAISecurityLab, Rafael Gacek, Sergii Negodiuk of EVO.company, Lam Jun Rong of Calif.io, Mufeed VH of Winfunc Research (winfunc.com), Vexera AI (https://vexera.ai), Tu Tran Dinh (@1w4y), Stan Shaw (cyberstan), qianshuidewajueji, zenneth (randomguy6407), Zhenpeng (Leo) Lin of depthfirst, Lukas Johannes Moeller, Melih Tolga Sahin of Vodafone Türkiye, Ayoub Nabil Boubagrat (GitHub: @ayoubnabil), and Milan Jovic (Kljunowsky) for independently bringing this issue to our attention and following the highest standards of coordinated disclosure.

В freenginx сопровождающая информация об исправлении фактически ограничивается сообщением при коммите. В changelog-е данное исправление даже не помечено ни подписью «безопасность» (security), ни «исправление» (bugfix), просто «добавление» (feature). Вероятно, автор не считал данную проблему критической. Как соотносятся сообщения о проблеме со стороны указанных лиц в F5 и заимствованный из freenginx коммит, сообщали ли они (или кто-то ещё) про проблему автору freenginx, выяснить не удалось.

>>> Коммит

★★★★★

Проверено: cetjs2 ()
Последнее исправление: firkax (всего исправлений: 4)

freenginx

Был же какой-то Angie вроде. Черт ногу сломит теперь в этих форках… Что одно лучше/хуже другого?

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

возможно оно уже никому не нужно
а все пользуются всякими кубернетоинтегрируемыми вещами

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

Angie - корпоративное с участием бывших сотрудников nginx, freenginx - личная инициатива другого бывшего сотрудника nginx.

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

разработчик freenginx Максим Дунин

Дулин блин😂 А хде Михалыч)?

REDDERa
()

добавил в свой продукт проверку размера переменной перед тем как записывать в неё данные

Таки ###шерето###.

zanac1
()
Ответ на: комментарий от imul

Был и есть. Фраза такая просто есть «был жеж такой-то аналог». Понимаешь? :)

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

А сам nginx тоже ж продолжает существовать? И что мне выбрать для себя, скажем, если возникнет необходимость?

Gonzo ★★★★★
()

Это как-то обобщается в практику, которую можно использовать во всех проектах?

А то исправили одну ошибку в одной софтине - не велика новость.

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

Ну конечно обобщается! В общем случае теперь всё переписываем на Раст.

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