
Preuve de concept du code d'exploitation et analyse technique pour CVE-2022-35737, un dépassement d'entier dans la fonction sqlite3_str_vappendf de SQLite3 permettant un débordement de tampon de pile et une éventuelle exécution de code arbitraire.
Débordement d'entier dans la fonction sqlite3_str_vappendf de SQLite3.
CVSS 6.7 AV:L/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:H
CVE-2022-35737 a été introduite dans SQLite version 1.0.12 et corrigée dans la version 3.39.2, disponible le 21 juillet 2022. Elle est exploitable sur les systèmes 64 bits, et l'exploitabilité dépend de la façon dont le programme est compilé : l'exécution de code arbitraire est confirmée lorsque la bibliothèque est compilée sans canaris de pile, mais non confirmée lorsque des canaris de pile sont présents ; le déni de service est confirmé dans tous les cas.
De grandes chaînes de caractères fournies en entrée à la fonction sqlite3_str_vappendf peuvent provoquer un débordement d'entier signé lorsque le spécificateur de format est %q, %Q ou %w. Cela peut entraîner l'écriture de données contrôlées par l'utilisateur au-delà des limites d'un buffer alloué sur la pile, provoquant un crash du programme, une boucle infinie ou une éventuelle exécution de code arbitraire.
Ce dépôt contient des codes de preuve de concept qui démontrent l'exploitation de la vulnérabilité.
snprintf-good-example.cDémontre que sqlite3_snprintf échappe correctement tous les caractères de guillemet simple existants et ajoute un guillemet simple au début et à la fin d'une chaîne courte.
Résultat attendu :
$ ./snprintf-good-example
src: hello, 'world'!
dst: 'hello, ''world''!'
snprintf-crash.cDémontre que sqlite_snprintf plante lorsqu'elle est appelée avec des chaînes suffisamment grandes.
Résultat attendu : SIGSEGV
$ ./snprintf-crash
Segmentation fault (core dumped)
snprintf-control-pc.cDémontre qu'il est possible de contrôler la longueur du débordement de buffer afin d'écraser des données ciblées sur la pile, comme le canari de pile et l'adresse de retour sauvegardée.
Résultat attendu : SIGABRT
$ ./snprintf-control-pc
*** stack smashing detected ***: terminated
Aborted (core dumped)
snprintf-livelock.cDémontre qu'il est possible de faire boucler le programme vulnérable presque indéfiniment (2^64 itérations).
Résultat attendu : boucle indéfiniment (sur une échelle de temps raisonnable)
$ ./snprintf-livelock
<no output>
^C
pdo-sqlite3-quote-poc.phpDémontre que CVE-2022-35737 est accessible depuis l'interpréteur PHP lorsqu'il est exécuté avec des limites de mémoire différentes de celles par défaut.
Résultat attendu : SIGSEGV
$ php pdo-sqlite3-quote-poc.php
Segmentation fault (core dumped)
Si vous le souhaitez, les preuves de concept peuvent être exécutées dans un conteneur Docker dont les dépendances sont épinglées à la version vulnérable de la bibliothèque 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)