В продължение на 15 години една специално изработена уеб заявка е можела тихо да превземе Nginx сървър – софтуерът, който получава и пренасочва входящия трафик за приблизително една трета от уебсайтовете в интернет.

Дефектът е бил документиран публично преди години и отбелязан като нещо за отстраняване, но опасността е останала неразпозната, докато изследовател не го преглежда отново изминалата седмица.

Nginx е софтуерът, разположен на първа линия пред голяма част от интернет. Когато отворите сайт, има голяма вероятност Nginx да е първото нещо, което прочита вашата заявка, справя се с криптирането, решава накъде трябва да тръгне тя и я препраща към инфраструктурата зад него.

Той се намира точно на преден план, изложен е на открития интернет и чете данни, които идват директно отвън. Тъкмо тази позиция прави грешка в паметта вътре в него изключително опасна.

На 15 юли F5, компанията, която поддържа Nginx, пусна корекции за сигурност за уязвимост, проследявана като CVE-2026-42533. Тя има оценка 9.2 от 10 по CVSS v4, което я поставя твърдо в критичната категория. Отдалечен атакуващ без профил и специален достъп може да изпрати специално съставена HTTP заявка и да предизвика препълване на буфера в динамичната памет (heap buffer overflow) във работния процес на Nginx. В най-лекия случай това срива или рестартира работния процес, причинявайки отказ на услуга (DoS). При подходящи условия уязвимостта позволява отдалечено изпълнение на код (RCE), при което киберпрестъпникът изпълнява собствен злонамерен код на вашия сървър.

Има уловка и спестяването ѝ би било подвеждащо. Използването на по-стара версия само по себе си не е достатъчно. Заплахата зависи от вашата конфигурация.

Nginx ви позволява да съпоставяте части от URL или име на host с даден шаблон и да използвате повторно прихванатите елементи, записани като $1, $2 и т.н. Той също така ви позволява да изградите малка таблица за търсене, наречена map, като тази map таблица може да използва собствен шаблон, за да определи резултата си. Проблемът започва, когато конфигурацията използва един от тези прихванати елементи и малко по-надолу в същия блок използва map таблица със собствен шаблон. Тъкмо тази последователност задейства дефекта.

Много конфигурации никога не го правят, но много други го правят без да се замислят, особено настройки, които предават детайли за заявката към фоновия сървър.

Това, което прави тази уязвимост от тип нулев ден (която вече е известна) забележителна, е нейната възраст. Уязвимият код присъства в Nginx от март 2011 г., когато функционалността map за първи път получава възможност да използва шаблони. Странното поведение под нея обаче е забелязано и описано дълго преди някой да го разгледа като проблем със сигурността. Назад през 2014 г. потребител подава доклад в публичния проследяващ дефекти сайт на Nginx, описващ абсолютно същото нещо – че map с шаблон презаписва прихванатите стойности от по-ранно правило и така референция $1 тихо връща различни данни в зависимост от това дали map съвпада.

През следващите години билетът събира още пет доклада, сочещи към същия проблем. За повече от десетилетие грешното поведение е било документирано и публично известно, но връзката с компрометиране на паметта е останала незабелязана досега.

Стен Шоу, изследовател, публикуващ под псевдонима cyberstan, е човекът, който най-накрая свързва тази стара особеност с препълване на динамичната памет и заобикаляне на ASLR защитата.

За да разберете защо подредбата чупи нещата, е нужен един детайл за това как Nginx изгражда текст при обработка на заявка. Той върши работата на два етапа. Първият обхожда стойността, измерва колко байта ще са необходими и заделя буфер с точно този размер. Вторият обхожда същата стойност отново и записва действителните байтове в този буфер. Дизайнът разчита на едно единствено предположение – че и двата етапа виждат едно и също нещо. Тъкмо тук конструкцията се чупи.

Тези $1 прихващания не се копират в стойността при съвпадението. Те се четат на живо от едно споделено място в заявката (масив r->captures). Когато map се оценява между двата етапа, нейното съвпадение записва нови резултати в това споделено място, сочещи към различно парче от заявката, контролирано от атакуващия (напр. хедър или тяло на заявката). Нищо не запазва старата стойност и нищо не я възстановява след това. Първият етап измерва къса стойност и заделя малък буфер, map подменя мястото с по-дълъг низ на злонамерения субект, а вторият етап прочита $1 отново, вижда дългата версия и записва извън пределите на буфера.