Уязвимость в LibJS, позволяющая выполнить код при открытии страницы в браузере Ladybird

В JavaScript-движке LibJS, применяемом в web-браузере Ladybird, выявлена уязвимость (CVE-2025-47154), позволяющая добиться выполнения своего кода в системе при обработке специально оформленного JavaScript-кода. Уязвимость вызвана обращением к уже освобождённой области памяти из-за освобождения памяти на вектор m_argument_values_buffer, на который оставался указатель в структуре arguments_list. Доступен рабочий пототип эксплоита.

Выявивший проблему исследователь провёл fuzzing-тестирование LibJS, в коде которого были зафиксированы 10 аварийных завершений. Разбор одного из сбоев показал, что проблема может быть эксплуатирована при обработке JavaScript-кода. Уязвимость позволяла читать и записывать в произвольные области памяти процесса. Выполнение кода было организовано в эксплоите через замену указателя возврата из функции отрисовки. При помощи возвратно-ориентированного программирования (ROP – Return-Oriented Programming, эксплоит формируется из уже имеющихся кусков машинных инструкций, завершающихся инструкцией возврата управления) была сформирована цепочка для выполнения системного вызова execve с для запуска внешнего приложения.

Браузер Ladybird развивается Андреасом Клингом, который когда-то работал в компании Nokia и занимался разработкой KHTML, а затем в Apple был одним из разработчиков Safari. На текущем этапе развития Ladybird находится на стадии пре-альфа версии, пригодной только для использования разработчиками. Изначально проект был создан как приложение для операционной системы SerenityOS, но летом прошлого года был выделен в отдельный проект и получил пожертвование в 1 млн. долларов. Браузер написан на языке С++ (решено перейти на язык Swift) и распространяется под лицензией BSD. Проектом развиваются собственный движок LibWeb, JavaScript-интерпретатор LibJS и сопутствующие библиотеки.

Release. Ссылка here.