Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2022-22063 — Проблема безопасности в прошивке гипервизора некоторых старых чипсетов Qualcomm | Kitploit
Инструменты/GitHubGitHub/msm8916-mainline/cve-2022-22063
Безопасность встроенных системПовышение привилегийАнализ уязвимостейЭксплуатацияАппаратная БезопасностьСтатьи и ИсследованияОбучение и ОбразованиеАнализ ПрошивокЭксплуатация Бинарных Файлов
GitHubmsm8916-mainline/cve-2022-22063

CVE-2022-22063

Проблема безопасности в прошивке гипервизора некоторых старых чипсетов Qualcomm

4733 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
Репозиторий

CVE-2022-22063

CVE-2022-22063 — это проблема безопасности в гипервизорной прошивке некоторых старых чипсетов Qualcomm. Незащищенный аппаратный компонент (так называемый «boot remapper») может быть использован для получения полного доступа на чтение/запись к гипервизору из модифицированной операционной системы (повышение привилегий). Эксплуатация проблемы тривиальна на затронутых платформах, поскольку не требуется знание конкретной версии прошивки (например, адресов или переменных).

Примечание: Хотя Qualcomm предоставила исправления клиентам (с достаточным временем для выпуска обновлений), многие затронутые устройства уже довольно стары и могут не получить исправление от вендора. Проблема может быть использована только из модифицированной или скомпрометированной операционной системы (с использованием другой проблемы безопасности). Поддержание операционной системы в актуальном и безопасном состоянии может быть достаточным, даже если прошивка уязвима.

Обзор

  • Идентификатор CVE: CVE-2022-22063
  • Рейтинг безопасности (Qualcomm): Критический
  • Common Vulnerability Scoring System: 8.4 (Высокий), CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
  • Common Weakness Enumeration: CWE-1257: Некорректный контроль доступа, применяемый к зеркальным или псевдонимическим областям памяти и/или CWE-1262: Некорректный контроль доступа для интерфейса регистров, Qualcomm классифицирует проблему в целом как CWE-16: Конфигурация.

Проблема также была опубликована в Бюллетене безопасности Qualcomm за декабрь 2022 года.

Требования

Проблема зависит от комбинации аппаратного и программного обеспечения на затронутой цели:

  1. Программное обеспечение: Устройство работает под управлением отдельной прошивки гипервизора от Qualcomm (обычно образ ELF в разделе hyp на внутреннем накопителе).
  2. Аппаратное обеспечение: Существует небезопасная версия boot remapper (обычно настраиваемая с помощью аппаратного регистра APCS_BOOT_START_ADDR_NSEC), которая не защищена гипервизором и поэтому доступна для менее привилегированного ядра операционной системы (например, Linux).

Существует несколько других чипсетов, которые, вероятно, имеют затронутое оборудование (например, MSM8909 и MSM8953), но у них нет отдельной прошивки гипервизора, которую можно было бы скомпрометировать.

Воздействие

  • Повышение привилегий: При уже скомпрометированном ядре операционной системы (например, Linux) проблема позволяет тривиально повысить привилегии до уровня гипервизора (EL1 -> EL2 на ARM). Вся память, управляемая гипервизором, может быть прочитана или записана. Это нарушает изоляцию различных доменов безопасности или виртуальных машин, управляемых гипервизором (если они есть, в зависимости от конфигурации).
    (См. также: An introduction to Access Control on Qualcomm Snapdragon Platforms)

  • Безопасная загрузка: Большинство устройств Qualcomm, доступных в производстве, используют безопасную загрузку для предотвращения несанкционированной модификации прошивки. Прошивка криптографически подписана и проверяется цепочкой загрузки. Проблема позволяет модифицировать или даже полностью заменить загруженную прошивку гипервизора во время выполнения из модифицированной операционной системы (либо через официально поддерживаемую «разблокировку загрузчика», либо через другой эксплойт).
    (См. также: Qualcomm Secure Boot and Image Authentication Technical Overview (v1.0) и (v2.0))

