
wolfSSL में आंशिक Fujisaki-Okamoto तुलना से पूर्ण ML-KEM-1024 कुंजी पुनर्प्राप्ति (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/ में स्थानीय प्रति)। नीचे उद्धरण देखें।
ML-KEM (Kyber, FIPS 203) चुने-गए-सिफरटेक्स्ट हमलों का प्रतिरोध करता है क्योंकि डिकैप्सुलेशन के अंदर एक जाँच होती है: प्राप्तकर्ता उस संदेश को फिर से एन्क्रिप्ट करता है जिसे उसने अभी-अभी डिक्रिप्ट किया है और वास्तविक साझा रहस्य केवल तभी लौटाता है जब परिणाम इनपुट सिफरटेक्स्ट से बिल्कुल मेल खाता है। किसी भी बेमेल से अंतर्निहित अस्वीकृति होती है, और इसके बजाय एक छद्म-यादृच्छिक मान लौटाया जाता है। वह जाँच Fujisaki-Okamoto ट्रांसफ़ॉर्म है, जो एकमात्र द्वार है जो IND-CCA2 योजना को अंतर्निहित परिवर्तनीय IND-CPA योजना से अलग करता है।
wolfSSL ने उस तुलना को हाथ से लिखे SIMD असेंबली में लागू किया, और दो बैकएंड पर इसने केवल सिफरटेक्स्ट के कुछ हिस्से की तुलना की। ARM64 NEON पर इसने लगभग आधे की तुलना की, जिसे Nicholas Carlini (Wikipedia) ने पाया और रिपोर्ट किया (CVE-2026-6330)। x86-64 AVX2 पर इसने ML-KEM-1024 में 1568 में से 1536 बाइट्स की तुलना की (CVE-2026-10097)।
किसी भी बैकएंड पर एक छेड़छाड़ किया गया सिफरटेक्स्ट वास्तविक के रूप में स्वीकार किया जाता है, जिसे 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 |
| दोष | ~आधे सिफरटेक्स्ट की तुलना करता है | 1568 में से 1536 बाइट्स की तुलना करता है |
| बग द्वारा रिपोर्ट किया गया | 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 में (दोनों CVE प्रविष्टियों के लिए wolfSSL
सुरक्षा भेद्यता पृष्ठ देखें)। Carlini का NEON बग IND-CCA2 कमजोर होने के रूप में प्रलेखित किया गया था, और AVX2 बग
कुंजी पुनर्प्राप्ति के रूप में CVE है। इस रिपॉजिटरी में डिक्रिप्शन-शोर प्रतिगमन हमला
दोनों पर कुंजी को पुनर्प्राप्त करता है। बैकएंड-विशिष्ट विवरण
neon-cve-2026-6330/ और
avx2-cve-2026-10097/ में है।
wolfSSL के ML-KEM अंतर्निहित-अस्वीकृति जाँच में एक अधूरी तुलना, जो दो SIMD असेंबली बैकएंड में मौजूद है। इसने सभी सिफरटेक्स्ट बाइट्स से कम की तुलना की, इसलिए डिकैप्सुलेशन उन सिफरटेक्स्ट को स्वीकार करता है जिन्हें एक सही कार्यान्वयन अस्वीकार करता है। अनियंत्रित बाइट्स डिकैप्सुलेशन को डिक्रिप्शन शोर के लिए एक ओरेकल में बदल देते हैं, और यह निजी कुंजी को पुनर्प्राप्त करने के लिए पर्याप्त है जब कुंजी पुनः उपयोग की जाती है।
आप प्रभावित हैं यदि आपने कमजोर SIMD वाले बिल्ड पर ML-KEM के साथ wolfSSL का उपयोग किया असेंबली: 5.7.0-5.9.1 में AVX2 (x86-64), या 5.7.4-5.9.1 में ARM64 NEON। कुंजी-पुनर्प्राप्ति हमले को अतिरिक्त रूप से 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 गुणांक), जबकि AVX2 के लिए लगभग 2% (एक बैंड में 51 गुणांक)। NEON को अभी भी अधिक सिफरटेक्स्ट की आवश्यकता होती है, क्योंकि इसके अनियंत्रित बाइट्स गैर-सन्निहित हैं और इसका प्रति-गुणांक माप अधिक शोरग्रस्त है, इसलिए अधिक लीक करना यहाँ पुनर्प्राप्ति को आसान नहीं बनाता है।
प्लेनटेक्स्ट-जाँच और कुंजी-बेमेल हमले (Ravi et al. 2020, Qin et al. 2021, Băetu et
al. 2019) कुछ हज़ार क्वेरी में कुंजी को पुनर्प्राप्त करते हैं, हमलावर-चुने गए विरल u वाले सिफरटेक्स्ट सबमिट करके प्रति क्वेरी एक गुप्त गुणांक को अलग करने के लिए। AVX2 दोष
उन सभी को अस्वीकार करता है: यह केवल v के 32 बाइट्स छोड़ता है और पूरे u को मान्य करता है, इसलिए
लाइव बाइनरी पर एक विरल-u सिफरटेक्स्ट अस्वीकार कर दिया जाता है और एक एकल u बिट को फ्लिप करना 30 में से 30 बार अस्वीकार कर दिया जाता है। NEON दोष व्यापक है, लगभग आधे u को भी अनियंत्रित छोड़ देता है, इसलिए वह तर्क AVX2-विशिष्ट है; लेकिन हमला इस पर निर्भर नहीं करता है। डिक्रिप्शन-शोर प्रतिगमन दोनों बैकएंड पर अनियंत्रित v-गुणांकों से कुंजी को पुनर्प्राप्त करता है, जाँच के उस हिस्से से बचकर जो प्रत्येक बग बरकरार छोड़ता है।
प्रासंगिक मिसाल, फिर, वे कुंजी-बेमेल हमले नहीं हैं बल्कि डिक्रिप्शन-विफलता हमले हैं (D'Anvers et al. 2019, ref 6)। वे उसी डिक्रिप्शन-शोर पद का शोषण करते हैं, जो गुप्त का एक रैखिक फलन है, लेकिन केवल उस पद के डिकोडिंग सीमा को पार करने और डिक्रिप्शन विफलता का कारण बनने की दुर्लभ घटना के माध्यम से, इसलिए वहाँ पुनर्प्राप्ति सांख्यिकीय है और उसे कहीं अधिक सिफरटेक्स्ट की आवश्यकता होती है। अधूरी तुलना इसके बजाय उसी पद को सीधे मापने योग्य बनाती है, लगभग ±q/64 तक, इसलिए कोई विफलता आवश्यक नहीं है और हमला उपरोक्त साधारण न्यूनतम-वर्ग प्रतिगमन में सिमट जाता है।
दोनों बैकएंड के लिए एक विश्वसनीय संदर्भ मॉडल (kyber-py) में, उपरोक्त पहचान सटीक सत्यापित है और प्रतिगमन सभी 2048 गुप्त गुणांकों को पुनर्प्राप्त करता है। लाइव प्री-फिक्स wolfSSL बाइनरी के खिलाफ, एक पुनः उपयोग की गई निर्यातित कुंजी पर हमला करते हुए, प्रत्येक हार्नेस किसी भी संख्या की रिपोर्ट करने से पहले ओरेकल के निर्यातित ग्राउंड-ट्रुथ कुंजी के खिलाफ एक स्व-जाँच चलाता है:
(s, e) के 98.0% तक पहुँचना। अकेले गुप्त s 350 ct पर 1005/1024 = 98.1% है, जो CVE में दर्ज आंकड़ा है।(s, e) के 2018/2048 = 98.5% तक पहुँचना, सॉल्वर त्रुटि एकरस रूप से सटीक की ओर अभिसरण करती है।पुनर्प्राप्त कुंजी wolfSSL-जनित कुंजीपेयर है जिसे ओरेकल निर्यात करता है, और हमला शिप किए गए-रूप SIMD असेंबली के खिलाफ चलता है न कि इसके मॉडल के खिलाफ। पूर्ण प्रतिलेख:
avx2-cve-2026-10097/live_recover_avx2.out,
neon-cve-2026-6330/live_recover_neon.out।
उच्च, हालांकि विनाशकारी नहीं। इसे एक पुनः उपयोग की गई कुंजी, एक स्वीकार/अस्वीकार ओरेकल, और एक बड़ी लेकिन व्यावहारिक संख्या में क्वेरी की आवश्यकता होती है। यह एक साइड चैनल नहीं है: कोई समय या पावर माप नहीं है, केवल एक तुलना में एक तर्क बग है। यह सही कार्यान्वयन या ML-KEM मानक को ही प्रभावित नहीं करता है। तुलना के लिए, liboqs के ML-KEM डिकैप्सुलेशन में एक कंपाइलर-प्रेरित समय लीक (CVE-2024-36405), 2024 की ML-KEM समय लीक लहर से संबंधित एक पूर्ण-गुप्त-कुंजी-पुनर्प्राप्ति मुद्दा KyberSlash के साथ, NIST द्वारा CVSS 7.5 रेट किया गया था।
प्रति-बैकएंड हमला कोड, विश्लेषण और प्रजनन चरण
avx2-cve-2026-10097/ और
neon-cve-2026-6330/ में हैं।
यह रिपॉजिटरी एक ही wolfSSL रिलीज़ विंडो से दो सहोदर निष्कर्षों और एक हमले का दस्तावेजीकरण करता है जो दोनों को तोड़ता है।
दोनों मुद्दों को निजी तौर पर रिपोर्ट किया गया, ठीक किया गया, और इस लेख से पहले CVE सौंपे गए। 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}
}