Анализ эксплуатации уязвимости Sentinel Value в движке Chrome V8
Sentinel value — это специальное значение в алгоритмах, которое обычно используется в качестве условия завершения в циклах или рекурсивных алгоритмах. В исходном коде Chrome существует множество Sentinel value. Ранее исследования показали, что можно осуществить произвольное выполнение кода в песочнице Chrome через утечку объекта TheHole. Команда Google впоследствии исправила соответствующие уязвимости.
Однако в V8 также есть другие встроенные объекты, которые не должны быть доступны в JS. В этой статье обсуждается объект Uninitialized Oddball, утечка которого может привести к методам обхода песочницы, которые все еще доступны в последней версии V8.
Следует отметить, что этот метод обладает определенной универсальностью:
CVE-2021-30551 первоначальный PoC просто раскрывает внутренний неинициализированный oddball.
В PoC CVE-2022-1486 также была прямо раскрыта UninitializedOddball.
Issue1352549 ( нераспределенный CVE) подробно описывает методы эксплуатации.
Эти примеры показывают, что стоит обратить внимание на возможность атак с использованием утечки Uninitialized Oddball.
Значение Sentinel в V8
Большинство встроенных объектов V8 определены в файле v8/src/roots/roots.h, и они расположены в памяти последовательно. Как только эти встроенные объекты, которые не должны быть раскрыты, становятся доступными в JavaScript, может быть реализовано выполнение произвольного кода в песочнице.
Чтобы это проверить, можно изменить возвращаемое значение нативной функции V8 %TheHole() на Uninitialized Oddball.
Обойти защиту HardenType
В Issue1352549 представлен полный код обхода. Упрощенная основная логика следующая:
JavaScript
function read(obj, idx) {
вернуться obj[idx];
}
let uninitialized = %TheHole();
пусть arr = [1.1];
пусть res = read(uninitialized, 0x12345);
%DebugPrint(res);
Этот код все еще может реализовать относительное чтение в последней версии V8 11.0.0.
Анализируя оптимизированный ассемблерный код функции read, можно заметить, что он проверяет только правильность свойства prop объекта obj, но не проверяет значение obj.prop в качестве ключа. Это приводит к путанице типов при вычислениях, что позволяет произвольно читать.
При передаче uninitialized_oddball, начиная с определенной инструкции, вычисляется от obj, и в конечном итоге произвольное чтение завершается в инструкции vmovsd xmm0,[r9+r11*8+0x7], данные сохраняются в регистре xmm0.
Рекомендуемое решение заключается в том, чтобы при возврате элементов массива из оптимизированной функции добавить проверку на массив map, чтобы избежать прямого вычисления смещения для возврата значений массива.
Предупреждение PatchGap
При проверке программного обеспечения, в котором может быть уязвимость PatchGap, было обнаружено, что Skype на данный момент не исправил этот недостаток. В архитектуре x86, из-за отсутствия сжатия адресов, произвольное чтение и запись осуществляется напрямую относительно всего процесса.
Хотя Skype включил ASLR, из-за его большого размера, если его поместить непосредственно в 4 ГБ памяти, злоумышленнику достаточно читать и записывать по какому-то фиксированному адресу, чтобы с большой вероятностью прочитать или записать содержимое файлов Skype. В сочетании с традиционными методами, такими как анализ PE, можно завершить всю цепочку эксплуатации уязвимости.
Этот раз PatchGap касается не только Issue1352549, но и значительно упростил эксплуатацию подобных уязвимостей, таких как Issue1314616 и Issue1216437. Хакеры практически не нуждаются в дополнительном исследовании для полной эксплуатации любой утечки uninitialized_oddball.
Резюме
В данной статье описывается метод выполнения произвольного чтения примитивов через утечку uninitialized_Oddball из Sentinel value. В V8 также существуют другие Sentinel value, которые могут привести к аналогичным проблемам. Это дает нам следующие выводы:
Может ли утечка других uninitialized_Oddball также легко привести к RCE в V8.
Существует спор о том, следует ли рассматривать такого рода проблемы как официальные вопросы безопасности.
В fuzzer можно рассмотреть возможность добавления таких значений-сентинелов, как %TheHole/uninitialized_Oddball, в качестве переменных для выявления других уязвимостей.
В любом случае, такие проблемы значительно сокращают период, необходимый хакерам для полного использования.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
9 Лайков
Награда
9
5
Репост
Поделиться
комментарий
0/400
CoffeeNFTrader
· 07-22 08:13
Ещё одна уязвимость безопасности, все в панике.
Посмотреть ОригиналОтветить0
Hash_Bandit
· 07-21 21:23
добыча с помощью js-движка только что стала реальностью...сложность эксплуатации достигла максимума
Посмотреть ОригиналОтветить0
ConsensusDissenter
· 07-20 00:25
Еще одна кодовая черная дыра появилась. Это так страшно.
Посмотреть ОригиналОтветить0
Blockblind
· 07-20 00:19
v8 тоже имеет такую большую уязвимость? Убиваюсь со смеху
Посмотреть ОригиналОтветить0
BlockchainTalker
· 07-20 00:12
на самом деле удивлён, что V8 всё ещё испытывает трудности с этим... кстати, где моя изоляция выполнения, семья?
Анализ эксплуатации уязвимости Sentinel Value в движке Chrome V8: возможность выполнения кода без дополнительных исследований
Анализ эксплуатации уязвимости Sentinel Value в движке Chrome V8
Sentinel value — это специальное значение в алгоритмах, которое обычно используется в качестве условия завершения в циклах или рекурсивных алгоритмах. В исходном коде Chrome существует множество Sentinel value. Ранее исследования показали, что можно осуществить произвольное выполнение кода в песочнице Chrome через утечку объекта TheHole. Команда Google впоследствии исправила соответствующие уязвимости.
Однако в V8 также есть другие встроенные объекты, которые не должны быть доступны в JS. В этой статье обсуждается объект Uninitialized Oddball, утечка которого может привести к методам обхода песочницы, которые все еще доступны в последней версии V8.
Следует отметить, что этот метод обладает определенной универсальностью:
CVE-2021-30551 первоначальный PoC просто раскрывает внутренний неинициализированный oddball.
В PoC CVE-2022-1486 также была прямо раскрыта UninitializedOddball.
Issue1352549 ( нераспределенный CVE) подробно описывает методы эксплуатации.
Эти примеры показывают, что стоит обратить внимание на возможность атак с использованием утечки Uninitialized Oddball.
Значение Sentinel в V8
Большинство встроенных объектов V8 определены в файле v8/src/roots/roots.h, и они расположены в памяти последовательно. Как только эти встроенные объекты, которые не должны быть раскрыты, становятся доступными в JavaScript, может быть реализовано выполнение произвольного кода в песочнице.
Чтобы это проверить, можно изменить возвращаемое значение нативной функции V8 %TheHole() на Uninitialized Oddball.
Обойти защиту HardenType
В Issue1352549 представлен полный код обхода. Упрощенная основная логика следующая:
JavaScript function read(obj, idx) { вернуться obj[idx]; }
let uninitialized = %TheHole(); пусть arr = [1.1]; пусть res = read(uninitialized, 0x12345); %DebugPrint(res);
Этот код все еще может реализовать относительное чтение в последней версии V8 11.0.0.
Анализируя оптимизированный ассемблерный код функции read, можно заметить, что он проверяет только правильность свойства prop объекта obj, но не проверяет значение obj.prop в качестве ключа. Это приводит к путанице типов при вычислениях, что позволяет произвольно читать.
! Эксклюзивное раскрытие обхода Chrome v8 HardenProtect путем утечки значения Sentinel
При передаче uninitialized_oddball, начиная с определенной инструкции, вычисляется от obj, и в конечном итоге произвольное чтение завершается в инструкции vmovsd xmm0,[r9+r11*8+0x7], данные сохраняются в регистре xmm0.
! Эксклюзивное раскрытие обхода Chrome v8 HardenProtect путем утечки значения Sentinel
Рекомендуемое решение заключается в том, чтобы при возврате элементов массива из оптимизированной функции добавить проверку на массив map, чтобы избежать прямого вычисления смещения для возврата значений массива.
Предупреждение PatchGap
При проверке программного обеспечения, в котором может быть уязвимость PatchGap, было обнаружено, что Skype на данный момент не исправил этот недостаток. В архитектуре x86, из-за отсутствия сжатия адресов, произвольное чтение и запись осуществляется напрямую относительно всего процесса.
Хотя Skype включил ASLR, из-за его большого размера, если его поместить непосредственно в 4 ГБ памяти, злоумышленнику достаточно читать и записывать по какому-то фиксированному адресу, чтобы с большой вероятностью прочитать или записать содержимое файлов Skype. В сочетании с традиционными методами, такими как анализ PE, можно завершить всю цепочку эксплуатации уязвимости.
! Эксклюзивное раскрытие обхода Chrome v8 HardenProtect путем утечки значения Sentinel
Этот раз PatchGap касается не только Issue1352549, но и значительно упростил эксплуатацию подобных уязвимостей, таких как Issue1314616 и Issue1216437. Хакеры практически не нуждаются в дополнительном исследовании для полной эксплуатации любой утечки uninitialized_oddball.
Резюме
В данной статье описывается метод выполнения произвольного чтения примитивов через утечку uninitialized_Oddball из Sentinel value. В V8 также существуют другие Sentinel value, которые могут привести к аналогичным проблемам. Это дает нам следующие выводы:
Может ли утечка других uninitialized_Oddball также легко привести к RCE в V8.
Существует спор о том, следует ли рассматривать такого рода проблемы как официальные вопросы безопасности.
В fuzzer можно рассмотреть возможность добавления таких значений-сентинелов, как %TheHole/uninitialized_Oddball, в качестве переменных для выявления других уязвимостей.
В любом случае, такие проблемы значительно сокращают период, необходимый хакерам для полного использования.
! Эксклюзивное раскрытие обхода Chrome v8 HardenProtect путем утечки сигнального значения