По време на състезанието Pwn2Own Berlin 2025 изследователят Манфред Пол демонстрира успешна атака срещу процеса на рендиране на Mozilla Firefox чрез използване на уязвимост в компилатора IonMonkey JIT. Въпреки факта, че не е успял да излезе извън пясъчника (out-of-bounds) на JavaScript енджина, самата находка е изключително значима – грешката е с идентификатор CVE-2025-4919. Още на следващия ден Mozilla отстрани проблема във Firefox 138.0.4, както бе съобщено в бюлетина по сигурността 2025-36. Организацията Zero Day Initiative определи на експлойта номера ZDI-25-291.
IonMonkey е JIT компилатор, използван в SpiderMonkey, JavaScript и WebAssembly енджина, който стои в основата на Firefox. По време на оптимизацията на кода IonMonkey използва функцията ExtractLinearSum, за да анализира линейни изрази, което позволява операции като „x + n“ да бъдат опростени до по-разбираема форма. Такъв анализ се използва по-специално за оптимизации, свързани с проверка на границите на масивите.
Функцията ExtractLinearSum връща структура SimpleLinearSum, представляваща линейна сума на променлива и константа. Тя може да работи в различни математически пространства: с модулна аритметика (Modulo), в безкрайно пространство без преливания (Infinite) и в неизвестно пространство (Unknown), което се определя динамично в зависимост от контекста.
Грешката е във функцията TryEliminateBoundsCheck – именно тя се занимава с премахването на излишните проверки на границите на масивите.
Ако компилаторът открие две последователни проверки на граници с изрази, които могат да се превърнат в една променлива с различни константи (например i+5 и i+10), той ги обединява в една. Ако обаче операциите се извършват в модулна аритметика, това води до некоректни изчисления.
Например, когато в изрази се използва битовата операция „|0“, се извършва принудително преобразуване към 32-битов тип с изрязване, което превръща събирането в модулно събиране. Това обърква компилатора: той приема, че индексите в изрази като (i+5)|0 и (i+10)|0 винаги се различават с фиксирана стойност, като пренебрегва възможността за препълване.
Както показа Пол, това кара компилатора погрешно да слива проверките и да разрешава достъп до отрицателни индекси – т.е. извън масива. В случай на масиви от тип Uint8Array с дължина 2³² байта това отваря възможност за четене и запис извън границите на заделената памет, предоставяйки примитиви за по-нататъшна експлоатация.
За успешна атака е достатъчно да се подготви масив и променлива, използвана като индекс, чиято стойност е близка до границата на 32-битовото пространство. Поради особености на компилацията при определени условия по време на оптимизацията се премахва критична проверка, което позволява на нападателя да адресира с отрицателнo отместване, като по този начин позволява достъп до чужда памет.
Функциите за изпълнение във Firefox дават възможност да се получат така наречените „addrOf“ и „fakeObj“ примитиви – инструменти, които могат да се използват за определяне на адреса на обект в паметта и за създаване на фалшив обект. Това, от своя страна, позволява да се презаписват указатели и структурата на паметта да се управлява ръчно.
Последният етап на атаката включва поставяне на шелкод в изпълнимо място в паметта (например във функция на WASM) и подправяне на адреса на входната му точка. По този начин се постига изпълнение на произволен код. Демонстрация на експлоатацията е достъпна в YouTube.
Трябва да се отбележи, че подобни уязвимости остават изключително редки и трудно откриваеми. Проблемът, описан в CVE-2025-4919 е свързан с тънкостите на логиката на компилатора и изисква мащабни алокации на памет, поради което вероятността да бъде открит при нормално тестване е по-малка. Това още веднъж подчертава значението на анализа на изходния код при търсенето на критични грешки.
Всичко важно от света на технологиите, директно в пощата ти.
С абонирането приемате нашите Условия и Политика за поверителност. Може да се отпишете с един клик по всяко време.
Коментирайте статията в нашите Форуми. За да научите първи най-важното, харесайте страницата ни във Facebook, и ни последвайте в Google Новини, TikTok, Telegram и Viber или изтеглете приложението на Kaldata.com за Android, iPhone, Huawei, Google Chrome, Microsoft Edge и Opera!