Технические сведения

Примечание: Проблема была изначально обнаружена на платформе Qualcomm Snapdragon 410 (MSM8916). Некоторые из следующих объяснений могут быть специфичны для MSM8916, например:

  • Конкретные адреса памяти
  • 64-битная ARM/AArch64 конструкция прошивки (некоторые затронутые платформы поддерживают только 32-битную ARM/AArch32)

Однако общая концепция применима аналогично ко всем затронутым платформам.

Гипервизор

Архитектура ARMv8-A 64-bit определяет 4 уровня привилегий (exception levels, EL). Существуют отдельные уровни, которые обычно используются для приложений, ядер операционных систем и гипервизора:

Уровни исключений AArch64

ЦП переключается между уровнями во время исключений, например, из-за входящего прерывания. Также возможно переключение между некоторыми уровнями с помощью специальных инструкций, таких как Hypervisor Call (hvc).
(См. также: AArch64 Exception model)

Гипервизор может размещать одну или несколько виртуальных машин с отдельными ядрами операционных систем. Каждой виртуальной машине может быть предоставлено собственное представление памяти с помощью трансляции второго уровня (stage 2 translation). Все обращения к памяти из виртуальной машины проходят через два этапа трансляции: первый управляется (виртуальной) операционной системой, а второй — гипервизором. Память, используемая гипервизором или другими виртуальными машинами, может быть скрыта путем ее исключения из таблиц трансляции.
(См. также: AArch64 virtualization, AArch64 memory management)

Прошивка гипервизора Qualcomm работает в EL2 и использует трансляцию второго уровня для запрета доступа к памяти гипервизора из основного ядра операционной системы, работающего в EL1 (обычно Linux). Обратите внимание, что в этой конфигурации трансляция второго уровня в основном используется для защиты памяти, без трансляции адресов. Основная операционная система получает прямой доступ к большинству аппаратных компонентов в пространстве memory-mapped input/output (MMIO), например, к контроллеру SD или подсистеме камеры. Доступ к памяти, принадлежащей гипервизору/EL2 (hyp) и монитору безопасности/EL3 (часть tz), ограничен:

Защита памяти гипервизора Qualcomm (с использованием трансляции второго уровня)

Boot Remapper

Boot remapper не связан с виртуализацией: он необходим во время начальной загрузки ядра ЦП. На этой аппаратной платформе ядра ЦП всегда начинают выполнение с адреса 0x0. Boot remapper — это дополнительный аппаратный компонент, встроенный вокруг ЦП, который перенаправляет первые 64 или 128 КиБ (0x00000 - 0x20000) в настраиваемую область памяти.

По умолчанию boot remapper указывает на загрузочное ПЗУ (первый код, который выполняется при включении устройства). Позже отображение изменяется так, чтобы другие ядра ЦП сразу начинали выполнение в прошивке EL3 (часть tz), загруженной в ОЗУ:

Boot Remapper

Обратите внимание, что адрес, к которому обращается ЦП (внутри tz), доступен по двум разным физическим адресам: реальному адресу в ОЗУ (0x8650xxxx) и перенаправленному адресу через boot remapper (0x0000xxxx).

На самом деле существуют два отдельных экземпляра boot remapper:

  • Безопасный: Перенаправляет обращения к памяти, выполненные в безопасном состоянии. Этот экземпляр используется для запуска ЦП, так как ЦП изначально начинает выполнение в безопасном состоянии (EL3). Он настраивается с помощью APCS_BOOT_START_ADDR_SEC (= 0x0b010004), но только в безопасном состоянии.
  • Небезопасный: Перенаправляет обращения к памяти, выполненные в небезопасном состоянии. Он настраивается с помощью APCS_BOOT_START_ADDR_NSEC (= 0x0b010008), даже в небезопасном состоянии.

Оба экземпляра boot remapper могут быть настроены с помощью регистра памяти, содержащего базовый адрес для перенаправленной области и два бита конфигурации: REMAP_EN для включения перенаправления и BOOT_128KB_EN для перенаправления первых 128 КиБ вместо 64 КиБ.

