
Правильная хорошо структурированная документация для начала работы с pwning Chrome и pwning V8.
Правильно структурированная документация для начала изучения chrome pwning & v8 pwning
Как организован этот документ
Браузеры — одна из самых используемых технологий сегодня. На каждом серийном компьютере, если мы просто подключим и будем использовать, увидим установленный браузер. Именно поэтому с точки зрения атакующего и модели угроз очень выгодно, если атакующий способен скомпрометировать браузер через вредоносную страницу. Учитывая вышеизложенные аргументы, я выбираю для изучения JavaScript-движок Google, в частности v8.
Учитывая огромный масштаб проекта v8, в качестве отправной точки я выбираю интерпретатор, а именно d8. Хотя по d8 уже проведено множество исследований, мы надеемся найти хотя бы одну ошибку, а если нет — иметь возможность продвинуться в исследовании эксплуатации браузеров, поскольку v8 предоставляет отправную точку для базовых стратегий разработки эксплойтов, используемых при эксплуатации браузеров.
Ещё одна причина, по которой я выбираю v8 в качестве цели, — это то, что он используется во многих браузерах.
Если заглянуть под капот, мы увидим, что этот движок используется и в MicrosoftEdge, так что есть шанс получить несколько вознаграждений за bug bounty. В качестве базовой операционной системы исследователь будет использовать смесь Windows и Linux, поскольку нет ограничений на получение шелла — ошибки v8 позволяют выполнять код через wasm-страницы, и это не привязано к какой-либо конкретной платформе.
К сожалению, хотя эксплуатируемая ошибка в v8 и привела бы к выполнению кода, мы не сможем выполнить какой-либо код из-за песочницы, и поэтому мы получим выполнение кода в контексте рендерера, что не позволит нам выполнять код на машине. Для этого нам понадобится ещё один эксплойт для песочницы, а значит, нам нужна полная цепочка эксплойтов для взлома системы.
Таким образом, мы определяем следующие цели, чтобы начать заниматься взломом браузеров:
На первом этапе проекта необходимо собрать как можно больше знаний об архитектуре Chrome и о том, как каждый компонент взаимодействует с другими. Чтобы лучше понять это, нам нужно разбить проект Chromium на несколько подкомпонентов, чтобы мы могли изолировать всё и проанализировать должным образом. Точнее, на сколько подкомпонентов разбивается каждый из следующих компонентов
Теперь самый логичный первый шаг — понять архитектуру Chromium. Итак, мы хотим эксплуатировать браузер, но что происходит, когда мы впервые запускаем браузер? После запуска исполняемого файла Chromium этот исполняемый файл запускает несколько процессов.
Порядок и их названия следующие:
Первый называется content-процесс. Что делает этот процесс?
Теперь, когда мы вкратце знаем, что он делает, пришло время углубиться в него:
.chrome_exe_main_win.cc, и если вам интересно прочитать весь код, он находится в chromium/src/chrome/app. Дальше по ходу выполнения мы видим, что он вызывает MakeMainDllLoader(), чтобы вызвать класс загрузчика DLL, после чего запускает «загрузчик», то есть загружает chrome.dll, и при необходимости перезапускает его с нужными командными строками. Чтобы продолжить анализ загрузчика, нужно понять его код, который находится в том же каталоге в файле mail_dll_loader_win.cc. Прокрутив файл до самого конца, мы видим вызов MakeMainDllLoader, который в зависимости от вашей версии вызывает ChromeDllLoader или ChromiumDllLoader.
ChromiumDllLoader — это класс, который наследуется от MainDllLoader. Из определения видно, что этот класс просто загружает DLL на основе аргументов, переданных в командную строку, и типа процесса
.
.--no-sandbox бинарнику, что в основном сообщает бинарнику, что не нужно запускаться в песочнице. Он проверяет, было ли установлено что-либо из этого, и если какое-либо из условий истинно, вызывает песочницу с соответствующими опциями. Затем в конце мы добираемся до
chrome_main.