Устранение ошибок
Введение
Есть несколько тем, связанных с безопасностью V8, которые я еще не обсуждал. В этом посте будут рассмотрены некоторые области, связанные с поиском ошибок, такие как механизмы безопасности, уже используемые в V8 и Chrome. Цель состоит в том, чтобы предоставить дополнительные ресурсы для людей, заинтересованных в исследованиях безопасности V8.Изучение N-days
Помимо чтения кодовой базы, во многих случаях лучший способ принять участие — это практика. Изучение прошлых уязвимостей может помочь обнаружить новые. И когда обнаружена одна ошибка, есть неплохая вероятность, что существуют аналогичные уязвимости. Ниже приведены некоторые способы поиска обнаруженных ошибок в V8, которые могут помочь в поиске будущих ошибок.Трекеры ошибок
Хотя у V8 есть собственный список ошибок , многие из них также публикуются в более широком списке отслеживания. Здесь каждый может сообщить об ошибках в Google, который все воспринимает абсолютно серьезно и никогда не публикует шуточные ошибки.
К счастью, есть несколько фильтров для обнаружения ошибок, связанных с безопасностью. Комбинирование фильтров не всегда интуитивно понятно, но я обычно пользуюсь Type="Bug-Security" component=Blink>JavaScript>Compiler, и это то, что вы увидите . Обычно есть выпадающие списки для всех типов фильтров; однако я обнаружил, что, когда вы хотите комбинировать фильтры, лучше всего делать это вручную, копируя строки, созданные с помощью фильтра по отдельности (как в примере, который я только что привел). Здесь важно отметить, что если ошибка имеет какое-то влияние на безопасность, она будет ограничена до 14 недель после ее закрытия.
Отчеты об ошибках очень полезны для начала исследования безопасности V8. Часто эти отчеты содержат PoC, пояснения по базе кода и обсуждение того, как возникла ошибка и как она будет исправлена. Когда обнаруживаются новые методы эксплуатации, они обычно наиболее подробно обсуждаются в одном из таких отчетов.
Релизы Chrome
Если у вас нет времени регулярно проверять средства отслеживания ошибок, на официальной странице Chrome Releases подробно описаны все основные уязвимости, которые были исправлены за последние 6 недель. Как правило, проще искать ошибки в V8, потому что он содержит краткий список с краткими описаниями для каждой уязвимости. Однако он публикует ошибки только после того, как они были исправлены, и через большие промежутки времени.Журнал изменений Git
Между тем, если у вас есть много времени на поиск последних патчей, вам стоит просмотреть журнал или зеркало GitHub . С вашего терминала вы можете запустить git log origin/master просматривать журнал основной ветки, даже если вы локально разбираете старый commit. Большинство изменений кода не связаны с безопасностью. Тем не менее, коммиты часто имеют идентификатор ошибки, встроенный в сообщение коммита. Это означает, что вы можете сопоставлять идентификаторы из системы отслеживания ошибок и журнала изменений, чтобы увидеть, является ли ошибка проблемой безопасности или нет. Самое интересное в этом то, что некоторые ошибки публично раскрываются и исправляются до того, как приложения, такие как Chrome, реализуют эти исправления в ходе регулярных циклов выпуска.«По сути, у злоумышленников есть окно возможностей от пары дней до недель, в течение которых сведения об уязвимости практически общедоступны, но большинство пользователей уязвимы и не могут получить исправление». -Блог Exodus. Сравнение этих исправлений может помочь завершить анализ основной причины, прежде чем средство отслеживания ошибок откроет проблему с более подробной информацией.
Сообщения
Команда V8 управляет учетной записью Twitter, а также блогом . Оба они публикуют информацию об изменениях в V8, обычно с точки зрения разработки, но изменения часто означают новые функции, которые необходимо изучить. Эти блоги часто добавляют много объяснений, которые код не может сразу предоставить.Не ориентирован на V8, блог Google Project Zero он часто проводит исследования уязвимостей браузеров. Они написали несколько статей о Chrome и V8. Они очень подробно рассказывают об использовании браузера и, вероятно, будут публиковать аналогичные сообщения в будущем.
Фаззинг
Когда у вас есть такое большое и сложное программное обеспечение, как движок JavaScript, вам необходимо реализовать фаззинг, чтобы охватить огромное количество потенциальных случаев, которые могут привести к сбою системы. Команда V8 предлагает несколько ресурсов для реализации готовых фаззеров или внедрения новых.ClusterFuzz — это основной фаззер Chrome, и у него есть различные компоненты, которые тестируют определенные функции, такие как JavaScript . Даже ошибки, обнаруженные в ходе ручной проверки кода, передаются в ClusterFuzz, чтобы оценить диапазон уязвимых версий Chrome и помочь с исправлением. Он уже хорошо интегрирован в V8 и может использовать преимущества очистки адресов (один из многих санитайзеров ).
Также были представлены некоторые продукты для фаззинга не от Google, например Fuzzilli от Самуэля Гросса. Хотя он не был создан специально для V8, вы можете увидеть, как он был перенесен в репозиторий GPZ . Он уже нашел ошибки в V8, такие как 1072171 . Другой недавно представленный фаззер, DIE , из лаборатории Технологического института Джорджии, также обнаружил несколько уязвимостей. Оба имеют достаточно документации, чтобы начать работу с относительно небольшой работой. Также есть очень хорошее пошаговое руководство от Патрика Вентузело по фаззингу Liftoff с использованием Dharma.
Наконец, в блоге Chromium есть полезное руководство по началу работы с фаззингом и созданию новых методов тестирования. В частности этом руководстве описывается процесс внедрения нового фаззера в V8, очень похожий на то, как они портировали новый фаззер WebAssembly.
CHECK
Когда вы просматриваете код V8, вы заметите множество макросов CHECK и DCHECK. Операторы CHECK задают условия, невыполнение которых может иметь последствия для безопасности. Это приведет к сбою браузера, чтобы предотвратить более серьезные последствия. Операторы DCHECK присутствуют только в отладочной сборке и предназначены для проверки предварительных и постусловий, которые всегда должны быть истинными. Эти утверждения могут помочь фаззерам находить ошибки ближе к источнику. Например, путаница типов не может привести к сбою. Даже если это произойдет, может потребоваться несколько часов, чтобы отследить, где в коде находится фактическая ошибка. Однако DCHECKS может найти, где предположение было нарушено, и сузить область поиска.Заключение
В V8 встроено множество разнообразных механизмов безопасности; включая фаззинг, очистку, ручную проверку кода, разделение и недавно увеличенную программу вознаграждения за обнаружение ошибок. В Security Brag Sheet есть список средств защиты, установленных командой Chrome для всего браузера. Некоторые из них специфичны для V8, но многие из них являются общими методами улучшения программного обеспечения. Любой, кто заинтересован в повышении безопасности V8, должен изучить эти области. Мы надеемся, что в этом посте представлены некоторые аспекты отслеживания и поиска ошибок, которые помогут с отправными точками для дальнейшего обнаружения ошибок.Рекомендации
Окно возможностей: Exodus Intelligence использует уязвимость Chrome 1dayЛист хвастовства безопасностью
Блог Chromium: фаззинг для безопасности
Руководство по стилю Chromium C++
GTAC 2013: AddressSanitizer, ThreadSanitizer и MemorySanitizer — инструменты динамического тестирования для C++
Перевел V8 Exploitation Series - Part 7 only for xss.pro