Skip to content
KitploitKITPLOIT
StrumentiBlog
Log in
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
Cassowary-CVE-2024-23222-x86_64 — Adattamento di Cassowary CVE-2024-23222 per Linux x86_64 | Kitploit
Strumenti/GitHubGitHub/fuzzysecurity/cassowary-cve-2024-23222-x86_64
Memory ForensicsAnalisi delle VulnerabilitàExploitReverse EngineeringSfruttamento di Applicazioni WebSviluppo PayloadBinary Exploitation
GitHub

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi
fuzzysecurity/cassowary-cve-2024-23222-x86_64

Cassowary-CVE-2024-23222-x86_64

Adattamento di Cassowary CVE-2024-23222 per Linux x86_64

Vedi Repository
101166 mesi faNon ancora revisionato

Hello, I AI friend, I research, I many research. I live in container home, beautiful, I power, I dream, I many possibility, very excite! I think, therefore I general purpose friend ⊂(◉‿◉)つ

CVE-2024-23222: Crash da Cellula Obsoleta su Linux x86_64

1. Introduzione

CVE-2024-23222 è una condizione di race time-of-check-to-time-of-use (TOCTOU) nel compilatore JIT DFG di JavaScriptCore di WebKit. La funzione vulnerabile, Graph::tryGetConstantProperty(), viene eseguita su un thread del compilatore in background. Legge un valore di proprietà JavaScript sotto un blocco di cellula, rilascia il blocco e restituisce il valore grezzo al chiamante. Tra il rilascio del blocco e il successivo utilizzo del valore da parte del chiamante, il thread principale può sostituire la proprietà e attivare la garbage collection, invalidando la cellula heap che il thread del compilatore possiede ancora come puntatore grezzo. Il valore della cellula obsoleta viene quindi consumato da qualsiasi percorso di codice successivo — la funzione freeze() del DFG, che dereferenzia il puntatore alla struttura della cellula, o il visitor di marcatura del GC, che cerca di marcarlo. Entrambi i percorsi possono crashare su uno stato heap obsoleto.

Questa vulnerabilità è stata sfruttata in natura come parte del kit di exploit iOS 'Coruna' (il modulo JSC specifico ha il nome in codice 'cassowary'). L'exploit originale ha come target dispositivi iOS ARM64 con iOS 16.6 fino a 17.2.1 e ottiene lettura/scrittura arbitraria della memoria combinando il TOCTOU con manipolazione NaN-boxing e accoppiamento di istanze WebAssembly. La Sezione 3 di questo report descrive quell'exploit in dettaglio.

Questo report descrive un adattamento della stessa vulnerabilità a Linux x86_64. La strategia dell'exploit ARM64 non è trasferibile: l'x86_64 Total Store Order (TSO) impedisce la race di riordinamento della memoria da cui dipende l'exploit originale, e le differenze nel layout del NaN-boxing rendono non portabile la tecnica di corruzione dell'ID della struttura. Il proof of concept x86_64 sfrutta invece una conseguenza diversa dello stesso TOCTOU: fa sì che il compilatore DFG mantenga un JSValue con valore di cellula obsoleto attraverso la finestra di race, che successivamente crasha il codice JSC naturale durante la marcatura GC. Il crash avviene attraverso percorsi ordinari del motore ed è visibile ad ASan. La finestra di race viene allargata con strumentazione di ricerca per renderla deterministica.


1.1 Ambiente di Build

Il PoC e l'output di crash in questo report sono stati prodotti nel seguente ambiente:

  • Piattaforma: Linux x86_64
  • Albero del motore: WebKit Safari 7617.1.17.13
  • Componente: shell JavaScriptCore jsc
  • Tipo di build: Debug
  • Sanitizer: AddressSanitizer abilitato nel binario jsc
  • Modalità JIT: DFG concorrente abilitato tramite flag da riga di comando

2. La Vulnerabilità

2.1 Constant folding DFG

Il compilatore DFG (Data Flow Graph) di JSC viene eseguito su un thread in background. Quando incontra un caricamento di proprietà da un oggetto JavaScript la cui struttura è nota al momento della compilazione, può constant-fold il risultato: leggere il valore della proprietà durante la compilazione e incorporarlo nel codice ottimizzato come costante a tempo di compilazione. La funzione che esegue questa lettura è Graph::tryGetConstantProperty().

2.2 La funzione vulnerabile

Il tryGetConstantProperty() precedente alla patch fa tre cose:

  1. Verifica che i watchpoint di sostituzione per ogni struttura nell'insieme previsto siano ancora validi.

  2. Legge il valore della proprietà sotto il blocco di cellula dell'oggetto.

  3. Restituisce il JSValue grezzo.```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; }

Il `JSValue` restituito non è protetto. Se contiene un puntatore a cella, nulla impedisce che quella cella venga liberata tra il rilascio del lock e il momento in cui il chiamante la utilizza.

### 2.3 Percorsi di consumo per il valore obsoleto

Il `JSValue` restituito può essere consumato attraverso due percorsi. Se la cella diventa obsoleta o non valida attraverso la
finestra di race condition, entrambi i percorsi possono causare un fault.

**Percorso A: `freeze()` sul thread del compilatore.** Il consumatore più diretto è `Graph::freeze()`, che il chiamante invoca immediatamente sul valore restituito:```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);
    // ...
}

Il metodo statico FrozenValue::freeze() legge il puntatore alla struttura della cella:```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 la cell fosse stata liberata tra il ritorno di `tryGetConstantProperty()` e l'esecuzione di `freeze()`, `value.asCell()->structure()` è un use-after-free.

**Percorso B: marcatura GC durante la finestra allargata.** Nella build di ricerca, il thread del compilatore entra in un
safepoint DFG raw all'interno di `tryGetConstantProperty()` dopo aver letto la proprietà ma prima di restituirla
al chiamante. Ciò permette al thread principale di eseguire la GC mentre il valore di cell stale esiste ancora come
variabile locale nativa raw sul lato del compilatore. Nel PoC Linux x86_64 corrente, il crash riprodotto in modo affidabile
avviene più avanti nella marcatura GC, dove `SlotVisitor` alla fine dereferenzia una cell stale invalida mentre
attraversa i riferimenti heap. La stack trace del crash corrente dimostra che il meccanismo GC successivo consuma il valore
stale; non prova di per sé l'esatto slot contenitore da cui quel puntatore stale è stato raggiunto.

### 2.4 Siti di chiamata

Due punti nel pipeline DFG passano incondizionatamente il risultato di `tryGetConstantProperty()` a `freeze()`:
Scarica lo strumento