(См. также: Qualcomm Snapdragon 410E Technical Reference Manual rev. D, страницы 85 и 116)

Концепция

Используя знания из предыдущих двух разделов, основная идея проста: Использовать boot remapper для обхода защиты памяти (трансляции второго уровня) гипервизора.

Boot remapper работает не только во время запуска ЦП. Его можно использовать в любое время, и он предоставляет полный доступ на чтение/запись/исполнение к перенаправленной области. Кроме того, гипервизор Qualcomm, похоже, не препятствует операционной системе настраивать и обращаться к небезопасному экземпляру boot remapper на затронутых устройствах (он не защищен с помощью трансляции второго уровня). Таким образом, проблему легко использовать, выполнив:

  1. Настройку boot remapper на произвольную область памяти, которая обычно защищена трансляцией второго уровня (например, прошивка гипервизора hyp, начинающаяся с адреса 0x8640xxxx), после чего
  2. Чтение/запись через boot remapper (адрес 0x0000xxxx).

Концепция CVE-2022-22063

Перенаправленная область может динамически сдвигаться (блок за блоком) для доступа к областям памяти, превышающим 64/128 КиБ, доступным через boot remapper. Также возможно использовать это для полного отключения защиты памяти гипервизора (см. Доказательство концепции).


Примечание: Тот же эксплойт не работает для прошивки безопасного мира (tz). Хотя boot remapper позволяет обойти трансляцию второго уровня, область памяти tz в DRAM, по-видимому, защищена дополнительным аппаратным компонентом (вне ЦП), который блокирует доступ после прохождения через boot remapper:

Концепция CVE-2022-22063, примененная к прошивке EL3 (не работает)

Область памяти tz, вероятно, доступна только в безопасном состоянии. Эксплойт позволяет обойти только защиту памяти гипервизора; другие механизмы безопасности оборудования остаются в силе.

Доказательство концепции

Boot remapper может быть использован для полного отключения и замены оригинальной прошивки гипервизора во время выполнения, без знания версии прошивки. В частности, нет необходимости использовать обратную разработку для получения адресов переменных и функций, которые можно было бы модифицировать. Достаточно знать приблизительную область памяти прошивки гипервизора, например, из резервирования памяти в коде Linux с открытым исходным кодом или путем чтения заголовков ELF двоичного файла прошивки гипервизора (доступного в разделе hyp на внутреннем накопителе).

Общая идея:

  1. Использовать boot remapper для перезаписи кода, используемого для обработки гипервызовов (Hypervisor Calls) из операционной системы.
  2. Совершить гипервызов (hvc) для переключения из операционной системы в гипервизор (с EL1 на EL2).
  3. Позволить шелл-коду полностью отключить гипервизор, включая трансляцию второго уровня, используемую для защиты памяти. Затем вернуться обратно в EL1.
  4. Память гипервизора теперь доступна напрямую из EL1, без прохождения через boot remapper.

Код, реализующий это, не длинный, но включает низкоуровневую ассемблерную вставку AArch64 и осторожное взаимодействие с кэшами ЦП. Однако основной вопрос остается открытым: куда именно следует записать шелл-код, чтобы он не был привязан к конкретной версии прошивки гипервизора?

Поиск адреса входа

Во время гипервызова (или любого исключения в целом) выполнение ЦП принудительно направляется на специальный адрес памяти: вектор исключения. Векторы исключений являются частью большей таблицы векторов, которая содержит код, обрабатывающий различные типы исключений, поступающих с текущего или более низких уровней исключений:

Таблица векторов AArch64

Каждый прямоугольник представляет вектор исключения с пространством для 32 инструкций ассемблера. Этого пространства недостаточно, поэтому они обычно содержат инструкции ветвления, которые переходят куда-то еще, где больше места для дополнительного кода.

Смещения указываются относительно регистра базового адреса векторов (VBAR), который определяет базовый адрес таблицы векторов для каждого уровня исключений. Гипервизор записывает базовый адрес в регистр VBAR_EL2 ЦП.

