Skip to content
KitploitKITPLOIT
StrumentiBlog
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.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
POC-for-CVE-2023-41993 — Exploit proof-of-concept per CVE-2023-41993, una confusione di tipo JIT di WebKit in Safari. Fornisce primitive addrof/fakeobj tramite manipolazione dell'heap e confusione GetterSetter, consentendo lettura/scrittura arbitraria nel processo WebContent. | Kitploit
Strumenti/GitHubGitHub/po6ix/poc-for-cve-2023-41993
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebSviluppo PayloadBinary Exploitation
GitHubpo6ix/poc-for-cve-2023-41993

POC-for-CVE-2023-41993

Exploit proof-of-concept per CVE-2023-41993, una confusione di tipo JIT di WebKit in Safari. Fornisce primitive addrof/fakeobj tramite manipolazione dell'heap e confusione GetterSetter, consentendo lettura/scrittura arbitraria nel processo WebContent.

Vedi Repository
2023762 anni faRevisionato da Kitploit

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

CVE-2023-41993

Exploit PoC per CVE-2023-41993. È scritto solo fino a addrof/fakeobj. L'affidabilità non è eccezionale. Se vuoi migliorarlo, prova a fare spray degli structure ID.

Link POC

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

Ho deciso di ospitarlo su GitHub Pages dopo molteplici richieste.
Auguratemi fortuna che GitHub non mi blocchi...

Versioni Note Affette

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

Versioni Note Non Affette

  • 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

Domande/Risposte

Si blocca soltanto

È perché il valore del fattore definito nella funzione pwn non è corretto per il tuo dispositivo.
In tal caso, l'ho fatto in modo che usi un valore casuale tra 87 e 1088.
Quindi puoi trovare il valore del fattore corretto semplicemente ricaricando qualche volta.
Probabilmente dovrebbe funzionare entro 100 tentativi.
Sarebbe anche gradito se potessi inviarmi le informazioni mostrate dal caso di successo.

Quindi cosa posso fare con questo?

Questo ti fornisce una primitiva di lettura/scrittura sul processo webcontent di Safari.
Ma per renderlo effettivamente utile, dovrai concatenarlo con altri componenti.

Spiegazione Breve

Potresti desiderare un writeup dettagliato per questo. ma sfortunatamente non ho tempo per scriverlo. Quindi scrivo alcuni appunti qui così puoi capire come funziona.

Se guardi il commit, riguarda la modifica per HeapLocation. È stato aggiunto un nuovo fattore per sapere se i nodi sono uguali o meno. Ci dice che nodi come GetByOffset, MultiGetByOffset potrebbero essere confusi. Ma in realtà riguarda solo l'offset. Diciamo che ha due nodi GetByOffset con offset diversi. Uno di questi sarà soggetto a CSE e il rimanente verrà usato invece. Quindi è fondamentalmente una confusione di offset ma non ti dà accesso a un offset arbitrario. perché per fare CSE su tali tipi di nodi devono essere sollevati da LICMPhase. Per i tipi di nodi che eseguono operazioni di scrittura non è consentito il sollevamento in questa fase. Quindi la stessa confusione non si verifica per i nodi PutByOffset, MultiPutByOffset. Inoltre, quando GetByOffset viene sollevato, la funzione safeToExecute viene chiamata per verificare che il nodo sia lecito da eseguire e permette di accedere solo all'offset minore della capacità di storage (inline/ool). Quindi l'idea per sfruttare questo era GetterSetter. Se chiami Object.__defineGetter__ per definire una proprietà, viene creato un oggetto GetterSetter ma memorizzato nello storage delle proprietà e non è accessibile normalmente. Ma puoi con questa manipolazione dell'offset che hai. Poi chiami la funzione Object per innescare una type confusion.

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);
}

Creerà un SymbolObject che ha il GetterSetter come valore interno. E questo è errato, perché questo valore interno di SymbolObject dovrebbe essere un'istanza di Symbol, non 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;
}

Poi quando chiami il getter description, restituirà un'istanza di String. Questa è una confusion di tipo tra Symbol.m_privateName e GetterSetter.m_getter. Ogni volta che chiami questo getter, incrementerà il campo del contatore di riferimenti di m_privateName.m_uid che si trova all'offset 0x0. Questo è molto utile, perché questo offset è dove si trova lo structure ID della funzione getter. Chiamando questa funzione alcune volte, puoi cambiare lo structure ID dell'istanza JSFunction. Ho preparato un altro tipo che ha molte proprietà. Poi se sincronizzi lo structure ID per renderlo uguale a quello, puoi fare scrittura oob nello storage delle proprietà. Questo dà direttamente la primitiva addrof/fakeobj.

Riferimenti

  • Int64 module: https://github.com/saelo/jscpwn
Scarica lo strumento