
Компрометация ядра macOS через Safari путем объединения шести уязвимостей
Этот репозиторий содержит информацию об эксплуатации и технические детали нашей победной заявки на Pwn2Own 2020, направленной на Apple Safari с повышением привилегий ядра для macOS 10.15.3. Для получения дополнительных сведений вы также можете ознакомиться с нашими слайдами с Blackhat USA 2020 и видео. Этот репозиторий также включает наше демонстрационное видео успешной эксплуатации.
2. Откройте веб-сайт с IP-адресом сервера атакующего через Safari:```
http://[attacker_ip]/exploit.html
csrutil status, которая покажет disabled.Для вашего удобства мы предоставили скомпилированный пейлоад, payload.js. Но если хотите, вы можете собрать его самостоятельно. Обратите внимание, что это займет очень много времени, так как мы будем собирать WebKit как часть нашей цепочки эксплойта. Стоит отметить, что мы тестировали процесс сборки только в Mac OS.```shell
$ python3 -m pip install --user lief $ make
Технические детали
-----------------
Для создания этого эксплойта мы объединили следующие *ШЕСТЬ* уязвимостей.
### 1. Удаленное выполнение кода в Safari из-за некорректного моделирования побочных эффектов оператора 'in' в компиляторе DFG JavaScriptCore
- Анализ первопричины
В JavaScriptCore, когда свойство с индексом запрашивается с помощью оператора 'in', компилятор DFG предполагает, что это не имеет побочных эффектов, если только в цепочке прототипов нет объекта-прокси, который может перехватить эту операцию. JavaScriptCore помечает объект, который может перехватить доступ к свойству с индексом, с помощью флага 'MayHaveIndexedAccessors'. Этот флаг явно установлен для объекта Proxy.```javascript
0 in [] // side-effect free
let arr = [];
arr.__proto__ = new Proxy({}, {});
0 in arr // can cause side-effect!
Однако существует другой объект, который может вызвать побочный эффект: JSHTMLEmbedElement, реализующий собственный метод getOwnPropertySlot(). Один из способов вызвать JavaScript-колбэки (т.е. побочные эффекты) с помощью оператора 'in' — использовать элемент с плагином PDF; когда любое свойство запрашивается у DOM-объекта embed/object, он пытается загрузить поддерживаемый плагин, и обработчик события DOMSubtreeModified может быть вызван в случае плагина PDF, поскольку он использует метод appendChild для элемента body.