
Comprometiendo el kernel de macOS a través de Safari encadenando seis vulnerabilidades
Este repositorio contiene los detalles técnicos y de explotación de nuestra propuesta ganadora del Pwn2Own 2020 que apuntaba a Apple Safari con una escalada de privilegios del kernel para macOS 10.15.3. Para más información, también puedes consultar nuestras diapositivas del Blackhat USA 2020 y vídeo. Este repositorio también incluye nuestro vídeo de demostración para la exitosa explotación.
2. Accede al sitio web con la IP del servidor del atacante con Safari:```
http://[attacker_ip]/exploit.html
csrutil status, que mostrará disabled.Para su comodidad, proporcionamos un payload compilado, payload.js. Pero, si lo
desea, puede compilarlo usted mismo. Tenga en cuenta que esto llevará mucho tiempo
porque compilaremos WebKit como parte de nuestra cadena de explotación. Cabe
mencionar que solo probamos nuestro proceso de compilación en Mac OS.```shell
$ python3 -m pip install --user lief $ make
Technical details
-----------------
Para crear este exploit, encadenamos las siguientes *SEIS* vulnerabilidades.
### 1. Ejecución remota de código en Safari mediante un modelado incorrecto de los efectos secundarios del operador 'in' en el compilador DFG de JavaScriptCore
- Análisis de la causa raíz
En JavaScriptCore, cuando se consulta una propiedad indexada con el operador 'in',
el compilador DFG asume que no tiene efectos secundarios a menos que haya un objeto
proxy en su cadena de prototipos que pueda interceptar esta operación.
JavaScriptCore marca un objeto que puede interceptar este acceso a la propiedad indexada
usando el indicador llamado 'MayHaveIndexedAccessors'. Este indicador se
marca explícitamente para el objeto Proxy.```javascript
0 in [] // side-effect free
let arr = [];
arr.__proto__ = new Proxy({}, {});
0 in arr // can cause side-effect!
Sin embargo, hay otro objeto que puede causar un efecto secundario:
JSHTMLEmbedElement que implementa su propio método getOwnPropertySlot(). Una
forma de activar callbacks (es decir, efectos secundarios) de JavaScript con el operador 'in' es
usar el elemento <embed> con el plugin de PDF; cuando se consulta cualquier propiedad en el
objeto DOM de la etiqueta embed / object, intenta cargar el plugin subyacente y el
manejador de eventos DOMSubtreeModified puede ser llamado en el caso del plugin de PDF porque
usa el método appendChild en el elemento body.