
OpenSSL-src تلف الذاكرة في الكومة مع عملية مفتاح RSA الخاص : CVE-2022-2274
OpenSSL-src-rust هو كود مصدر ومنطق لبناء OpenSSL من المصدر مكتوب بلغة rust ومعبأ كـ crate. يوجد حاليًا فرعان مُداران، يتوافقان مع إصداري OpenSSL المُدارين وهما main الذي يبني OpenSSL 3.0 و release/111 الذي يبني OpenSSL 1.1.1.
أدخل إصدار OpenSSL 3.0.4 خطأً جسيمًا في تطبيق RSA لوحدات المعالجة المركزية X86_64 التي تدعم تعليمات AVX512IFMA. تجعل هذه المشكلة تطبيق RSA مع مفاتيح خاصة بحجم 2048 بت غير صحيح على هذه الآلات وسيحدث تلف في الذاكرة أثناء الحساب. كنتيجة لتلف الذاكرة، قد يتمكن المهاجم من تشغيل كود عشوائي عن بُعد على الجهاز الذي يقوم بالحساب. تتأثر بهذه المشكلة خوادم SSL/TLS أو الخوادم الأخرى التي تستخدم مفاتيح خاصة RSA بحجم 2048 بت والتي تعمل على آلات تدعم تعليمات AVX512IFMA من بنية X86_64.
تسببت هذه الثغرة في فشل بناء إصدار OpenSSL 3.0 باستخدام openssl-src-rust وتعطل العملية على الآلة التي تدعم تعليمات AVX512IFMA من بنية X86_64.
openssl-src(Rust)
>= 300.0.8, < 300.0.9
(GHSA-735f-pg76-fxc4)عمليات إعادة إنتاج الخطأ أو التعطل هي كما يلي:
بناء OpenSSL-3.0.4 على وحدة معالجة مركزية مع AVX512 (يوضح هذا العرض استخدام Core i7-1065G7) مع:
CFLAGS="-O3 -g -fsanitize=address" ./config
make
تشغيل اختبار:
make V=1 TESTS=test_exp test
يشتكي المُطهر:
==481618==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60c000089400 at pc 0x7f01e32a9509 bp 0x7fff643ec100 sp 0x7fff643ec0f8
READ of size 8 at 0x60c000089400 thread T0
#0 0x7f01e32a9508 in bn_select_words crypto/bn/rsaz_exp.h:64
#1 0x7f01e32a9508 in bn_reduce_once_in_place crypto/bn/rsaz_exp.h:74
#2 0x7f01e32a9508 in ossl_rsaz_mod_exp_avx512_x2 crypto/bn/rsaz_exp_x2.c:223
#3 0x7f01e3287dc8 in BN_mod_exp_mont_consttime_x2 crypto/bn/bn_exp.c:1448
#4 0x4042c3 in test_mod_exp_x2 test/exptest.c:260
#5 0x40611a in run_tests test/testutil/driver.c:370
#6 0x4039ba in main test/testutil/main.c:30
#7 0x7f01e2c29319 in __libc_start_call_main (/usr/lib/libc.so.6+0x29319)
#8 0x7f01e2c293e4 in __libc_start_main_impl (/usr/lib/libc.so.6+0x293e4)
#9 0x403c40 in _start (/home/xry111/sources/lfs/openssl-3.0.4/test/exptest+0x403c40)
0x60c000089400 is located 0 bytes to the right of 128-byte region [0x60c000089380,0x60c000089400)
allocated by thread T0 here:
#0 0x7f01e3ae5107 in __interceptor_malloc ../../../../libsanitizer/asan/asan_malloc_linux.cpp:69
#1 0x7f01e34aa7a8 in CRYPTO_zalloc crypto/mem.c:197
SUMMARY: AddressSanitizer: heap-buffer-overflow crypto/bn/rsaz_exp.h:64 in bn_select_words
Shadow bytes around the buggy address:
0x0c1880009230: 00 00 00 00 00 00 00 00 fa fa fa fa fa fa fa fa
0x0c1880009240: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c1880009250: fa fa fa fa fa fa fa fa 00 00 00 00 00 00 00 00
0x0c1880009260: 00 00 00 00 00 00 00 00 fa fa fa fa fa fa fa fa
0x0c1880009270: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x0c1880009280:[fa]fa fa fa fa fa fa fa 00 00 00 00 00 00 00 00
0x0c1880009290: 00 00 00 00 00 00 00 00 fa fa fa fa fa fa fa fa
0x0c18800092a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c18800092b0: fa fa fa fa fa fa fa fa 00 00 00 00 00 00 00 00
0x0c18800092c0: 00 00 00 00 00 00 00 00 fa fa fa fa fa fa fa fa
0x0c18800092d0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
==481618==ABORTING
لقد اقترح مكتشف المشكلة أن الالتزامات السابقة لرمز OpenSSL ربما تكون قد أدخلت الخلل. كان الالتزام لإصلاح BN_mod_exp_consttime بحيث لا ينتج نتيجة غير مخفضة. تسببت الدالة bn_reduce_once_in_place في تلف ذاكرة الكومة.
@@ -220,6 +220,9 @@ int ossl_rsaz_mod_exp_avx512_x2(BN_ULONG *res1,
from_words52(res1, factor_size, rr1_red);
from_words52(res2, factor_size, rr2_red);
bn_reduce_once_in_place(res1, /*carry=*/0, m1, storage, factor_size);
bn_reduce_once_in_place(res2, /*carry=*/0, m2, storage, factor_size);
تم إصلاح ذلك بتحديث موجود في هذا الالتزام والذي ذكر أن bn_reduce_once_in_place تتوقع عدد BN_ULONG، ولكن factor_size هو حجم البت للمعاملات. تم تضمين هذا التحديث في OpenSSL 3.0.5 الذي صدر في 12 أكتوبر 2022.
@@ -257,6 +257,9 @@ int ossl_rsaz_mod_exp_avx512_x2(BN_ULONG *res1,
from_words52(res1, factor_size, rr1_red);
from_words52(res2, factor_size, rr2_red);
/* bn_reduce_once_in_place expects number of BN_ULONG, not bit size */
factor_size /= sizeof(BN_ULONG) * 8;
bn_reduce_once_in_place(res1, /*carry=*/0, m1, storage, factor_size);
bn_reduce_once_in_place(res2, /*carry=*/0, m2, storage, factor_size);
نظريًا، يمكن للمهاجم استغلال هذه الثغرة عن طريق إرسال إرسال عبر شبكة (مثل شبكة TCP/IP). يمكن أن يؤدي الاستغلال الناجح إلى:
| الشدة | حرج 9.8 / 10 |
|---|
| متجه الهجوم | شبكة |
| تعقيد الهجوم | منخفض |
| الامتيازات المطلوبة | لا شيء |
| تفاعل المستخدم | لا شيء |
| النطاق | دون تغيير |
| السرية | عالي |
| السلامة | عالي |
| التوفر | عالي |