
OpenSSL-src Corruzione della memoria heap con operazione su chiave privata RSA : CVE-2022-2274
OpenSSL-src-rust è un codice sorgente e una logica per compilare OpenSSL dal sorgente scritta in rust e impacchettata come crate. Ci sono attualmente due branch mantenuti, che corrispondono alle due versioni OpenSSL mantenute che sono main che compila OpenSSL 3.0 e release/111 che compila OpenSSL 1.1.1.
La release OpenSSL 3.0.4 ha introdotto un grave bug nell'implementazione RSA per CPU X86_64 che supportano le istruzioni AVX512IFMA. Questo problema rende l'implementazione RSA con chiavi private a 2048 bit errata su tali macchine e la corruzione della memoria avverrà durante il calcolo. Come conseguenza della corruzione della memoria, un attaccante potrebbe essere in grado di innescare una esecuzione di codice remota sulla macchina che esegue il calcolo. Server SSL/TLS o altri server che usano chiavi private RSA a 2048 bit in esecuzione su macchine che supportano le istruzioni AVX512IFMA dell'architettura X86_64 sono affetti da questo problema.
Questa vulnerabilità ha fatto sì che la compilazione di OpenSSL versione 3.0 usando openssl-src-rust fallisse e andasse in crash nel processo sulla macchina che supporta le istruzioni AVX512IFMA dell'architettura X86_64.
openssl-src(Rust)
>= 300.0.8, < 300.0.9
(GHSA-735f-pg76-fxc4)I processi per riprodurre l'errore o il crash sono i seguenti:
Compilare OpenSSL-3.0.4 su una CPU con AVX512 (questa dimostrazione usa un Core i7-1065G7) con:
CFLAGS="-O3 -g -fsanitize=address" ./config
make
Eseguire un test:
make V=1 TESTS=test_exp test
Il sanitizer si lamenta:
==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
È stato proposto dallo scopritore del problema che commit precedenti al codice OpenSSL potrebbero aver introdotto il bug. Il commit era stato fatto per correggere BN_mod_exp_consttime in modo che non produca un risultato non ridotto. La funzione bn_reduce_once_in_place ha causato la corruzione della memoria heap.
@@ -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);
Questo è stato corretto con un aggiornamento trovato in questo commit che affermava che bn_reduce_once_in_place si aspetta il numero di BN_ULONG, ma factor_size è la dimensione in bit dei moduli. Questo aggiornamento è stato incluso in OpenSSL 3.0.5 rilasciato il 12 ottobre 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);
Un attaccante potrebbe teoricamente sfruttare questa vulnerabilità inviando una trasmissione attraverso una rete (ad es., una rete TCP/IP). Un exploit riuscito potrebbe comportare:
| Gravità | Critica 9.8 / 10 |
|---|
| Vettore di attacco | Rete |
| Complessità dell'attacco | Bassa |
| Privilegi richiesti | Nessuno |
| Interazione utente | Nessuna |
| Scope | Invariato |
| Riservatezza | Alta |
| Integrità | Alta |
| Disponibilità | Alta |