Гипервызов — это синхронное исключение, сделанное с более низкого уровня исключений (ядро операционной системы, работающее в EL1, к гипервизору в EL2). Если ядро операционной системы работает в 32-битном режиме, ЦП перейдет по адресу VBAR_EL2+0x600, или по адресу VBAR_EL2+0x400 в 64-битном режиме. После использования boot remapper для записи пользовательского кода по этому адресу и совершения гипервызова ЦП начнет выполнение шелл-кода.

К сожалению, VBAR_EL2 не читается ядром операционной системы, работающим в EL1. Он читается только из гипервизора (EL2) или выше. Тем не менее, это знание значительно упрощает угадывание адреса входа с помощью перебора: базовый адрес таблицы векторов должен быть выровнен по (кратному) ее размеру (0x800 = 2 КиБ). Это означает, что существует только 64 возможных местоположения внутри области размером 128 КиБ, или 512 внутри области размером 1 МиБ:

Возможные местоположения таблицы векторов

Красные прямоугольники показывают все возможные местоположения, куда ЦП может перейти во время гипервызова. Запись шелл-кода по всем ним достаточна, чтобы сохранить подход независимым от конкретной версии прошивки (которая на самом деле будет иметь таблицу векторов по одному конкретному адресу).

Это можно улучшить еще больше: boot remapper позволяет как чтение, так и запись, поэтому можно добавить некоторую эвристику, основанную на существующем коде/данных, считанных из местоположений памяти. Они должны содержать допустимые инструкции AArch64 (A64) и, возможно, повторяющиеся байты заполнения, такие как NOP или инструкции ветвления. (Пространство для 32 инструкций на вектор исключения часто используется лишь частично, потому что проще перейти в соответствующую функцию с большим пространством.)

Реализация

Код доказательства концепции, включенный в этот репозиторий, представляет собой модификацию загрузчика Little Kernel (LK) с открытым исходным кодом Qualcomm для платформы Snapdragon 410 (MSM8916/APQ8016), изначально предназначенную для тестирования с платой разработчика DragonBoard 410c. Все это было выбрано для простоты; проблема также может быть использована из других операционных систем (например, Linux), других затронутых платформ и даже устройств с безопасной загрузкой — при условии, что есть способ выполнить пользовательский код внутри ядра операционной системы.

Код реализует подход, описанный выше, для полного отключения работающего гипервизора, а затем заменяет его другой версией. Новый «гипервизор» не поддерживает никакие виртуальные машины, но способен дать Ответ на Главный Вопрос Жизни, Вселенной и Всего Остального с помощью простого гипервызова:``` $ fastboot oem CVE-2022-22063 < waiting for any device > (bootloader) Hypervisor, what is the Answer to The Ultimate Question of (bootloader) Life, the Universe and Everything? (bootloader) Old hypervisor returned answer: -2 (bootloader) Old non-secure boot remapper base address: 0x100000 (bootloader) Setting boot remapper to hypervisor memory (0x86400000) (bootloader) Using boot remapper to copy shell code to hypervisor memory (bootloader) Copying to all possible vector tables (starting at 0x600) (bootloader) Calling shell code to disable running hypervisor (bootloader) Found old EL2 vector base address at 0x86404000 (bootloader) Copying new code directly to hypervisor memory (0x86400000) (bootloader) Hypervisor, what is the Answer to The Ultimate Question of (bootloader) Life, the Universe and Everything? (bootloader) New hypervisor returned answer: 42 OKAY [ 0.015s] Finished. Total time: 0.015s

root@kitploit:~
### Тестирование
Код доказательства концепции можно собрать и протестировать следующим образом:```shell
$ git clone https://git.codelinaro.org/clo/la/kernel/lk.git -b caf_migration/LA.BR.1.2.9.1_rb1.5
$ cp CVE-2022-22063.c lk/platform/msm8916/
$ git apply LK.diff
# Build LK for msm8916 and flash it to device
$ fastboot oem CVE-2022-22063
...

