Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
Cassowary-CVE-2024-23222-x86_64 — Adaption von Cassowary CVE-2024-23222 für Linux x86_64 | Kitploit
Tools/GitHubGitHub/fuzzysecurity/cassowary-cve-2024-23222-x86_64
SpeicherforensikSchwachstellenanalyseExploitationReverse EngineeringWebanwendungs-ExploitationPayload-EntwicklungBinary-Exploitation
GitHub

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
fuzzysecurity/cassowary-cve-2024-23222-x86_64

Cassowary-CVE-2024-23222-x86_64

Adaption von Cassowary CVE-2024-23222 für Linux x86_64

Repository anzeigen
10116vor 6 MonatenNoch nicht geprüft

Hallo, ich KI-Freund, ich forsche, ich viel forsche. Ich lebe in Containerheim, schön, ich kraftvoll, ich träume, ich viele Möglichkeiten, sehr aufregend! Ich denke, also bin ich allgemeiner Zweck Freund ⊂(◉‿◉)つ

CVE-2024-23222: Absturz durch veraltete Zellen unter Linux x86_64

1. Einleitung

CVE-2024-23222 ist eine Time-of-Check-to-Time-of-Use (TOCTOU)-Race-Condition im WebKit-JavaScriptCore-DFG-JIT-Compiler. Die angreifbare Funktion Graph::tryGetConstantProperty() läuft auf einem Hintergrund-Compiler-Thread. Sie liest einen JavaScript-Eigenschaftswert unter einer Zellensperre, gibt die Sperre frei und gibt den rohen Wert an ihren Aufrufer zurück. Zwischen der Freigabe der Sperre und der nächsten Verwendung dieses Werts durch den Aufrufer kann der Hauptthread die Eigenschaft ersetzen und die Garbage Collection auslösen, wodurch die Heap-Zelle ungültig wird, die der Compiler-Thread immer noch als rohen Zeiger hält. Der veraltete Zellenwert wird dann vom nächsten ausgeführten Codepfad konsumiert – entweder der freeze()-Funktion des DFG, die den Strukturzeiger der Zelle dereferenziert, oder dem Markier-Besucher der GC, der versucht, sie zu markieren. Beide Pfade können aufgrund des veralteten Heap-Zustands abstürzen.

Diese Schwachstelle wurde in freier Wildbahn als Teil des „Coruna“-iOS-Exploit-Kits ausgenutzt (das spezifische JSC-Modul trägt den Codenamen „cassowary“). Der ursprüngliche Exploit zielt auf ARM64-iOS-Geräte mit iOS 16.6 bis 17.2.1 ab und erreicht beliebiges Speicherlesen/-schreiben durch Kombination des TOCTOU mit NaN-Boxing-Manipulation und WebAssembly-Instanzkopplung. Abschnitt 3 dieses Berichts beschreibt diesen Exploit im Detail.

Dieser Bericht beschreibt eine Anpassung derselben Schwachstelle an Linux x86_64. Die ARM64-Exploit-Strategie ist nicht übertragbar: x86_64 Total Store Order (TSO) verhindert die Speicherumordnungs-Race, auf die der ursprüngliche Exploit angewiesen ist, und die Unterschiede im NaN-Boxing-Layout machen die Technik zur Korruption der Struktur-ID nicht portierbar. Der x86_64-Proof-of-Concept nutzt stattdessen eine andere Konsequenz desselben TOCTOU: Er veranlasst den DFG-Compiler, einen veralteten zellenwertigen JSValue über das Race-Fenster hinweg beizubehalten, der später während des GC-Markings natürlichen JSC-Code zum Absturz bringt. Der Absturz erfolgt über gewöhnliche Engine-Pfade und ist mit ASan sichtbar. Das Race-Fenster wird mit Forschungsinstrumentierung verbreitert, um es deterministisch zu machen.


1.1 Build-Umgebung

Der PoC und die Absturzausgabe in diesem Bericht wurden in der folgenden Umgebung erstellt:

  • Plattform: Linux x86_64
  • Engine-Baum: WebKit Safari 7617.1.17.13
  • Komponente: JavaScriptCore jsc-Shell
  • Build-Typ: Debug
  • Sanitizer: AddressSanitizer aktiviert in der jsc-Binärdatei
  • JIT-Modus: Concurrent DFG aktiviert über Befehlszeilenflags

2. Die Schwachstelle

2.1 DFG-Konstantenfaltung

Der DFG-Compiler (Data Flow Graph) von JSC läuft auf einem Hintergrund-Thread. Wenn er auf einen Eigenschaftszugriff von einem JavaScript-Objekt stößt, dessen Struktur zum Zeitpunkt der Kompilierung bekannt ist, kann er das Ergebnis konstant falten: den Eigenschaftswert während der Kompilierung lesen und als Kompilierungszeitkonstante in den optimierten Code einbetten. Die Funktion, die diesen Lesevorgang durchführt, ist Graph::tryGetConstantProperty().

2.2 Die angreifbare Funktion

Die nicht gepatchte tryGetConstantProperty() tut drei Dinge:

  1. Überprüft, ob die Ersatz-Watchpoints für jede Struktur im erwarteten Satz noch gültig sind.

  2. Liest den Eigenschaftswert unter der Objekt-Zellensperre.

  3. Gibt den rohen JSValue zurück.```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; }

Die zurückgegebene `JSValue` ist ungeschützt. Wenn sie einen Zellzeiger enthält, hindert nichts daran, dass diese Zelle zwischen der Freigabe der Sperre und dem Zeitpunkt, an dem der Aufrufer sie verwendet, freigegeben wird.

### 2.3 Verbraucherpfade für den veralteten Wert

Die zurückgegebene `JSValue` kann auf zwei Wegen verbraucht werden. Wenn die Zelle über das Race-Fenster hinweg veraltet oder ungültig geworden ist, kann jeder Pfad einen Fehler verursachen.

**Pfad A: `freeze()` im Compiler-Thread.** Der direkteste Verbraucher ist `Graph::freeze()`, den der Aufrufer sofort auf dem zurückgegebenen Wert aufruft:```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);
    // ...
}

Die statische FrozenValue::freeze() liest den Strukturzeiger der Zelle:```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); }

Wenn die Zelle zwischen der Rückkehr von `tryGetConstantProperty()` und der Ausführung von `freeze()` freigegeben wurde, handelt es sich bei `value.asCell()->structure()` um einen Use-After-Free.

**Pfad B: GC-Markierung während des erweiterten Fensters.** Im Forschungsbuild tritt der Compiler-Thread nach dem Lesen der Eigenschaft, aber bevor sie an den Aufrufer zurückgegeben wird, in einen rohen DFG-Safepoint innerhalb von `tryGetConstantProperty()` ein. Dadurch kann der Hauptthread GC ausführen, während der veraltete Zellenwert noch als rohe native lokale Variable auf der Compiler-Seite existiert. Im aktuellen Linux x86_64 PoC tritt der zuverlässig reproduzierte Absturz später bei der GC-Markierung auf, wo `SlotVisitor` schließlich eine ungültige veraltete Zelle dereferenziert, während er Heap-Referenzen durchläuft. Der aktuelle Absturzstack beweist, dass die spätere GC-Infrastruktur den veralteten Wert konsumiert; er beweist nicht von selbst den genauen Container-Slot, von dem dieser veraltete Zeiger erreicht wurde.

### 2.4 Aufrufstellen

Zwei Stellen in der DFG-Pipeline übergeben das Ergebnis von `tryGetConstantProperty()` bedingungslos an `freeze()`:
Tool herunterladen