Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
POC-for-CVE-2023-41993 — Exploit de prova de conceito para CVE-2023-41993, uma confusão de tipo JIT do WebKit no Safari. Fornece primitivas addrof/fakeobj via manipulação de heap e confusão GetterSetter, permitindo leitura/escrita arbitrária no processo WebContent. | Kitploit
Ferramentas/GitHubGitHub/po6ix/poc-for-cve-2023-41993
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebDesenvolvimento de PayloadsExploração de Binários
GitHubpo6ix/poc-for-cve-2023-41993

POC-for-CVE-2023-41993

Exploit de prova de conceito para CVE-2023-41993, uma confusão de tipo JIT do WebKit no Safari. Fornece primitivas addrof/fakeobj via manipulação de heap e confusão GetterSetter, permitindo leitura/escrita arbitrária no processo WebContent.

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
Ver Repositório
20237há 2 anosRevisado pelo Kitploit

CVE-2023-41993

PoC exploit para CVE-2023-41993. Está escrito apenas até addrof/fakeobj. A confiabilidade não é muito boa. Se você quiser melhorá-lo, tente pulverizar os IDs de estrutura.

Link do POC

https://po6ix.github.io/POC-for-CVE-2023-41993/pwn.html

Decidi hospedar com GitHub Pages devido a múltiplos pedidos.
Desejem-me sorte para que o GitHub não me bloqueie...

Versões Afetadas Conhecidas

  • MacOS 14.0
  • iOS 17.0, 17.1 beta 1
  • iPadOS 17.0

Versão Não Afetada Conhecida

  • iOS 16.1.1, 16.2, 16.5, 16.5.1, 16.6 beta 1, 16.6.1, 16.7.1, 17.1 RC
  • iPadOS 17 beta 1

Perguntas e Respostas

Apenas trava

É porque o valor do fator definido na função pwn não está correto para o seu dispositivo.
Para esse caso, eu o fiz usar um valor aleatório entre 87 e 1088.
Então você pode encontrar o valor do fator correto apenas atualizando algumas vezes.
Provavelmente funcionará em até 100 tentativas.
Também seria bom se você pudesse me enviar as informações exibidas no caso de sucesso.

Então, o que posso fazer com isso?

Isso fornece uma primitiva de leitura/escrita para o processo webcontent do Safari.
Mas para realmente torná-lo útil, você precisará encadear com outros componentes.

Breve Explicação

Você pode querer um artigo detalhado sobre isso, mas infelizmente não tenho tempo para escrever.
Então, escrevo algumas anotações aqui para que você possa entender como isso funciona.

Se você olhar o commit, é sobre a mudança no HeapLocation. Um novo fator foi adicionado para saber se os nós são iguais ou não. Isso nos diz que nós como GetByOffset, MultiGetByOffset podem ser confundidos. Mas na verdade é apenas sobre o offset. Digamos que existam dois nós GetByOffset com offsets diferentes. Um deles será submetido a CSE e o restante será usado em seu lugar. Então é basicamente uma confusão de offset, mas não fornece acesso a um offset arbitrário, pois para que esse tipo de nó passe por CSE, eles precisam ser içados pelo LICMPhase. Para os tipos de nó que realizam operações de escrita, não é permitido serem içados nesta fase. Portanto, a mesma confusão não ocorre com nós PutByOffset, MultiPutByOffset. Além disso, quando GetByOffset é içado, a função safeToExecute é chamada para verificar se o nó é legítimo para execução e permite acesso apenas ao offset menor que a capacidade de armazenamento (inline/ool). Então a ideia para explorar isso foi GetterSetter. Se você chamar Object.__defineGetter__ para definir uma propriedade, um objeto GetterSetter é criado, mas armazenado no armazenamento de propriedades e não é acessível normalmente. Mas você pode com essa manipulação de offset que possui. Então você chama a função Object para desencadear uma confusão de tipos.

root@kitploit:~
JSObject* JSCell::toObjectSlow(JSGlobalObject* globalObject) const
{
    Integrity::auditStructureID(structureID());
    ASSERT(!isObject());
    if (isString())
        return static_cast<const JSString*>(this)->toObject(globalObject);
    if (isHeapBigInt())
        return static_cast<const JSBigInt*>(this)->toObject(globalObject);
    ASSERT(isSymbol());
    return static_cast<const Symbol*>(this)->toObject(globalObject);
}

Isso criará um SymbolObject que tem o GetterSetter como valor interno. E isso está incorreto, pois esse valor interno de SymbolObject deveria ser uma instância de Symbol, não GetterSetter.

root@kitploit:~
let getterSetter = jitme(1);
let symbolObject = Object(getterSetter);

symbolObject.description; // call the getter
root@kitploit:~
String Symbol::description() const
{
    auto& uid = m_privateName.uid();
    return uid.isNullSymbol() ? String() : uid;
}

Então, quando você chama o getter description, ele retorna uma instância de String. Isso é uma confusão de tipos entre Symbol.m_privateName e GetterSetter.m_getter. Cada vez que você chama esse getter, ele incrementa o campo de contador de referência de m_privateName.m_uid, que está no offset 0x0. Isso é muito útil, porque esse offset é onde está o ID de estrutura da função getter. Ao chamar essa função algumas vezes, você pode alterar o ID de estrutura de uma instância JSFunction. Preparei outro tipo que possui muitas propriedades. Então, se você sincronizar o ID de estrutura para que seja igual ao dele, você pode fazer uma escrita fora dos limites no armazenamento de propriedades. Isso fornece diretamente a primitiva addrof/fakeobj.

Referência

  • Módulo Int64: https://github.com/saelo/jscpwn
Baixar ferramenta