
Prueba de concepto de código de explotación y análisis técnico para CVE-2022-35737, un desbordamiento de entero en la función sqlite3_str_vappendf de SQLite3 que permite un desbordamiento de búfer en la pila y una potencial ejecución de código arbitrario.
Desbordamiento de enteros en la función 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 fue introducido en SQLite versión 1.0.12 y corregido en la versión 3.39.2, disponible el 21 de julio de 2022. Es explotable en sistemas de 64 bits, y la explotabilidad depende de cómo se compile el programa: se confirma la ejecución arbitraria de código cuando la biblioteca se compila sin canarios de pila, pero no se confirma cuando hay canarios de pila; se confirma la denegación de servicio en todos los casos.
Las entradas de cadena grandes a la función sqlite3_str_vappendf pueden causar un desbordamiento de enteros con signo cuando el especificador de formato es %q, %Q o %w. Esto puede provocar que datos controlados por el usuario se escriban más allá de los límites de un búfer asignado en la pila, lo que resulta en un bloqueo del programa, un bucle infinito o una posible ejecución arbitraria de código.
Este repositorio contiene código de prueba de concepto que demuestra la explotación de la vulnerabilidad.
snprintf-good-example.cDemostrar que sqlite3_snprintf escapa correctamente todos los caracteres de comilla simple existentes y añade una comilla simple inicial y final a una cadena corta.
Resultado esperado:
$ ./snprintf-good-example
src: hello, 'world'!
dst: 'hello, ''world''!'
snprintf-crash.cDemostrar que sqlite_snprintf falla cuando se llama con cadenas suficientemente grandes.
Resultado esperado: SIGSEGV
$ ./snprintf-crash
Segmentation fault (core dumped)
snprintf-control-pc.cDemostrar que es posible controlar la longitud del desbordamiento del búfer para sobrescribir datos específicos en la pila, como el canario de pila y la dirección de retorno guardada.
Resultado esperado: SIGABRT
$ ./snprintf-control-pc
*** stack smashing detected ***: terminated
Aborted (core dumped)
snprintf-livelock.cDemostrar que es posible hacer que el programa vulnerable entre en un bucle casi infinito (2^64 iteraciones).
Resultado esperado: bucle infinito (en una escala de tiempo razonable)
$ ./snprintf-livelock
<no output>
^C
pdo-sqlite3-quote-poc.phpDemostrar que CVE-2022-35737 es alcanzable desde el intérprete de PHP cuando se ejecuta con límites de memoria no predeterminados.
Resultado esperado: SIGSEGV
$ php pdo-sqlite3-quote-poc.php
Segmentation fault (core dumped)
Si se desea, las pruebas de concepto se pueden ejecutar en un contenedor Docker que tenga las dependencias fijadas a la versión vulnerable de la biblioteca 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)