
PoC CVE-2023-28205: Уязвимость использования после освобождения в Apple WebKit
Эта уязвимость затрагивает Apple WebKit и может быть использована через специально сформированное веб-содержимое, потенциально позволяя выполнение произвольного кода в контексте процесса WebKit.
Затронутая сборка WebKit, проанализированная в этом репозитории, основана на WebKit-613.1.17.1 (линия PlayStation / Safari 15.4).
Концепт-эксплойт инициирует состояние использования после освобождения (UAF),
намеренно задерживая регистрацию JavaScript-объектов, таких как
Map и Date, во время операций структурированного клонирования.
Это временное окно позволяет сборщику мусора JavaScriptCore (GC) освобождать объекты, которые всё ещё логически используются, что приводит к разыменованию устаревших указателей при дальнейшем выполнении.
SerializedScriptValueCloneDeserializer::deserialize()Уязвимость находится в логике десериализации структурированного клонирования, а именно в том, как отслеживаются вновь созданные JavaScript-объекты во время рекурсивной десериализации.
В SerializedScriptValue.cpp десериализатор использует стандартные контейнеры
WebKit, такие как:
Vector<JSObject*, 32> outputObjectStack;
Vector<JSMap*, 4> mapStack;
Vector<JSSet*, 4> setStack;
Эти контейнеры Vector не сканируются сборщиком мусора.
Если во время десериализации запускается цикл сборки мусора
(например, из-за нехватки памяти или повторного выполнения JS), объекты,
на которые ссылаются только эти контейнеры, могут быть ошибочно собраны.
Однако десериализатор продолжает использовать эти висячие указатели, что приводит к состоянию использования после освобождения.
Официальный патч безопасности WebKit (коммит c9880de) заменяет эти
контейнеры на MarkedVector — структуру, учитывающую GC, которая корректно
регистрирует своё содержимое как корни GC.
В проанализированной сборке:
MarkedVector не реализованCloneDeserializer по-прежнему использует VectorЭто подтверждает, что сборка полностью уязвима к CVE-2023-28205.
Следующий сбой был надёжно воспроизведён PoC и согласуется с разыменованием устаревшего указателя после GC.
SIGSEGV (11)0x0000000000000068SceNKWebProcesslibSceNKWebKit.sprxАдрес ошибки 0x68 указывает на разыменование нулевого базового указателя со
смещением поля объекта — классический признак доступа к освобождённому
JavaScript-объекту.
Состояние регистров подтверждает:
RAX = 0x0 (база объекта NULL)Это поведение сбоя является прямым проявлением описанного выше
UAF в CloneDeserializer.