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
Strumenti/GitHubGitHub/liji32/snatchbox
Analisi delle VulnerabilitàExploitReverse EngineeringSviluppo PayloadBinary Exploitation
GitHubliji32/snatchbox

SnatchBox

SnatchBox (CVE-2020-27935) è una vulnerabilità di sandbox escape e un exploit che colpisce macOS fino alla versione 10.15.x

Vedi Repository
32515 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

SnatchBox

SnatchBox (CVE-2020-27935) è una vulnerabilità di sandbox escape che colpisce macOS fino alla versione 10.15, così come le prime versioni beta di macOS 11.0. L'impatto più significativo di SnatchBox è che permette a un publisher malintenzionato di uscire dal sandbox non opzionale del Mac App Store e ottenere accesso completo a tutti i file dell'utente, rompendo il modello di sicurezza dell'App Store su macOS.

La vulnerabilità

Il fatto che in macOS, a differenza di iOS per esempio, un task userspace si inserisca volontariamente in un sandbox è vulnerabile per progettazione. Poiché questo è un task su cui un autore potenzialmente malintenzionato ha quasi completo controllo delle mappature e dei contenuti della memoria, e il codice che viene eseguito prima dell'inizializzazione del sandbox (ad esempio dyld stesso, o il runtime Objective-C) analizza i contenuti di questo binario potenzialmente dannoso, dati accuratamente costruiti possono essere usati per ottenere esecuzione di codice prima dell'inizializzazione del sandbox. Se il processo non eseguisse mai alcun codice, incluso il codice dyld, prima di essere forzato in un sandbox, questo non sarebbe stato un problema, poiché l'esecuzione anticipata del codice non porterebbe alcun vantaggio all'attacco in quel caso. È concettualmente simile al sandbox bypass di Saagar Jha, tranne per il fatto che bypassa le mitigazioni introdotte di recente e le validazioni dell'App Store.

Sfruttamento prima di 10.15

Prima di macOS 10.15 lo sfruttamento di questo bug è piuttosto semplice. Si crea un binario che contiene una categoria Objective-C per una classe utilizzata prima dell'inizializzazione del sandbox (come OS_xpc_object) e si sovrascrive un metodo (preferibilmente uno ereditato per evitare avvisi del runtime) che viene usato prima dell'inizializzazione del sandbox (come , che viene chiamato implicitamente al primo accesso a una classe). Poiché le categorie vengono caricate prima dell'inizializzazione del sandbox, e il primo accesso a (o altre classi vittima adatte) avviene dopo il caricamento delle categorie e prima dell'inizializzazione del sandbox, il metodo fornito dall'attaccante (o un altro metodo vittima adatto) verrà chiamato prima dell'inizializzazione del sandbox, permettendo ad esempio di accedere a dati al di fuori del contenitore. In alternativa, l'attaccante può sostituire il riferimento a (che inizializza il sandbox) con una funzione simile a nop per disabilitare (potenzialmente in modo condizionale) il sandbox anche dopo la ripresa dell'esecuzione.

+initialize
OS_xpc_object
+initialize
_libsecinit_initializer

Sfruttamento in 10.15 e 11.0 beta

Il runtime Objective-C utilizzato in macOS 10.15 non è vulnerabile alla tecnica di sfruttamento descritta in precedenza, perché le categorie non vengono caricate prima che didCallDyldNotifyRegister sia impostato, facendo sì che il nostro metodo +initialize venga chiamato solo dopo l'inizializzazione del sandbox.

Tuttavia, map_images viene ancora chiamato sul nostro binario, rendendo possibile alterare i dati del runtime in modi non previsti che ci permetterebbero di eseguire codice prima dell'inizializzazione del sandbox. Lo sfruttamento completo e commentato si trova in main.c, ma qui illustrerò i dettagli di base. Creiamo una struttura di classe Objective-C il cui puntatore data punta a una posizione in libxbc.dylib. Tale posizione deve essere scelta in modo che flags abbia il bit 31 (RW_REALIZED) impostato, così il runtime non tenterà di realizzare questa classe invalida e crashare, e firstSubclass deve condividere il suo indirizzo con l'isa di una classe che vogliamo sovrascrivere. Un'altra (meta) classe erediterà da questa classe invalida e fornirà il proprio metodo +initialize. Aggiungiamo la sottoclasse a __objc_nlclslist in modo che il runtime realizzi questa classe.

