
OpenSSL-src Heap-Speicherkorruption bei RSA-Private-Key-Operation : CVE-2022-2274
OpenSSL-src-rust ist ein Quellcode- und Logikpaket zum Erstellen von OpenSSL aus dem Quellcode, geschrieben in Rust und als Crate verpackt. Derzeit gibt es zwei gepflegte Branches, die den beiden gepflegten OpenSSL-Versionen entsprechen: main, der OpenSSL 3.0 erstellt, und release/111, der OpenSSL 1.1.1 erstellt.
Das OpenSSL 3.0.4-Release führte einen schwerwiegenden Fehler in der RSA-Implementierung für X86_64-CPUs ein, die die AVX512IFMA-Anweisungen unterstützen. Dieses Problem führt dazu, dass die RSA-Implementierung mit 2048-Bit-privaten Schlüsseln auf solchen Maschinen falsch arbeitet und während der Berechnung Speicherkorruption auftritt. Infolge der Speicherkorruption könnte ein Angreifer eine Remote-Codeausführung auf der Maschine auslösen, die die Berechnung durchführt. SSL/TLS-Server oder andere Server, die 2048-Bit-RSA-Private-Key auf Maschinen mit AVX512IFMA-Unterstützung der X86_64-Architektur verwenden, sind von diesem Problem betroffen.
Diese Schwachstelle führte dazu, dass das Erstellen von OpenSSL Version 3.0 mit openssl-src-rust auf Maschinen mit AVX512IFMA-Unterstützung der X86_64-Architektur fehlschlug und während des Prozesses abstürzte.
openssl-src(Rust)
>= 300.0.8, < 300.0.9
(GHSA-735f-pg76-fxc4)Die Vorgehensweise zur Reproduktion des Fehlers oder Absturzes ist wie folgt:
Build OpenSSL-3.0.4 on a CPU with AVX512 (this demonstration uses a Core i7-1065G7) with:
CFLAGS="-O3 -g -fsanitize=address" ./config
make
Führen Sie einen Test durch:
make V=1 TESTS=test_exp test
Der Sanitizer meldet:
==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
Es wurde vom Entdecker des Problems vorgeschlagen, dass frühere Commits am OpenSSL-Code den Fehler eingeführt haben könnten. Der Commit sollte BN_mod_exp_consttime korrigieren, sodass es kein unreduziertes Ergebnis liefert. Die Funktion bn_reduce_once_in_place verursachte die Heap-Speicherkorruption.
@@ -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);
Dies wurde mit einem Update behoben, das in diesem Commit zu finden ist, der besagt, dass bn_reduce_once_in_place die Anzahl der BN_ULONG erwartet, aber factor_size die Bitgröße des Moduls ist. Dieses Update war im OpenSSL 3.0.5 enthalten, das am 12. Oktober 2022 veröffentlicht wurde.
@@ -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);
Ein Angreifer könnte diese Schwachstelle theoretisch ausnutzen, indem er eine Übertragung über ein Netzwerk (z. B. ein TCP/IP-Netzwerk) sendet. Ein erfolgreicher Exploit könnte zu Folgendem führen:
| Schweregrad | Kritisch 9.8 / 10 |
|---|
| Angriffsvektor | Netzwerk |
| Angriffskomplexität | Niedrig |
| Erforderliche Berechtigungen | Keine |
| Benutzerinteraktion | Keine |
| Auswirkungsbereich | Unverändert |
| Vertraulichkeit | Hoch |
| Integrität | Hoch |
| Verfügbarkeit | Hoch |