
Stringhe strane: CVE-2022-35737
Overflow di intero nella funzione sqlite3_str_vappendf di SQLite3.
CVSS 6.7 AV:L/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:H
CVE-2022-35737 è stato introdotto in SQLite versione 1.0.12 e corretto nella release 3.39.2, disponibile il 21 luglio 2022. È sfruttabile su sistemi a 64 bit e la sfruttabilità dipende da come il programma è compilato: l'esecuzione arbitraria di codice è confermata quando la libreria è compilata senza canary di stack, ma non confermata quando i canary di stack sono presenti; il denial-of-service è confermato in tutti i casi.
Grandi input di stringhe alla funzione sqlite3_str_vappendf possono causare un overflow di interi con segno quando lo specificatore di formato è %q, %Q o %w. Questo può causare la scrittura di dati controllati dall'utente oltre i limiti di un buffer allocato sullo stack, provocando il crash del programma, un ciclo infinito o la possibile esecuzione arbitraria di codice.
Questo repository contiene codice proof-of-concept che dimostra lo sfruttamento della vulnerabilità.
snprintf-good-example.cDimostra che sqlite3_snprintf esegue correttamente l'escape di tutti i caratteri di apice singolo esistenti e aggiunge un apice iniziale e finale a una stringa corta.
Risultato atteso:
$ ./snprintf-good-example
src: hello, 'world'!
dst: 'hello, ''world''!'
snprintf-crash.cDimostra che sqlite_snprintf crasha quando viene chiamata con stringhe sufficientemente grandi.
Risultato atteso: SIGSEGV
$ ./snprintf-crash
Segmentation fault (core dumped)
snprintf-control-pc.cDimostra che è possibile controllare la lunghezza del buffer overflow per sovrascrivere dati mirati sullo stack, come il canary di stack e l'indirizzo di ritorno salvato.
Risultato atteso: SIGABRT
$ ./snprintf-control-pc
*** stack smashing detected ***: terminated
Aborted (core dumped)
snprintf-livelock.cDimostra che è possibile causare un ciclo quasi infinito (2^64 iterazioni) nel programma vulnerabile.
Risultato atteso: ciclo infinito (in una scala temporale ragionevole)
$ ./snprintf-livelock
<no output>
^C
pdo-sqlite3-quote-poc.phpDimostra che CVE-2022-35737 è raggiungibile dall'interprete PHP quando eseguito con limiti di memoria non predefiniti.
Risultato atteso: SIGSEGV
$ php pdo-sqlite3-quote-poc.php
Segmentation fault (core dumped)
Se desiderato, i proof-of-concept possono essere eseguiti in un container Docker che ha le dipendenze fissate alla versione vulnerabile della libreria SQLite.
$ docker build -t cve-2022-35737 .
$ docker run -it --rm cve-2022-35737 /bin/bash
root@289cef859649:/poc# ./snprintf-crash
Segmentation fault (core dumped)