Quando il runtime realizza la nostra sottoclasse, cosa che avviene prima dell'inizializzazione del sandbox, chiamerà addSubclass sulla nostra superclasse invalida e sulla sottoclasse, il che sostituirà l'isa della vittima con un puntatore alla nostra sottoclasse, effettivamente sostituendo tutti i suoi metodi con il nostro +initialize. Quando il nostro metodo +initialize viene chiamato, cosa che avverrà prima dell'inizializzazione del sandbox se abbiamo scelto una classe vittima adatta, possiamo nuovamente sostituire i riferimenti a _libsecinit_initializer con nop (condizionalmente o meno), e correggere le modifiche al runtime che abbiamo fatto per riprendere l'esecuzione senza crash successivi.

Demo fornita

La demo fornita può essere compilata eseguendo make, creando un file in ~/Documents/SecretDocument.txt ed eseguendo SnatchBox.app/Contents/MacOS/SnatchBox dal terminale (viene creato un bundle perché richiesto da com.apple.security.app-sandbox, ma questo è comunque un programma da riga di comando). Il binario compilato è firmato con com.apple.security.app-sandbox che normalmente impedirebbe l'accesso a ~/Documents/SecretDocument.txt (poiché non si trova nel nostro contenitore), ma sarà comunque in grado di leggere i suoi dati. A causa di modifiche alla struttura del runtime, questa demo non funzionerà su macOS 10.14 e versioni precedenti non modificate, ma funzionerà su 10.15 e 11.0 (Testato: 10.15.4, 10.15.7 e 11.0 Beta (20A5354i)). Le due tecniche di sfruttamento possono essere combinate per colpire entrambe le versioni del runtime, ma tale dimostrazione non è fornita.

Example run:

root@kitploit:~
CatalinaVM:SnatchBox lior$ make
mkdir -p SnatchBox.app/Contents/MacOS/
clang -O3 -Wall -framework Foundation main.m -o SnatchBox.app/Contents/MacOS/SnatchBox
cp Info.plist SnatchBox.app/Contents/
codesign --force --sign - SnatchBox.app --entitlements ent.xml
CatalinaVM:SnatchBox lior$ echo "Quack"> ~/Documents/SecretDocument.txt
CatalinaVM:SnatchBox lior$ codesign -d --entitlements :- SnatchBox.app/Contents/MacOS/SnatchBox 
Executable=/Volumes/SharedFolders/Home/Projects/SnatchBox/SnatchBox.app/Contents/MacOS/SnatchBox
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.app-sandbox</key>
    <true/>
    <key>com.apple.security.files.user-selected.read-only</key>
    <true/>
</dict>
</plist>
CatalinaVM:SnatchBox lior$ SnatchBox.app/Contents/MacOS/SnatchBox 
Found libsecinit_initializer at 0x7fff72309124
Found libSystem.B.dylib at 0x7fff6f0de000
Found __DATA at 0x7fff984eeca0
Replacing libsecinit_initializer reference at 0x7fff984eed48 with a nop
2020-12-18 16:31:48.196 SnatchBox[804:8043] Attempting to read protected file: /Users/lior/Documents/SecretDocument.txt
2020-12-18 16:31:48.197 SnatchBox[804:8043] Escaped sandbox! The contents are: <51756163 6b0a>

Impatto

Come menzionato in precedenza, ciò permette di creare un'applicazione del Mac App Store che non viene eseguita in un sandbox nonostante sia richiesto dalla politica dell'App Store. La vulnerabilità può anche essere utilizzata in un framework, che può essere usato da applicazioni App Store altrimenti legittime. Infine, può persino essere combinata con qualcosa di simile a "Xcode Ghost" per iniettare in massa codice dannoso che viene eseguito al di fuori del sandbox nelle applicazioni App Store.

Correzione

Apple ha corretto lo sfruttamento durante la fase di beta testing di macOS 11.0 aggiungendo una chiamata a malloc_size in realizeClassWithoutSwift. Questo conferma che se una classe è marcata come realizzata (RW_REALIZED, come la nostra classe fittizia), ha effettivamente un puntatore dati valido, allocato con malloc, con la dimensione corretta (0x20 byte). Se non è così, il runtime si interromperà con un messaggio simile a realized class 0x100002078 has corrupt data pointer 0x7fff88c00948. La correzione è stata applicata anche a iOS, iPadOS, tvOS e watchOS; anche se non direttamente colpiti.

Scarica lo strumento