
Prova de conceito de código de exploração e análise técnica para CVE-2022-35737, um estouro de inteiro na função sqlite3_str_vappendf do SQLite3 que possibilita estouro de buffer na pilha e potencial execução arbitrária de código.
Estouro de inteiro na função sqlite3_str_vappendf do SQLite3.
CVSS 6.7 AV:L/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:H
A CVE-2022-35737 foi introduzida na versão 1.0.12 do SQLite e corrigida na versão 3.39.2, disponível em 21 de julho de 2022. É explorável em sistemas de 64 bits, e a explorabilidade depende de como o programa é compilado: a execução arbitrária de código é confirmada quando a biblioteca é compilada sem canários de pilha, mas não confirmada quando canários de pilha estão presentes; a negação de serviço é confirmada em todos os casos.
Entradas de strings grandes para a função sqlite3_str_vappendf podem causar estouro
de inteiro com sinal quando o especificador de formato é %q, %Q ou %w. Isso pode
fazer com que dados controlados pelo usuário sejam gravados além dos limites de um buffer
alocado na pilha, resultando em travamento do programa, loop infinito ou possível execução
arbitrária de código.
Este repositório contém código de prova de conceito que demonstra a exploração da vulnerabilidade.
snprintf-good-example.cDemonstra que sqlite3_snprintf escapa corretamente todos os caracteres de aspas simples
existentes e adiciona uma aspa simples inicial e final a uma string curta.
Resultado esperado:
$ ./snprintf-good-example
src: hello, 'world'!
dst: 'hello, ''world''!'
snprintf-crash.cDemonstra que sqlite_snprintf trava quando chamado com strings suficientemente
grandes.
Resultado esperado: SIGSEGV
$ ./snprintf-crash
Segmentation fault (core dumped)
snprintf-control-pc.cDemonstra que é possível controlar o comprimento do estouro de buffer para sobrescrever dados específicos na pilha, como o canário de pilha e o endereço de retorno salvo.
Resultado esperado: SIGABRT
$ ./snprintf-control-pc
*** stack smashing detected ***: terminated
Aborted (core dumped)
snprintf-livelock.cDemonstra que é possível fazer com que o programa vulnerável entre em loop quase infinito (2^64 iterações).
Resultado esperado: loop infinito (em uma escala de tempo razoável)
$ ./snprintf-livelock
<no output>
^C
pdo-sqlite3-quote-poc.phpDemonstra que a CVE-2022-35737 é acessível a partir do interpretador PHP quando executado com limites de memória não padrão.
Resultado esperado: SIGSEGV
$ php pdo-sqlite3-quote-poc.php
Segmentation fault (core dumped)
Se desejado, as provas de conceito podem ser executadas em um contêiner Docker que tenha as dependências fixadas na versão vulnerável da 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)