
إثبات مفهوم يوضح تسرب بيانات دقيق المعمارية في معالجات Loongson LA464/LA664 عبر البتات العلوية غير المعرفة في سجلات متجهات LASX، على غرار ZenBleed.
LoongBleed هو ثغرة أمنية على مستوى العتاد، تشبه من حيث المفهوم ZenBleed (CVE-2023-20593) — وهي تؤثر على معالجات Loongson LA464/LA664 التي تنفّذ كلاً من LSX (SIMD بعرض 128 بت) و LASX (SIMD بعرض 256 بت).
في LoongArch، تتشارك سجلات LSX $vr (بعرض 128 بت) في الجزء السفلي من سجلات LASX
$xr (بعرض 256 بت). تُعرَّف تعليمات LSX وعمليات الفاصلة العائمة الأساسية على أنها
تعمل فقط على البتات الـ 128 السفلية (أو مجموعة فرعية منها)؛ أما البتات العلوية
للسجل $xr المقابل فهي غير معرّفة. ومع ذلك، ونظراً لخلل في البنية الدقيقة
(microarchitectural flaw)، فإن هذه العمليات قد تسرّب البيانات عبر البتات
الـ 128 العلوية من $xr، مما يكشف بيانات حساسة عبر حدود الامتيازات أو بين
أشقاء SMT.
ملاحظة حول الاكتشاف المستقل — تم اكتشاف نفس الخلل العتادي الأساسي ونشره بشكل مستقل من قبل باحثين في CISPA Helmholtz Center for Information Security تحت اسم LoongLeak (https://loongleakattack.com/)، وقُدِّم في USENIX Security 2026 بعنوان "LoongLeak: Architectural Cross-Privilege-Boundary Data Leakage on LoongArch CPUs". تم تطوير عملنا بشكل مستقل عن فريق LoongLeak؛ وقد توصلت المجموعتان إلى الاستنتاج نفسه بأن معالجات Loongson LA464/LA664 تسرّب البيانات عبر البتات العلوية غير المعرّفة من سجلات LASX
$xr. تجدر الإشارة إلى أن التعليمات التي نستخدمها لإحداث التسريب ليست مطابقة لتلك المذكورة في ورقة LoongLeak: يعتمد إثبات المفهوم لدينا على مجموعة مختلفة من الأدوات (vor.v،vld،fld.d،fld.s) لإعادة إنتاج نفس الخلل العتادي الأساسي. علاوة على ذلك، ولأن التسريب يمكن إحداثه بتعليمات سجل-إلى-سجل بحتة مثلvor.v(دون أي تحميل من الذاكرة)، فإن تحليلنا يشير إلى أن السبب الجذري على الأرجح هو إعادة استخدام السجلات الفيزيائية: لا يتم مسح البتات العلوية لسجل فيزيائي مُعاد استخدامه، مما يسرّب بيانات قديمة من شاغل السجل السابق. وهذا يختلف عن تحليل ورقة LoongLeak، الذي ينسب البيانات المسرّبة إلى ذاكرة L1 data cache.
يعمل إثبات المفهوم على النحو التالي:
$xrN عبر xvld.xvst.يشغّل إثبات المفهوم هذه الأداة بشكل متكرر عبر 16 سجل متجه معماري
($xr0–$xr15) على خيوط مثبّتة إلى أنوية فيزيائية. تشير القيم غير الصفرية التي
تظهر بعد التعليمة إلى أن البنية الدقيقة قد نشرت بيانات قديمة أو من سياق آخر
إلى حالة السجل المعماري.
يدعم إثبات المفهوم تعليمات اختبار متعددة، يمكن اختيارها عبر --gadget:
على LA664، تكشف الأدوات الأربع جميعها التسريب، بحيث يسرّب 192 بت كحد أقصى
لكل متجه. أما على LA464، فتسرّب vld و fld.d و fld.s (224 بت كحد أقصى
لكل متجه)؛ بينما لا تسرّب الأداة الافتراضية vor.v على LA464.
Usage: ./loongbleed_poc [OPTIONS]
Options:
-a, --all Launch one thread pinned to each physical core.
By default only thread on CPU 0 is launched.
-g, --gadget [vor|vld|fld.d|fld.s]
Use different instructions for testing.
-h, --help Show this help and exit.
# Single-thread mode on CPU 0
./run.sh
# Single-thread mode with vld gadget (required for LA464)
./run.sh --gadget vld
# All physical cores, default gadget
./run.sh -a
# All cores with fld.d gadget
./run.sh --all --gadget fld.d
يعالج خيط الضحية بيانات حساسة على وحدة معالجة منطقية واحدة بينما يفحص إثبات المفهوم السجلات على شقيقه في SMT. يمكن لخيط التنصت ملاحظة أجزاء من بيانات الضحية في البتات العلوية المسرّبة.
# Terminal 1 — start LoongBleed on CPU 0
./run.sh
# Terminal 2 — victim workload on the SMT sibling (CPU 1)
while true; do numactl -C 1 sort < /etc/shadow > /dev/null; done
لإعداد آلي، استخدم السكربت المرفق:
./poc_la664.sh
يقوم هذا بتشغيل حمل عمل sort على CPU 1 (شقيق SMT لـ CPU 0) وتشغيل LoongBleed
على CPU 0 بالأداة الافتراضية.
يعالج خيط الضحية بيانات حساسة على وحدة معالجة بينما يفحص إثبات المفهوم السجلات
على النواة نفسها. يتطلب --gadget vld لأن الأداة الافتراضية vor.v لا تسرّب
على LA464.
# Terminal 1 — start LoongBleed on CPU 0
./run.sh --gadget vld
# Terminal 2 — victim workload on the same core
while true; do numactl -C 0 sort < /etc/shadow > /dev/null; done
لإعداد آلي:
./poc_la464.sh
يقوم هذا بتشغيل حمل عمل sort على CPU 0 وتشغيل LoongBleed مع --gadget vld.
إثبات المفهوم هو برنامج C++ بملف واحد دون أي تبعيات خارجية.
g++ -std=c++11 -O2 -march=native -pthread -o loongbleed_poc loongbleed_poc.cpp
أو استخدم السكربت المرفق:
./run.sh
# or, on LA464:
./run.sh --gadget vld
عند اكتشاف تسريب وتحتوي البايتات المسرّبة على سلسلة من 8 أحرف ASCII قابلة للطباعة متجاورة على الأقل (0x20–0x7e)، يطبع إثبات المفهوم:
[cpu 0] LEAK chunk=14 data=0x7461646e756f4620_6572617774666f53_0000000000000000_0000000000000000 ascii=............Software Foundat
$xr0–$xr15) تسبّبت في ذلك$xrN بعد التعليمة،
معروضة بصيغة data3_data2_data1_data0 حيث:
data0 = البتات [63:0] (أدنى 64 بت من النتيجة)data1 = البتات [127:64] (أعلى 64 بت من النصف السفلي بعرض 128 بت)data2 = البتات [191:128] (أدنى 64 بت من النصف العلوي بعرض 128 بت)data3 = البتات [255:192] (أعلى 64 بت من النصف العلوي بعرض 128 بت)..أي قيمة غير صفرية في البتات الـ 128 العلوية (data2 أو data3) تشير إلى تسريب
بيانات على مستوى البنية الدقيقة.
تم اكتشاف الثغرة أثناء قراءة مقال Chips and Cheese بعنوان "Loongson's LSX and LASX Vector Extensions". أشار المقال إلى أن تعليمات المتجهات قد تترك وراءها بعض بقايا البيانات العشوائية. قادنا هذا إلى افتراض أن إعادة تسمية السجلات قد لا تمسح السجلات — وهي آلية مشابهة لـ ZenBleed — مما قد يسمح نظرياً بتسريب بيانات مساحة النواة. ثم أجرينا تجارب للتحقق من هذه الفرضية؛ وقد حدث التسريب فعلاً وتكرّر على كل من Loongson 3A5000 و 3A6000.
يُقدَّم هذا المشروع لأغراض تعليمية وبحثية أمنية فقط.
| Gadget | Instruction | Description | Leaks on LA664 | Leaks on LA464 |
|---|
vor | vor.v $vrN, $vrN, $vrN | Bitwise OR of $vrN with itself | Yes | No |
vld | vld $vrN, … | 128-bit load from memory into $vrN | Yes | Yes |
fld.d | fld.d $fN, … | 64-bit floating-point load into $fN (alias of $vrN low 64 bits) | Yes | Yes |
fld.s | fld.s $fN, … | 32-bit floating-point load into $fN (alias of $vrN low 32 bits) | Yes | Yes |