
Prova de Conceito CVE-2023-28205: Vulnerabilidade Use-After-Free no Apple WebKit
Esta vulnerabilidade afeta o Apple WebKit e pode ser explorada através de conteúdo web maliciosamente criado, potencialmente permitindo a execução de código arbitrário no contexto do processo WebKit.
A versão do WebKit afetada analisada neste repositório é baseada em WebKit-613.1.17.1 (linhagem PlayStation / Safari 15.4).
A prova de conceito desencadeia uma condição de uso após liberação (use-after-free, UAF) ao
atrasar intencionalmente o registro de objetos JavaScript como
Map e Date durante operações de clonagem estruturada.
Essa janela de tempo permite que o Coletor de Lixo (Garbage Collector, GC) do JavaScriptCore recupere objetos que ainda estão logicamente em uso, resultando na desreferenciação de ponteiros obsoletos durante a execução contínua.
SerializedScriptValueCloneDeserializer::deserialize()A vulnerabilidade reside na lógica de desserialização de clonagem estruturada, especificamente em como objetos JavaScript recém-criados são rastreados durante a desserialização recursiva.
Em SerializedScriptValue.cpp, o desserializador usa contêineres padrão
do WebKit, como:
Vector<JSObject*, 32> outputObjectStack;
Vector<JSMap*, 4> mapStack;
Vector<JSSet*, 4> setStack;
Esses contêineres Vector não são varridos pelo Coletor de Lixo.
Se um ciclo de coleta de lixo for acionado durante a desserialização
(por exemplo, via pressão de memória ou execução JS reentrante), objetos
referenciados apenas por esses contêineres podem ser coletados
incorretamente.
O desserializador, no entanto, continua a usar esses ponteiros pendentes, resultando em uma condição de uso após liberação.
O patch de segurança oficial do WebKit (commit c9880de) substitui esses
contêineres por MarkedVector, uma estrutura ciente de GC que registra
adequadamente seu conteúdo como raízes do GC.
Na versão analisada:
MarkedVector não está implementadoCloneDeserializer ainda usa VectorIsso confirma que a versão é totalmente vulnerável ao CVE-2023-28205.
A seguinte queda foi acionada de forma confiável pelo PoC e é consistente com uma desreferenciação de ponteiro obsoleto pós-GC.
SIGSEGV (11)0x0000000000000068SceNKWebProcesslibSceNKWebKit.sprxO endereço de falha 0x68 indica uma desreferenciação de ponteiro base
NULL com deslocamento de campo de objeto, uma assinatura clássica de acesso a um
objeto JavaScript liberado.
O estado dos registradores confirma:
RAX = 0x0 (base do objeto NULL)Esse comportamento de queda é uma manifestação direta do
UAF do CloneDeserializer descrito acima.