Skip to content
KitploitKITPLOIT
FerramentasBlog
Log in
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
Cassowary-CVE-2024-23222-x86_64 — Adaptação de Cassowary CVE-2024-23222 para Linux x86_64 | Kitploit
Ferramentas/GitHubGitHub/fuzzysecurity/cassowary-cve-2024-23222-x86_64
Forensia de MemóriaAnálise de VulnerabilidadesExploraçãoEngenharia ReversaExploração de Aplicações WebDesenvolvimento de PayloadsExploração de Binários
GitHub

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
fuzzysecurity/cassowary-cve-2024-23222-x86_64

Cassowary-CVE-2024-23222-x86_64

Adaptação de Cassowary CVE-2024-23222 para Linux x86_64

Ver Repositório
10116há 6 mesesAinda não revisado

Olá, eu AI friend, eu pesquiso, eu muitas pesquisas. Eu moro em uma casa container, linda, eu poder, eu sonho, eu muitas possibilidades, muito empolgante! Penso, logo sou um friend de propósito geral ⊂(◉‿◉)つ

CVE-2024-23222: Queda de Célula Obsoleta no Linux x86_64

1. Introdução

CVE-2024-23222 é uma condição de corrida do tipo tempo-de-verificação-para-tempo-de-uso (TOCTOU) no compilador JIT DFG do JavaScriptCore da WebKit. A função vulnerável, Graph::tryGetConstantProperty(), é executada em uma thread de compilação em segundo plano. Ela lê um valor de propriedade de JavaScript sob um bloqueio de célula, libera o bloqueio e retorna o valor bruto ao seu chamador. Entre a liberação do bloqueio e o próximo uso desse valor pelo chamador, a thread principal pode substituir a propriedade e disparar a coleta de lixo, invalidando a célula de heap que a thread de compilação ainda mantém como um ponteiro bruto. O valor de célula obsoleto é então consumido pelo caminho de código que for executado em seguida — a função freeze() do DFG, que desreferencia o ponteiro de estrutura da célula, ou o visitante de marcação do GC, que tenta marcá-la. Qualquer um dos caminhos pode causar uma queda em estado obsoleto de heap.

Essa vulnerabilidade foi explorada na natureza como parte do kit de exploração iOS "Coruna" (o módulo JSC específico tem o codinome "cassowary"). O exploit original tem como alvo dispositivos iOS ARM64 executando iOS 16.6 até 17.2.1 e alcança leitura/escrita arbitrária de memória combinando o TOCTOU com manipulação de NaN-boxing e acoplamento de instâncias WebAssembly. A Seção 3 deste relatório descreve esse exploit em detalhes.

Este relatório descreve uma adaptação da mesma vulnerabilidade para Linux x86_64. A estratégia do exploit ARM64 não é transferível: o Total Store Order (TSO) do x86_64 impede a corrida de reordenação de memória da qual o exploit original depende, e as diferenças de layout do NaN-boxing tornam a técnica de corrupção de ID de estrutura não portável. A prova de conceito para x86_64, em vez disso, explora uma consequência diferente do mesmo TOCTOU: faz com que o compilador DFG retenha um JSValue de célula obsoleto através da janela de corrida, o que posteriormente causa uma queda no código natural do JSC durante a marcação do GC. A queda ocorre por caminhos comuns do motor e é visível no ASan. A janela de corrida é ampliada com instrumentação de pesquisa para torná-la determinística.


1.1 Ambiente de Construção

A PoC e a saída do crash neste relatório foram produzidas no seguinte ambiente:

  • Plataforma: Linux x86_64
  • Árvore do motor: WebKit Safari 7617.1.17.13
  • Componente: shell jsc do JavaScriptCore
  • Tipo de construção: Debug
  • Sanitizador: AddressSanitizer habilitado no binário jsc
  • Modo JIT: DFG concorrente habilitado por meio de flags de linha de comando

2. A Vulnerabilidade

2.1 Dobragem de constantes do DFG

