
Comprometendo o kernel do macOS através do Safari ao encadear seis vulnerabilidades
Este repositório contém detalhes de exploração e técnicos de nossa submissão vencedora do Pwn2Own 2020 visando o Apple Safari com uma escalada de privilégios de kernel para o macOS 10.15.3. Para mais informações, você também pode conferir nossos slides do Blackhat USA 2020 e vídeo. Este repositório também inclui nosso vídeo de demonstração para a exploração bem-sucedida.
2. Acesse o site com o IP do servidor do atacante usando o Safari:```
http://[attacker_ip]/exploit.html
csrutil status, que mostrará disabled.Para sua conveniência, fornecemos um payload compilado, payload.js. Mas, se quiser, você pode compilá-lo você mesmo. Observe que isso levará muito tempo, pois compilaremos o WebKit como parte da nossa cadeia de exploração. Vale a pena notar que testamos nosso processo de compilação apenas no Mac OS.```shell
$ python3 -m pip install --user lief $ make
Detalhes técnicos
-----------------
Para criar este exploit, encadeamos as seguintes *SEIS* vulnerabilidades.
### 1. Execução remota de código no Safari por meio de modelagem incorreta de efeitos colaterais do operador 'in' no compilador DFG do JavaScriptCore
- Análise da causa raiz
No JavaScriptCore, quando uma propriedade indexada era consultada com o operador 'in',
o compilador DFG assume que ela não tem efeitos colaterais, a menos que haja um objeto
proxy em sua cadeia de protótipos que possa interceptar essa operação.
O JavaScriptCore marca um objeto que pode interceptar esse acesso a propriedade indexada
usando o sinalizador chamado 'MayHaveIndexedAccessors'. Esse sinalizador é
marcado explicitamente para o objeto Proxy.```javascript
0 in [] // side-effect free
let arr = [];
arr.__proto__ = new Proxy({}, {});
0 in arr // can cause side-effect!
No entanto, existe outro objeto que pode causar efeitos colaterais: o
JSHTMLEmbedElement, que implementa seu próprio método getOwnPropertySlot(). Uma
forma de acionar callbacks de JavaScript (ou seja, efeitos colaterais) com o operador in é
usando o elemento <embed> com o plugin de PDF; quando qualquer propriedade é consultada no
objeto DOM da tag embed / object, ele tenta carregar o plugin subjacente e
o manipulador de eventos DOMSubtreeModified pode ser chamado no caso do plugin de PDF, porque
ele usa o método appendChild no elemento body.