Однако эта конфигурация подходит только для платы разработки DragonBoard 410c и других устройств без безопасной загрузки, где основной загрузчик можно легко (и безопасно) заменить. Код в этом репозитории предоставлен в первую очередь для ознакомления, а не для простого использования/тестирования.

В будущем планируется интегрировать код в новую версию lk2nd, которую можно будет гораздо проще тестировать на различных устройствах без замены основного загрузчика.

Исправление

Согласно Qualcomm, проблема была исправлена путем запрета доступа к области перераспределения загрузчика с помощью трансляции второго уровня. Конфигурация перераспределения загрузчика (регистр APCS_BOOT_START_ADDR_NSEC) по-прежнему доступна, но теперь обе области памяти заблокированы:

CVE-2022-22063 fix

Другой возможный вариант исправления — защитить регистр APCS_BOOT_START_ADDR_NSEC в гипервизоре. В этом случае перераспределенная область может остаться доступной, так как у операционной системы не будет способа перенастроить перераспределитель загрузчика на другие области памяти.

Хронология

  • Октябрь 2021: Проблема сообщена в [email protected]; первоначальный ответ от Qualcomm.
  • Ноябрь 2021: Запросил обновление у Qualcomm; им нужно больше времени для расследования.
  • Декабрь 2021: Qualcomm подтверждает проблему, новые чипсеты не затронуты, но некоторые старые всё ещё поддерживаются. Они запрашивают эмбарго примерно на 6 месяцев для разработки и распространения исправления среди клиентов.
  • Май 2022: Запросил обновление у Qualcomm; они всё ещё работают над исправлением для некоторых платформ.
  • Июнь 2022: Qualcomm назначает предварительный номер CVE и просит продлить эмбарго до ноября.
  • Ноябрь 2022:
    • 7 ноября: Запросил обновление у Qualcomm, так как проблема не была опубликована в ноябрьском бюллетене.
    • 10 ноября: Qualcomm назначает новый номер CVE, они планируют добавить его в существующий бюллетень.
  • Декабрь 2022:
    • 5 декабря: Qualcomm публикует проблему в December 2022 security bulletin.
    • 28 декабря: Отчет опубликован на GitHub (msm8916-mainline/CVE-2022-22063).

По словам Qualcomm, с этой проблемой было особенно трудно справиться, поскольку их обычные инструменты автоматизации не могли быть использованы. Большинство получаемых ими проблем являются программными, где затронутые устройства можно определить, проверив исходный код. Для этой проблемы требовалась ручная проверка как аппаратного, так и программного обеспечения (есть ли на платформе проблемный регистр и уязвим ли гипервизор). К сожалению, отказ от автоматизации также означал, что проблема не была автоматически запланирована в бюллетене безопасности. Второе продление эмбарго было запрошено для того, чтобы уведомить клиентов о проблеме безопасности и дать им время на установку исправлений. Они работают над улучшением процесса, чтобы избежать подобных проблем в будущих отчетах.

Ссылки

  • Qualcomm's December 2022 Security Bulletin
  • Arm Architecture Reference Manual for A-profile architecture
  • Qualcomm Snapdragon 410E Technical Reference Manual rev. D
  • Qualcomm Snapdragon 410E Hardware Register Description
  • ARM: Изучение архитектуры
    • AArch64 Exception model
    • AArch64 memory management
    • AArch64 virtualization
  • Технические документы Qualcomm
    • An introduction to Access Control on Qualcomm Snapdragon Platforms
    • Qualcomm Secure Boot and Image Authentication Technical Overview (v1.0)
    • Qualcomm Secure Boot and Image Authentication Technical Overview (v2.0)

Лицензия

Отчет о CVE-2022-22063 и диаграммы © 2022 by Stephan Gerhold лицензированы в соответствии с Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0).

Код proof of concept (CVE-2022-22063.c) предоставляется под лицензией MIT.

Скачать инструмент