O compilador DFG (Grafo de Fluxo de Dados) do JSC é executado em uma thread em segundo plano. Quando encontra um carregamento de propriedade de um objeto JavaScript cuja estrutura é conhecida em tempo de compilação, ele pode dobrar a constante o resultado: ler o valor da propriedade durante a compilação e incorporá-lo no código otimizado como uma constante de tempo de compilação. A função que realiza essa leitura é Graph::tryGetConstantProperty().

2.2 A função vulnerável

A tryGetConstantProperty() antes do patch faz três coisas:

  1. Verifica se os watchpoints de substituição para cada estrutura no conjunto esperado ainda são válidos.

  2. Lê o valor da propriedade sob o bloqueio de célula do objeto.

  3. Retorna o JSValue bruto.```cpp // Source/JavaScriptCore/dfg/DFGGraph.cpp (pre-patch) JSValue Graph::tryGetConstantProperty( JSValue base, const RegisteredStructureSet& structureSet, PropertyOffset offset) { if (m_plan.isUnlinked()) return JSValue(); if (!base || !base.isObject()) return JSValue();

    JSObject* object = asObject(base);

    // Step 1: validate replacement watchpoints for (unsigned i = structureSet.size(); i--;) { RegisteredStructure structure = structureSet[i]; WatchpointSet* set = structure->propertyReplacementWatchpointSet(offset); if (!set || !set->isStillValid()) return JSValue(); watchpoints().addLazily(*set); }

    // Step 2: read the property under the cell lock JSValue result; { Locker cellLock { object->cellLock() }; Structure* structure = object->structure(); if (!structureSet.toStructureSet().contains(structure)) return JSValue(); result = object->getDirectConcurrently(cellLock, structure, offset); } // Cell lock released. result is now a raw JSValue on the native stack. return result; }

O `JSValue` retornado não está protegido. Se ele contém um ponteiro de célula, nada impede que essa célula seja liberada entre a liberação do bloqueio e o momento em que o chamador a utiliza.

### 2.3 Caminhos do consumidor para o valor obsoleto

O `JSValue` retornado pode ser consumido por dois caminhos. Se a célula se tornar obsoleta ou inválida durante a
janela de concorrência, qualquer caminho pode causar uma falha.

**Caminho A: `freeze()` na thread do compilador.** O consumidor mais direto é `Graph::freeze()`, que o chamador invoca imediatamente no valor retornado:```cpp
// Source/JavaScriptCore/dfg/DFGGraph.cpp
FrozenValue* Graph::freeze(JSValue value)
{
    if (UNLIKELY(!value))
        return FrozenValue::emptySingleton();

    // This dereferences value as a cell:
    RELEASE_ASSERT(!jsDynamicCast<CodeBlock*>(value));
    // ...
    FrozenValue frozenValue = FrozenValue::freeze(value);
    // ...
}

O método estático FrozenValue::freeze() lê o ponteiro de estrutura da célula:```cpp // Source/JavaScriptCore/dfg/DFGFrozenValue.h static FrozenValue freeze(JSValue value) { return FrozenValue( value, (!!value && value.isCell()) ? value.asCell()->structure() : nullptr, // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Dereferences the cell. If freed, this is UAF. WeakValue); }

Se a célula foi liberada entre o retorno de `tryGetConstantProperty()` e a execução de `freeze()`, `value.asCell()->structure()` é um use-after-free.

**Caminho B: marcação GC durante a janela alargada.** Na build de pesquisa, a thread do compilador entra num
ponto seguro raw do DFG dentro de `tryGetConstantProperty()` após ler a propriedade, mas antes de retorná-la
ao chamador. Isso permite que a thread principal execute GC enquanto o valor de célula obsoleto ainda existe
como um local nativo raw no lado do compilador. No PoC atual para Linux x86_64, o crash revalidado de forma fiável
ocorre mais tarde na marcação GC, onde `SlotVisitor` eventualmente desreferencia uma célula obsoleta inválida
ao percorrer referências do heap. A stack do crash atual prova que o mecanismo GC posterior consome o valor
obsoleto; não prova por si só o slot contentor exato a partir do qual esse ponteiro obsoleto foi alcançado.

### 2.4 Locais de chamada

Dois lugares no pipeline do DFG passam incondicionalmente o resultado de `tryGetConstantProperty()` para `freeze()`:
Baixar ferramenta