
Compromettere il kernel di macOS attraverso Safari concatenando sei vulnerabilità
Questo repository contiene i dettagli di sfruttamento e tecnici della nostra sottomissione vincente al Pwn2Own 2020 che ha preso di mira Apple Safari con un'escalation dei privilegi del kernel per macOS 10.15.3. Per ulteriori informazioni, puoi anche consultare le nostre slide del Blackhat USA 2020 e il video. Questo repository include anche il nostro video dimostrativo per lo sfruttamento riuscito.
2. Accedi al sito web con l'IP del server attaccante usando Safari:```
http://[attacker_ip]/exploit.html
csrutil status, che mostrerà disabled.Per tua comodità, abbiamo fornito un payload compilato, payload.js. Ma, se vuoi, puoi compilarlo da solo. Nota che ci vorrà molto tempo perché costruiremo WebKit come parte della nostra catena di exploit. Vale la pena notare che abbiamo testato il nostro processo di compilazione solo su Mac OS.```shell
$ python3 -m pip install --user lief $ make
Technical details
-----------------
Per realizzare questo exploit, abbiamo concatenato le seguenti *SEI* vulnerabilità.
### 1. Esecuzione di codice remoto in Safari tramite una modellazione scorretta degli effetti collaterali dell'operatore 'in' nel compilatore DFG di JavaScriptCore
- Analisi della causa principale
In JavaScriptCore, quando una proprietà indicizzata veniva interrogata con l'operatore 'in',
il compilatore DFG presumeva che non avesse effetti collaterali, a meno che non ci fosse un
oggetto proxy nella sua catena prototipale in grado di intercettare questa operazione.
JavaScriptCore marca un oggetto in grado di intercettare questo accesso a una proprietà indicizzata
tramite il flag chiamato 'MayHaveIndexedAccessors'. Questo flag è
esplicitamente marcato per l'oggetto Proxy.```javascript
0 in [] // side-effect free
let arr = [];
arr.__proto__ = new Proxy({}, {});
0 in arr // can cause side-effect!
Tuttavia, c'è un altro oggetto che può causare un effetto collaterale:
JSHTMLEmbedElement che implementa il proprio metodo getOwnPropertySlot(). Un
modo per innescare callback JavaScript (cioè effetti collaterali) con l'operatore 'in' è
usare l'elemento <embed> con il plugin PDF; quando una qualsiasi proprietà viene interrogata sull'oggetto DOM del tag embed/object, tenta di caricare il plugin sottostante e
il gestore dell'evento DOMSubtreeModified può essere chiamato nel caso del plugin PDF perché
utilizza il metodo appendChild sull'elemento body.