
استرداد كامل لمفتاح ML-KEM-1024 من مقارنة جزئية لـ Fujisaki-Okamoto في wolfSSL (CVE-2026-6330 NEON، CVE-2026-10097 AVX2)
CVE-2026-6330 (NEON) و CVE-2026-10097 (AVX2). تم الإصلاح في wolfSSL 5.9.2.
التقرير الفني الكامل منشور كـ
Cryptology ePrint Archive, Paper 2026/1682
(نسخة محلية في paper/). انظر Citation أدناه.
يقاوم ML-KEM (Kyber, FIPS 203) هجمات النص المشفر المختار بسبب فحص واحد داخل عملية فك التغليف: يعيد المستقبِل تشفير الرسالة التي فك تشفيرها للتو ويُرجع السر المشترك الحقيقي فقط إذا تطابقت النتيجة مع النص المشفر المُدخل تمامًا. أي عدم تطابق يُطلق رفضًا ضمنيًا، ويتم إرجاع قيمة عشوائية زائفة بدلاً من ذلك. هذا الفحص هو تحويل Fujisaki-Okamoto، البوابة الوحيدة التي تفصل مخطط IND-CCA2 عن مخطط IND-CPA القابل للتشكيل تحته.
نفّذت wolfSSL تلك المقارنة في تجميع SIMD مكتوب يدويًا، وفي منصتين قارنت جزءًا فقط من النص المشفر. على ARM64 قارنت حوالي النصف، وهو ما اكتشفه وأبلغ عنه () (). على x86-64 قارنت 1536 من 1568 بايت في ML-KEM-1024 ().
على أي من المنصتين، يتم قبول نص مشفر معدّل كأنه أصلي، وهو ما تم الإبلاغ عنه كإضعاف
لأمان IND-CCA2. يُظهر هذا التقرير أن الخلل يتجاوز ذلك، على كلتا المنصتين. البايتات التي
يتخطاها الفحص تُسرّب ضجيج فك التشفير لعملية فك التغليف، وهذا الضجيج دالة خطية
للمفتاح السري، لذا يمكن استرداد المفتاح عبر
انحدار المربعات الصغرى. إنها ليست
مسألة شبكات، وليست هجوم عدم تطابق المفتاح الكلاسيكي: على منصة AVX2
يتحقق الخلل من كل u، لذا فإن النصوص المشفرة ذات u المختار التي تتطلبها تلك الهجمات
مرفوضة. بدلاً من ذلك، يسترد انحدار ضجيج فك التشفير المفتاح من معاملات v غير المُفحَصة.
يتم استرداد مفتاح ML-KEM-1024 الخاص الكامل من البداية إلى النهاية ضد الثنائي الضعيف الحي
على كلتا المنصتين AVX2 و NEON.
يتطلب الهجوم مفتاح ML-KEM مُعاد استخدامه: مستقبلات HPKE، أو KEMTLS، أو مفاتيح مثبتة ومدمجة. مشاركة مفتاح هجينة مؤقتة TLS 1.3 تستخدم مفتاحًا جديدًا لكل مصافحة ولا يمكن استرداد مفتاحها بهذه الطريقة؛ هناك الخلل مجرد كسر تمييزي. كلا الخللين مُصلَح ومعلن، وهذا تقرير ما بعد الكشف.
| NEON (CVE-2026-6330) | AVX2 (CVE-2026-10097) | |
|---|---|---|
| المنصة | ARM64 NEON | x86-64 AVX2 |
| الخلل | يقارن ~نصف النص المشفر | يقارن 1536 من 1568 بايت |
| الخلل أبلغ عنه | Nicholas Carlini (Anthropic) | 007bsd |
| خطورة CVE | متوسطة (CVSS 4.0 6.3, CWE-327) | عالية (CVSS 4.0 8.3, CWE-697) |
| استرداد المفتاح، النموذج | كامل (~500 ct) | كامل (~1300 ct) |
| استرداد المفتاح، الثنائي الحي | 98.5% @ 600 ct (محاكاة QEMU) | 98.1% @ 350 ct (أصلي) |
| الإصلاح | PR #10192 | PR #10430 |
"الحي" هو النتيجة المُثبتة على الثنائي الحقيقي: يحتاج NEON إلى نصوص مشفرة أكثر (600 مقابل 350) لأن قياسه لكل معامل أكثر ضجيجًا بكثير (حوالي 4x). "النموذج" هو فحص خالٍ من الضجيج بأن الانحدار يسترد المفتاح الكامل (جميع المعاملات 2048، 100%)؛ عدد نصوصه المشفرة محدد بعدد المعادلات التي ينتجها كل نص مشفر، وليس بالضجيج، لذا فهو غير قابل للمقارنة مع الرقم الحي ولا يعكس صعوبة الهجوم.
تم العثور على كلا الخللين بشكل مستقل في نفس نافذة إصدار wolfSSL وتم إصلاحهما معًا
في 5.9.2 (انظر صفحة wolfSSL
لثغرات الأمان لكلا
إدخالي CVE). تم توثيق خلل Carlini في NEON كإضعاف IND-CCA2، وخلل AVX2
مُسجل كـ CVE لاسترداد المفتاح. هجوم انحدار ضجيج فك التشفير في هذا المستودع يسترد
المفتاح على كليهما. التفاصيل الخاصة بكل منصة موجودة في
neon-cve-2026-6330/ و
avx2-cve-2026-10097/.
مقارنة غير مكتملة في فحص الرفض الضمني لـ ML-KEM في wolfSSL، موجودة في منصتي تجميع SIMD. قارنت أقل من جميع بايتات النص المشفر، لذا يقبل فك التغليف نصوصًا مشفرة يرفضها تنفيذ صحيح. البايتات غير المُفحَصة تحوّل فك التغليف إلى نبيئة لضجيج فك التشفير، وهذا كافٍ لاسترداد المفتاح الخاص عندما يُعاد استخدام المفتاح.
أنت متأثر إذا استخدمت wolfSSL مع ML-KEM على بناء يحتوي على تجميع SIMD الضعيف: AVX2 (x86-64) في 5.7.0-5.9.1، أو ARM64 NEON في 5.7.4-5.9.1. هجوم استرداد المفتاح يحتاج أيضًا إلى إعادة استخدام مفتاح ML-KEM الخاص عبر عمليات فك التغليف، كما في مستقبلات HPKE، أو KEMTLS، أو مفتاح مثبت أو مدمج. مشاركة مفتاح هجينة مؤقتة TLS 1.3 تستخدم مفتاحًا جديدًا لكل مصافحة ولا يمكن استرداد مفتاحها؛ هناك الخلل مجرد كسر تمييزي. الإصلاح في wolfSSL 5.9.2.
استرداد مفتاح ML-KEM-1024 السري بالكامل على أي من المنصتين، بإرسال استعلامات فك تغليف مصممة ومراقبة، لكل منها، ما إذا كان السر الحقيقي أو قيمة رفض تعود. ضد الثنائيات الحية، استرد هذا المفتاح بحوالي 10^5 إلى 10^6 استعلام فك تغليف.
خذ معامل نص مشفر واحد في المنطقة غير المُفحَصة. بت نصه العادي محدد بالتقريب،
m'_j = Compress_1(v_j - (s^T u)_j). لأن تلك البايتات غير مُقارنة،
مسح القيمة المضغوطة لـ v_j ومراقبة مخرج فك التغليف الوحيد الذي
يتغير يحدد حد التقريب، وموضع الحد يقيس ضجيج فك التشفير
δ_j بدقة حوالي ±q/64. بدلالة السر (s, e) وعشوائية التشفير التي اختارها المهاجم:
δ_j = ( e^T y - s^T(e1 + c_u) + e2 + c_v )_j (تم التحقق منه بدقة؛ صغير؛ لا يلتف أبدًا mod q)
هذه معادلة خطية في السر المكون من 2048 معاملًا (s, e)، بمعاملات يعرفها
المهاجم. كل نص مشفر يعطي معادلة واحدة لكل معامل غير مُفحَص. تكديس
نصوص مشفرة كافية وحل المعادلات العادية يسترد المفتاح كله، وآخر
معاملات قليلة مثبتة بعلاقة المفتاح العام e = t - A·s ∈ CBD(η). إنها
مربعات صغرى عادية، وليست
مسألة شبكات.
تختلف المنصتان في مقدار ما تُسرّبه. يترك NEON حوالي 50% من النص المشفر غير مُفحَص (125 معاملًا في ثلاث نطاقات)، مقابل حوالي 2% لـ AVX2 (51 معاملًا في نطاق واحد). لا يزال NEON يحتاج إلى نصوص مشفرة أكثر، لأن بايتاته غير المُفحَصة غير متجاورة وقياسه لكل معامل أكثر ضجيجًا، لذا فإن تسريب المزيد لا يجعل الاسترداد أسهل هنا.
هجمات فحص النص العادي وعدم تطابق المفتاح (Ravi et al. 2020, Qin et al. 2021, Băetu et
al. 2019) تسترد المفتاح في بضعة آلاف من الاستعلامات بتقديم نصوص مشفرة ذات
u متناثر يختاره المهاجم لعزل معامل سري واحد لكل استعلام. خلل AVX2
يرفضها جميعًا: يتخطى فقط 32 بايتًا من v ويتحقق من كل u، لذا على
الثنائي الحي، النص المشفر ذو u المتناثر مرفوض وقلب بت واحد من u مرفوض
30 مرة من 30. خلل NEON أوسع، تاركًا حوالي نصف u غير مُفحَص أيضًا، لذا
تلك الحجة خاصة بـ AVX2؛ لكن الهجوم لا يعتمد عليها. انحدار
ضجيج فك التشفير يسترد المفتاح من معاملات v غير المُفحَصة على كلتا
المنصتين، ناجيًا من جزء الفحص الذي يتركه كل خلل سليمًا.
السابقة ذات الصلة، إذن، ليست هجمات عدم تطابق المفتاح تلك بل هجمات فشل فك التشفير (D'Anvers et al. 2019, ref 6). تستغل نفس حد ضجيج فك التشفير، وهو دالة خطية للسر، لكن فقط عبر الحدث النادر لعبور ذلك الحد لحد فك التشفير والتسبب في فشل فك التشفير، لذا الاسترداد هناك إحصائي ويحتاج نصوصًا مشفرة أكثر بكثير. المقارنة غير المكتملة بدلاً من ذلك تجعل ذلك الحد نفسه قابلًا للقياس مباشرة، إلى حوالي ±q/64، لذا لا حاجة لفشل والهجوم ينهار إلى انحدار المربعات الصغرى العادي أعلاه.
في نموذج مرجعي دقيق (kyber-py) لكلتا المنصتين، الهوية أعلاه مُتحقق منها بدقة والانحدار يسترد جميع المعاملات السرية الـ 2048. ضد ثنائيات wolfSSL الحية قبل الإصلاح، بمهاجمة مفتاح مُصدَّر مُعاد استخدامه، كل منصة اختبار تشغّل فحصًا ذاتيًا ضد مفتاح الحقيقة الأرضية المُصدَّر من النبيئة قبل أن تُبلغ عن أي رقم:
(s, e) عند 400 نص مشفر. السر s وحده هو 1005/1024 = 98.1% عند
350 ct، الرقم المسجل في CVE.(s, e) عند 600 نص مشفر، مع تقارب خطأ الحل
بشكل رتيب نحو الدقة.المفتاح المسترد هو زوج المفاتيح المولّد من wolfSSL الذي تُصدّره النبيئة، والهجوم يعمل
ضد تجميع SIMD بالشكل المُوزَّع وليس نموذجًا له. سجلات كاملة:
avx2-cve-2026-10097/live_recover_avx2.out،
neon-cve-2026-6330/live_recover_neon.out.
عالية، وإن لم تكن كارثية. يتطلب مفتاحًا مُعاد استخدامه، ونبيئة قبول/رفض، وعددًا كبيرًا لكنه عملي من الاستعلامات. إنها ليست قناة جانبية: لا يوجد توقيت أو قياس طاقة، فقط خلل منطقي في مقارنة. لا تؤثر على التنفيذات الصحيحة أو معيار ML-KEM نفسه. للمقارنة، تسريب توقيت ناتج عن المترجم في فك تغليف ML-KEM في liboqs (CVE-2024-36405)، وهي مسألة استرداد كامل للمفتاح السري ذات صلة من موجة 2024 من تسريبات توقيت ML-KEM إلى جانب KyberSlash، صُنفت بـ CVSS 7.5 من NIST.
كود الهجوم لكل منصة، والتحليل، وخطوات إعادة الإنتاج موجودة في
avx2-cve-2026-10097/ و
neon-cve-2026-6330/.
يوثق هذا المستودع اكتشافين شقيقين من نفس نافذة إصدار wolfSSL، وهجومًا واحدًا يكسر كليهما.
تم الإبلاغ عن كلتا المسألتين بشكل خاص، وإصلاحهما، وتعيين CVEs لهما قبل هذا التقرير. تم الإصلاح في wolfSSL 5.9.2.
التقرير الكامل منشور كـ
Cryptology ePrint Archive, Paper 2026/1682
(نسخة محلية: paper/).
@misc{cryptoeprint:2026/1682,
author = {Bhabani Sankar Das},
title = {Incomplete Ciphertext Comparison in {ML}-{KEM}: From an {IND}-{CCA2} Break to Key Recovery},
howpublished = {Cryptology {ePrint} Archive, Paper 2026/1682},
year = {2026},
url = {https://eprint.iacr.org/2026/1682}
}