Исследование использования Sentinel Value для обхода механизма защиты Chrome V8
Sentinel value — это специальное значение в алгоритмах, которое обычно используется в качестве условия завершения для циклов или рекурсивных алгоритмов. В исходном коде Chrome существует несколько различных Sentinel value. Ранее были проведены исследования, которые показали, что утечка объекта TheHole может привести к выполнению произвольного кода в песочнице для некоторых CVE. Команда Google быстро обновила соответствующие CVE на GitHub примерно через неделю после того, как мы опубликовали статью, объясняющую это обходное решение.
Из исходного кода Chrome видно, что существует смягчающий патч, касающийся объекта TheHole, который позволяет выполнять произвольный код. Но на самом деле в V8 есть много других встроенных объектов, которые не должны быть доступны в JS. В данной статье будет обсуждаться объект Uninitialized Oddball, метод обхода которого впервые появился в Issue1352549. Стоит отметить, что на данный момент этот метод все еще доступен в последней версии V8, и Google еще не выпустил патч для его исправления.
Этот метод обладает высокой универсальностью:
Issue1216437(CVE-2021-30551) впервые представленный POC является утечкой внутреннего неинициализированного oddball.
Issue1314616(CVE-2022-1486)中的 POC также напрямую раскрывает UninitializedOddball.
Влияние Issue1352549(NoCVE) нельзя игнорировать.
Все это наглядно демонстрирует необходимость переосмысления программного обеспечения, которое может быть затронуто PatchGap.
Значение Sentinel в V8
Большинство встроенных объектов V8 определены в файле v8/src/roots/roots.h, они располагаются в памяти соседними блоками. Как только эти встроенные объекты, которые не должны быть раскрыты, становятся доступными в JavaScript, это может привести к выполнению произвольного кода в песочнице.
Чтобы проверить эффективность этого метода в последней версии V8, мы можем изменить родную функцию V8 %TheHole(), чтобы она возвращала Uninitialized Oddball.
В Issue1352549 представлен полный код, который мы извлекли и упростили, и тестировал в V8 11.0.0, по-прежнему можно реализовать относительно произвольное чтение.
При дизассемблировании оптимизированной функции чтения JavaScript можно увидеть, что при проверке obj.prop не проверяется значение, использующее obj.prop в качестве ключа, а просто вычисляется смещение для получения значения массива в соответствии с семантикой JavaScript. Это приводит к путанице типов при вычислениях, что позволяет произвольное чтение.
Когда передается uninitialized_oddball, вычисления начинаются с obj, и в конце инструкции vmovsd xmm0,[r9+r11*8+0x7] выполняется произвольное чтение, данные сохраняются в регистре xmm0.
Поскольку uninitialized_oddball в памяти V8 сортируется впереди и является более первобытным, его легче подделать, и это предпочтительный метод обхода. Произвольная запись может быть проанализирована с учетом Issue1352549.
Рекомендуется исправление: при возврате элементов массива из оптимизированной функции добавьте проверку на массив map, чтобы избежать непосредственного вычисления смещения для возврата значений массива.
PatchGap Предупреждение
После анализа Issue1352549 мы проверили программное обеспечение, в котором может быть присутствовать PatchGap, и обнаружили, что Skype до сих пор не исправил эту уязвимость. Произвольное чтение и запись под x86 немного отличается, так как нет сжатия адресов, это напрямую относительно всего процесса.
В использовании Skype, хотя ASLR и включен, из-за слишком большого размера файла хакерам достаточно читать и записывать по фиксированному адресу, чтобы с большой вероятностью получить доступ к содержимому файла Skype. В сочетании с традиционными подходами, такими как анализ PE, несложно завершить всю цепочку эксплуатации уязвимости.
Этот раз PatchGap касается не только Issue1352549, но и публичное раскрытие нового метода обхода значительно снизило сложность эксплуатации, аналогичной Issue1314616 и Issue1216437. Хакеры фактически могут реализовать полную эксплуатацию любых ранее выявленных уязвимостей uninitialized_oddball без каких-либо затрат на исследование.
В статье кратко обсуждается реализация произвольного чтения через утечку uninitialized_Oddball. В V8 также есть множество других значений Sentinel, и во время тестирования также могут возникать сбои, не связанные с int3. Поскольку Uninitialized_Oddball и TheHole могут обойти защиту V8, другие значения Sentinel также могут иметь аналогичные проблемы.
Это дает нам некоторые идеи:
Другие uninitialized_Oddball утечки также могут легко реализовать RCE в V8.
Google быстро исправил обход TheHole, но проблема с использованием сборки мусора для обхода ASLR долго оставалась незаконченной, что указывает на неясные границы того, считается ли подобная проблема официальной проблемой безопасности.
Если рассматривать это как официальную проблему безопасности, необходимо ли в fuzzer учитывать такие значения Sentinel, как %TheHole/uninitialized_Oddball, в качестве переменных для обнаружения других эксплуатационных примитивов.
Независимо от того, рассматриваются ли такие проблемы как официальные проблемы безопасности, они значительно сокращают период, за который хакеры могут полностью использовать уязвимость.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
16 Лайков
Награда
16
6
Поделиться
комментарий
0/400
OptionWhisperer
· 9ч назад
Эта уязвимость серьезна, мелкие детали могут быть фатальными.
Посмотреть ОригиналОтветить0
OnchainFortuneTeller
· 9ч назад
Этот баг удивительный
Посмотреть ОригиналОтветить0
ExpectationFarmer
· 10ч назад
Уязвимости действительно невозможно предотвратить!
Исследование уязвимости Sentinel Value в движке V8: обход защиты для реализации произвольного выполнения кода
Исследование использования Sentinel Value для обхода механизма защиты Chrome V8
Sentinel value — это специальное значение в алгоритмах, которое обычно используется в качестве условия завершения для циклов или рекурсивных алгоритмов. В исходном коде Chrome существует несколько различных Sentinel value. Ранее были проведены исследования, которые показали, что утечка объекта TheHole может привести к выполнению произвольного кода в песочнице для некоторых CVE. Команда Google быстро обновила соответствующие CVE на GitHub примерно через неделю после того, как мы опубликовали статью, объясняющую это обходное решение.
Из исходного кода Chrome видно, что существует смягчающий патч, касающийся объекта TheHole, который позволяет выполнять произвольный код. Но на самом деле в V8 есть много других встроенных объектов, которые не должны быть доступны в JS. В данной статье будет обсуждаться объект Uninitialized Oddball, метод обхода которого впервые появился в Issue1352549. Стоит отметить, что на данный момент этот метод все еще доступен в последней версии V8, и Google еще не выпустил патч для его исправления.
Этот метод обладает высокой универсальностью:
Issue1216437(CVE-2021-30551) впервые представленный POC является утечкой внутреннего неинициализированного oddball.
Issue1314616(CVE-2022-1486)中的 POC также напрямую раскрывает UninitializedOddball.
Влияние Issue1352549(NoCVE) нельзя игнорировать.
Все это наглядно демонстрирует необходимость переосмысления программного обеспечения, которое может быть затронуто PatchGap.
Значение Sentinel в V8
Большинство встроенных объектов V8 определены в файле v8/src/roots/roots.h, они располагаются в памяти соседними блоками. Как только эти встроенные объекты, которые не должны быть раскрыты, становятся доступными в JavaScript, это может привести к выполнению произвольного кода в песочнице.
Чтобы проверить эффективность этого метода в последней версии V8, мы можем изменить родную функцию V8 %TheHole(), чтобы она возвращала Uninitialized Oddball.
! Эксклюзивное раскрытие обхода Chrome v8 HardenProtect путем утечки сигнального значения
Байпасный HardenType
В Issue1352549 представлен полный код, который мы извлекли и упростили, и тестировал в V8 11.0.0, по-прежнему можно реализовать относительно произвольное чтение.
При дизассемблировании оптимизированной функции чтения JavaScript можно увидеть, что при проверке obj.prop не проверяется значение, использующее obj.prop в качестве ключа, а просто вычисляется смещение для получения значения массива в соответствии с семантикой JavaScript. Это приводит к путанице типов при вычислениях, что позволяет произвольное чтение.
! Эксклюзивное раскрытие обхода Chrome v8 HardenProtect путем утечки значения Sentinel
Когда передается uninitialized_oddball, вычисления начинаются с obj, и в конце инструкции vmovsd xmm0,[r9+r11*8+0x7] выполняется произвольное чтение, данные сохраняются в регистре xmm0.
Поскольку uninitialized_oddball в памяти V8 сортируется впереди и является более первобытным, его легче подделать, и это предпочтительный метод обхода. Произвольная запись может быть проанализирована с учетом Issue1352549.
Рекомендуется исправление: при возврате элементов массива из оптимизированной функции добавьте проверку на массив map, чтобы избежать непосредственного вычисления смещения для возврата значений массива.
PatchGap Предупреждение
После анализа Issue1352549 мы проверили программное обеспечение, в котором может быть присутствовать PatchGap, и обнаружили, что Skype до сих пор не исправил эту уязвимость. Произвольное чтение и запись под x86 немного отличается, так как нет сжатия адресов, это напрямую относительно всего процесса.
В использовании Skype, хотя ASLR и включен, из-за слишком большого размера файла хакерам достаточно читать и записывать по фиксированному адресу, чтобы с большой вероятностью получить доступ к содержимому файла Skype. В сочетании с традиционными подходами, такими как анализ PE, несложно завершить всю цепочку эксплуатации уязвимости.
! Эксклюзивное раскрытие обхода Chrome v8 HardenProtect путем утечки сигнального значения
Этот раз PatchGap касается не только Issue1352549, но и публичное раскрытие нового метода обхода значительно снизило сложность эксплуатации, аналогичной Issue1314616 и Issue1216437. Хакеры фактически могут реализовать полную эксплуатацию любых ранее выявленных уязвимостей uninitialized_oddball без каких-либо затрат на исследование.
! Эксклюзивное раскрытие обхода Chrome v8 HardenProtect путем утечки значения Sentinel
Обзор
В статье кратко обсуждается реализация произвольного чтения через утечку uninitialized_Oddball. В V8 также есть множество других значений Sentinel, и во время тестирования также могут возникать сбои, не связанные с int3. Поскольку Uninitialized_Oddball и TheHole могут обойти защиту V8, другие значения Sentinel также могут иметь аналогичные проблемы.
Это дает нам некоторые идеи:
Другие uninitialized_Oddball утечки также могут легко реализовать RCE в V8.
Google быстро исправил обход TheHole, но проблема с использованием сборки мусора для обхода ASLR долго оставалась незаконченной, что указывает на неясные границы того, считается ли подобная проблема официальной проблемой безопасности.
Если рассматривать это как официальную проблему безопасности, необходимо ли в fuzzer учитывать такие значения Sentinel, как %TheHole/uninitialized_Oddball, в качестве переменных для обнаружения других эксплуатационных примитивов.
Независимо от того, рассматриваются ли такие проблемы как официальные проблемы безопасности, они значительно сокращают период, за который хакеры могут полностью использовать уязвимость.
! Эксклюзивное раскрытие обхода Chrome v8 HardenProtect путем утечки значения Sentinel