
SQLite 3.53.4 - Alto - Locale - Crash - La catena COLLATE salta SQLITE_LIMIT_EXPR_DEPTH
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-collate-depth
Classe: Crash Reach: Locale
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci
L'azione grammaticale COLLATE non chiama mai sqlite3ExprCheckHeight. sqlite3ExprAddCollateToken alloca un nodo TK_COLLATE con nHeight ancora a 1, poi aggancia l'espressione precedente a pLeft. Gli operatori ordinari passano attraverso sqlite3PExpr e ottengono il valore documentato SQLITE_LIMIT_EXPR_DEPTH (predefinito 1000). Questo operatore no.
Il walker ricorre comunque su ogni pLeft. EP_Skip è per l'affinità, non per sqlite3WalkExprNN. Una catena di 50 nodi restituisce 1. Anche 8k e 40k, oltre il limite di profondità. 120k causano uno stack-overflow ASan in sqlite3WalkExprNN (rc=134). Non è RCE.
L'albero canonico è https://sqlite.org/src. GitHub sqlite/sqlite è un mirror Fossil. Zip ufficiale sqlite-src-3530400. Libreria di pubblico dominio. Questo pacchetto è AGPLv3.
| ID | nessuna CVE al momento |
| Classe | Crash (stack-overflow ASan in sqlite3WalkExprNN; RCE non dimostrato) |
| Reach | Locale (SQL non attendibile o una VIEW impiantata) |
| CWE | CWE-674, CWE-770 |
| CVSS | High: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| Prodotto | SQLite 3.53.4 |
| Affetto | 3.53.4 (b09c88c); residuo del successivo controllo di altezza COLLATE sul trunk |
| Auth | SQL non attendibile o VIEW; load_extension predefinito resta disattivato |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18800. Amalgamation ASan. Crash witness. |
Fornire una lunga catena postfissa COLLATE BINARY come SQL, oppure impiantarla in una VIEW all'interno di un .db non attendibile. Il processo host percorre la catena e muore sullo stack C. Il limite documentato di profondità delle espressioni non viene mai applicato a questo operatore.
SELECT 1 COLLATE BINARY COLLATE BINARY ... è sufficiente. Stessa forma in CREATE VIEW v AS SELECT 1 COLLATE BINARY ... poi SELECT * FROM v su una connessione nuova. Il valore predefinito SQLITE_LIMIT_SQL_LENGTH (1e9) contiene la catena da ~1,8 MB che ha causato l'overflow di uno stack da 8 MB in questo lab.
Si tratta di un crash del processo embedder. Non è controllo dell'instruction pointer. load_extension resta disattivato.
Venti ricerche nel sorgente del tag SQLite version-3.53.4 dopo OpenLiteSpeed. Ultima GA, non la bozza 3.54.0. sqlite.org/security.html tratta SQL non attendibile e .db non attendibile come first-class. load_extension predefinito è disattivato.
parse.y per COLLATE è di tre righe:
expr(A) ::= expr(A) COLLATE ids(C). {
A = sqlite3ExprAddCollateToken(pParse, A, &C, 1);
}
sqlite3ExprAddCollateToken imposta pNew->pLeft = pExpr e EP_Collate|EP_Skip. sqlite3ExprAlloc ha lasciato nHeight = 1. Nessun sqlite3ExprCheckHeight. sqlite3PExpr fa entrambe queste cose per ogni altro operatore binario.
Vicoli ciechi: considerare 8k COLLATE come il crash (restituiva 1); considerare 40k come il crash (restituiva anch'esso 1, ben oltre SQLITE_LIMIT_EXPR_DEPTH 1000); servivano 120k prima che ASan morisse in sqlite3WalkExprNN.
Questo è G1 di quattordici residui sul pin. I fratelli sono altri post.
cd lab
./run.sh
Amalgamation ASan dall'ufficiale sqlite-src-3530400 (clone di fallback del tag version-3.53.4). Compose sqlite-collate-depth. HTTP fittizio su 127.0.0.1:18800. Associalo al loopback.
SUCCESS sqlite-collate-depth how=asan-stack-overflow control=50 crash-n=120000 SQLITE-COLLATE-DEPTH-WITNESS
50 COLLATE restituisce 1. Anche 8k e 40k restituiscono 1. 120k muore rc=134, stack-overflow ASan in sqlite3WalkExprNN. Il controllo del pin è SELECT sqlite_version() / SELECT sqlite_source_id().
Chiamare sqlite3ExprCheckHeight sul nodo COLLATE dopo aver agganciato pLeft, come fa già sqlite3PExpr. Ricalcolare nHeight dal figlio. Un operatore postfisso è comunque un albero di espressioni.
Il trunk 252c0b7bf5 (2026-10-04) è successivo a questa GA.
b09c88c14082339b66c7b7158d609a771e64ca69)src/parse.y azione COLLATEsrc/expr.c sqlite3ExprAddCollateToken, sqlite3ExprAlloc (nHeight = 1), sqlite3PExpr / sqlite3ExprCheckHeightsrc/walker.c sqlite3WalkExprNNsrc/sqliteLimit.h SQLITE_MAX_EXPR_DEPTH predefinito 1000