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
cve-2016-7190 — Tecniche di exploitation per ChakraCore | Kitploit
Strumenti/GitHubGitHub/0xcl/cve-2016-7190
Analisi delle VulnerabilitàExploitShellcodeSfruttamento di Applicazioni WebPaper e RicercaApprendimento e FormazioneSviluppo PayloadBinary Exploitation
GitHub0xcl/cve-2016-7190

cve-2016-7190

Tecniche di exploitation per ChakraCore

Vedi Repository
98 anni faNon ancora revisionato

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

Panoramica

CVE-2016-7190 [0] è un heap overflow nella funzione Array.map() di ChakraCore che consente di sovrascrivere la memoria adiacente. L'idea principale per ottenere accesso arbitrario in lettura/scrittura è prima allocare un numero di Array di interi JavaScript consecutivi e sfruttare l'overflow per manipolare la dimensione di un array. Quindi, sfruttiamo questo array per cambiare l'indirizzo base di un Uint8Array a qualsiasi indirizzo desideriamo leggere/scrivere. La ragione per questo passaggio aggiuntivo è che l'overflow è limitato a 2x la dimensione dell'array di interi overflowato.

Questa vulnerabilità è molto adatta per testare diverse strategie di exploitation perché può essere facilmente reintrodotta nelle versioni correnti di ChakraCore (vedi undo-cve-2016-7190.patch).

Il mio ambiente di test

  • ChakraCore Release 1.8 (6e56489a4fe940ce6f8a960caf9429700bf2d8db)
  • Microsoft Windows 10 Pro x64 / 10.0.14393 Build 14393
  • Binari: https://drive.google.com/open?id=1WTXqMLVRHPRoBU9eo-MWEwAY--CQC8e3
  • Simboli: https://drive.google.com/open?id=1kQDrlG97NY5ruVH6i2Mjr43cFuNISp5z

Esempi di exploit

Dirottamento del flusso di controllo

In questo esempio, dirottiamo il flusso di controllo sovrascrivendo il puntatore vtable di un oggetto C++ Uint8Array con un indirizzo di memoria controllato e invocando una funzione dell'oggetto Uint8Array che provoca l'invocazione di una funzione virtuale.

Attacco solo-dati per generare istruzioni arbitrarie (mitigato da ACG [3])

L'integrità del flusso di controllo (CFI) è una tecnica di difesa per mitigare gli attacchi di dirottamento del flusso di controllo. L'idea generale della CFI è calcolare un grafo del flusso di controllo (CFG) di un'applicazione durante la compilazione, e quindi strumentare l'applicazione con controlli a runtime per garantire che il flusso di controllo non si discosti dal CFG calcolato staticamente durante l'esecuzione. Tuttavia, se un'applicazione, come un browser web, supporta la generazione dinamica di codice, il CFG deve essere estendibile durante l'esecuzione. Questo impone una serie di sfide:

  • come distinguere un'estensione benigna e maliziosa del CFG?
  • come proteggere il codice generato dinamicamente?
  • come garantire che il programma corretto venga generato?

Durante il periodo in cui abbiamo condotto la nostra ricerca, ci siamo concentrati sull'ultima sfida. L'idea principale è manipolare l'input (dati) del compilatore just-in-time (JIT). Di conseguenza, il compilatore JIT genererebbe codice malizioso che verrebbe quindi integrato nel contesto corrente—e persino protetto con CFI. In parallelo alla nostra ricerca, theori [4] ha mostrato come bypassare CFI manipolando l'output del compilatore JIT. Questo attacco è mitigato verificando l'integrità dell'output tramite un checksum. Questo non può fermare il nostro attacco perché manipoliamo l'input del compilatore JIT. TUTTAVIA, esternalizzando la compilazione JIT in un altro processo (aka Arbitrary Code Guard [3]) entrambi gli attacchi sono mitigati.

Dimostriamo che un attaccante può sfruttare un attacco solo-dati contro il compilatore JIT per generare codice nativo arbitrario. In particolare, modifichiamo la rappresentazione intermedia (IR) del compilatore JIT per iniettare istruzioni controllate dall'attaccante. Quando il compilatore JIT genera quindi il codice nativo basato sull'IR modificato, genererà codice nativo controllato dall'attaccante.

Tra il momento in cui la ricerca è stata originariamente condotta e ora, l'IR di ChakraCore è stato modificato. Non abbiamo fatto lo sforzo di portare l'attacco, quindi, per giocare con questo attacco, si prega di utilizzare i seguenti binari.

  • Binari: https://drive.google.com/open?id=1Il51XlTPwYcUWcuMqchZIrkBC7Uq844v
  • Simboli: https://drive.google.com/open?id=1w_TqCEoDFhi2SG48UrBBiVcl3rF_5-yG

Attacco solo-dati per rimappare memoria arbitraria come scrivibile

Durante l'analisi di ACG [3] abbiamo notato, tra gli altri [1,2], che i dati globali di sola lettura, memorizzati nella sezione .mrdata, devono essere regolati per integrare il codice generato dinamicamente. Ciò viene fatto tramite la funzione LdrProtectMrdata() che utilizza un lock per essere thread-safe. Tuttavia, la sezione .mrdata viene prima rimappata come scrivibile prima che il lock venga acquisito. Interessantemente, la sezione .mrdata contiene l'indirizzo base e la dimensione della sezione .mrdata che viene successivamente utilizzata per rimappare nuovamente questa sezione come sola lettura.

Un attaccante può sfruttare ciò per creare una primitiva di attacco che consente di rimappare memoria di sola lettura come scrivibile. Pertanto, l'attaccante esegue i seguenti passaggi:

  1. acquisire il lock per la sezione .mrdata
  2. attivare il compilatore JIT che esegue in un thread separato
  3. attendere fino a quando la sezione .mrdata non è mappata come scrivibile
  4. cambiare l'indirizzo base della sezione .mrdata
  5. rilasciare il lock Di conseguenza, la sezione .mrdata rimaneva scrivibile. Per mappare memoria arbitraria come scrivibile, l'attaccante deve solo cambiare l'indirizzo base della sezione .mrdata e quindi ripetere i passaggi precedenti.

La conseguenza di questo attacco è che dati precedentemente fidati, cioè dati mappati come sola lettura, diventano non fidati. Nella nostra prova di concetto, sfruttiamo questa primitiva per bypassare Control-flow Guard (CFGuard) modificando il puntatore alla funzione di verifica di CFGuard salvato in _guard_dispatch_icall_fptr. L'effetto può essere osservato collegando il debugger e modificando la variabile bypass_cfguard.

Riferimenti

[0] https://bugs.chromium.org/p/project-zero/issues/detail?id=923
[1] http://alex-ionescu.com/publications/euskalhack/euskalhack2017-cfg.pdf
[2] https://sites.google.com/site/bingsunsec/dataonlyattack
[3] https://blogs.windows.com/msedgedev/2017/02/23/mitigating-arbitrary-native-code-execution/
[4] http://theori.io/research/chakra-jit-cfg-bypass

Scarica lo strumento