
Proof-of-concept per CVE-2026-33317, una scrittura fuori dai limiti in OP-TEE PKCS#11 TA, che dimostra la corruzione dell'heap del Secure World tramite un template di attributi malformato.
Questo repository contiene la proof of concept per il Normal World, le note di riproduzione e i log catturati per CVE-2026-33317 / GHSA-8cqw-mg7v-c9p9.
L'avviso ufficiale OP-TEE descrive una validazione mancante in
entry_get_attribute_value() per PKCS11_CMD_GET_ATTRIBUTE_VALUE. Il bug può
causare letture fuori dai limiti dall'heap della TA PKCS#11 e, con un
template di attributi malformato, scritture oltre il buffer temporaneo del template. Questa PoC
mira al caso di scrittura fuori dai limiti e dimostra la corruzione dell'heap del Secure World nella TA PKCS#11.
CVE-2026-33317>= 3.13.04.11 e successive8.7 AltoCWE-125, CWE-787Utilizzare questo solo in un laboratorio locale o in un altro ambiente in cui sei autorizzato a testare OP-TEE.
La copia di lavoro locale da cui è stato preparato questo README era uno spazio di lavoro OP-TEE
QEMUv8 appiattito. La directory .repo e tutti i file/directory di metadati .git
sono stati rimossi, quindi quell'archivio locale non è più utilizzabile con repo sync o
i normali comandi della cronologia git.
Il repository GitHub esclude intenzionalmente i voluminosi alberi sorgente OP-TEE/QEMU,
le toolchain e gli output di build. Ricreali da qemu-v8-setup.md, oppure copia
i file PoC in una radice di build OP-TEE qemu_v8 esistente, prima di eseguire la
riproduzione QEMU automatizzata da un clone fresco.
File di primo livello importanti:
L'archivio locale preparato conteneva anche directory sorgente/build come optee_os,
optee_client, qemu, linux, trusted-firmware-a, u-boot, buildroot,
out-br e toolchains; queste sono ignorate per la pubblicazione.
Nell'albero optee_os vulnerabile, ta/pkcs11/src/object.c itera su un
template di attributi serializzato fornito dal client:
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);
Il ciclo non dimostra che ogni header di attributo e la sua area dati siano completamente all'interno del template allocato. La PoC invia:
attrs_size = 8, esattamente un pkcs11_attribute_head e nessun byte di dati.attrs_count = 1.cli_head.id = CKA_LABEL.cli_head.size = 16, corrispondente all'etichetta di 16 byte dell'oggetto creato.Questo crea un'allocazione del template di 16 byte:
sizeof(pkcs11_object_head) + attrs_size = 8 + 8 = 16
cli_ref->data punta quindi a template + 16, esattamente un byte oltre la fine
dell'allocazione. get_attribute() in ta/pkcs11/src/attributes.c vede che la
dimensione fornita dal chiamante è sufficientemente grande e copia l'etichetta di 16 byte a quel
puntatore fuori dai limiti, corrompendo l'heap della TA PKCS#11.
Prerequisiti utilizzati dallo spazio di lavoro QEMUv8 preparato:
expectqemu_v8 con output di build, toolchain e binario QEMU
disposti come l'archivio locale descritto in qemu-v8-setup.mdCompila la PoC:
./build_poc.sh
Risultato di build previsto:
Built: out/bin/c01_poc
Esegui la riproduzione QEMUv8 automatizzata:
./run_c01.sh
Il wrapper controlla questi file preparati prima dell'avvio:
out/bin/bl1.binout/bin/Imageout/bin/rootfs.cpio.gzout/bin/c01_pocSe gli artefatti di build mancano, ricrea/compila prima lo spazio di lavoro OP-TEE
e poi riesegui ./build_poc.sh.
Il log del Normal World dovrebbe mostrare la richiesta costruita:
[+] 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
Il log del Secure World dovrebbe contenere l'asserzione dell'allocatore e il panic della 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
I log catturati da un'esecuzione riuscita sono già presenti in:
out/bin/c01_nw.logout/bin/c01_sw.logc01_poc.c invoca l'UUID della TA PKCS#11
fd02c9da-306c-48c7-a49c-bbd827ae86ee tramite libteec:
CKA_LABEL = "AAAAAAAAAAAAAAAA".CMD_GET_ATTRIBUTE_VALUE malformata con attrs_size = 8
e cli_head.size = 16.La prima richiesta dannosa è sufficiente a corrompere i metadati dell'heap. La TA poi va in panic quando l'allocatore bget di OP-TEE rileva i metadati del blocco corrotti.
run_c01.sh condivide out/bin nell'ospite tramite virtio-9p e scrive i log
di nuovo nella stessa directory.out/bin dovrebbero puntare
agli artefatti all'interno di quell'archivio. Il repository GitHub pubblicato traccia solo
i file out/bin/c01_*.log catturati.C-01-reproduction.md documenta un approccio precedente con l'harness ASAN x86. La
PoC eseguibile in questa cartella è la PoC QEMUv8 TEEC: c01_poc.c.| Percorso | Scopo |
|---|
c01_poc.c | PoC AArch64 Normal World che utilizza chiamate libteec grezze |
build_poc.sh | Compila in modo incrociato c01_poc.c in out/bin/c01_poc |
run_c01.sh | Avvia QEMUv8 ed esegue la PoC tramite expect |
c01_check.exp | Automatizza il login ospite, il mount virtio-9p e l'esecuzione della PoC |
out/bin/c01_nw.log | Log di riproduzione Normal World catturato |
out/bin/c01_sw.log | Log Secure World catturato con il panic della TA PKCS#11 |
reproduction-log.md | Note complete di riproduzione QEMUv8 |
qemu-v8-setup.md | Note di configurazione e validazione di base OP-TEE QEMUv8 |
C-01-reproduction.md | Note precedenti dell'harness ASAN; non è la PoC eseguibile principale in questa cartella |
AGENTS.md | Note di manutenzione per futuri agenti AI/codice |