
SQLite 3.53.4 - Alta - Local - Crash - La cadena COLLATE omite SQLITE_LIMIT_EXPR_DEPTH
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-collate-depth
Clase: Crash Alcance: Local
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci
La acción gramatical COLLATE nunca llama a sqlite3ExprCheckHeight. sqlite3ExprAddCollateToken asigna un nodo TK_COLLATE con nHeight todavía en 1, y luego cuelga la expresión previa de pLeft. Los operadores ordinarios pasan por sqlite3PExpr y obtienen el SQLITE_LIMIT_EXPR_DEPTH documentado (por defecto 1000). Este operador no.
El walker sigue recursando en cada pLeft. EP_Skip es para afinidad, no para sqlite3WalkExprNN. Una cadena de 50 nodos devuelve 1. También 8k y 40k, más allá del límite de profundidad. 120k desborda la pila con ASan en sqlite3WalkExprNN (rc=134). No es RCE.
El árbol canónico es https://sqlite.org/src. GitHub sqlite/sqlite es un espejo de Fossil. Zip oficial sqlite-src-3530400. Biblioteca de dominio público. Este pack es AGPLv3.
| ID | sin CVE todavía |
| Clase | Crash (desbordamiento de pila con ASan en sqlite3WalkExprNN; RCE no demostrado) |
| Alcance | Local (SQL no confiable o una VIEW plantada) |
| CWE | CWE-674, CWE-770 |
| CVSS | Alto: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| Producto | SQLite 3.53.4 |
| Afectado | 3.53.4 (b09c88c); residuo de la comprobación de altura de COLLATE posterior en trunk |
| Auth | SQL no confiable o VIEW; load_extension permanece desactivado por defecto |
| Licencia | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18800. Amalgama con ASan. Testigo de crash. |
Introducir una larga cadena postfija COLLATE BINARY como SQL, o plantarla en una VIEW dentro de un .db no confiable. El proceso anfitrión recorre la cadena y muere en la pila de C. El límite documentado de profundidad de expresión nunca se ejecuta en este operador.
SELECT 1 COLLATE BINARY COLLATE BINARY ... es suficiente. La misma forma en CREATE VIEW v AS SELECT 1 COLLATE BINARY ... y luego SELECT * FROM v en una conexión nueva. El SQLITE_LIMIT_SQL_LENGTH por defecto (1e9) sostiene la cadena de ~1.8 MB que desbordó una pila de 8 MB en este lab.
Esto es un crash del proceso embebedor. No es control del puntero de instrucción. load_extension permanece desactivado.
Veinte búsquedas en el código fuente del tag version-3.53.4 de SQLite tras OpenLiteSpeed. Última GA, no el borrador 3.54.0. sqlite.org/security.html trata el SQL no confiable y los .db no confiables como de primera clase. load_extension está desactivado por defecto.
parse.y para COLLATE son tres líneas:
expr(A) ::= expr(A) COLLATE ids(C). {
A = sqlite3ExprAddCollateToken(pParse, A, &C, 1);
}
sqlite3ExprAddCollateToken establece pNew->pLeft = pExpr y EP_Collate|EP_Skip. sqlite3ExprAlloc dejó nHeight = 1. Sin sqlite3ExprCheckHeight. sqlite3PExpr hace ambas cosas para cualquier otro operador binario.
Caminos equivocados: tratar 8k COLLATE como el crash (devolvió 1); tratar 40k como el crash (también devolvió 1, muy por encima de SQLITE_LIMIT_EXPR_DEPTH 1000); necesitar 120k antes de que ASan muriera en sqlite3WalkExprNN.
Este es el G1 de catorce residuos en el pin. Los hermanos son otras publicaciones.
cd lab
./run.sh
Amalgama con ASan del sqlite-src-3530400 oficial (clon de respaldo del tag version-3.53.4). Compose sqlite-collate-depth. HTTP dummy en 127.0.0.1:18800. Enlázalo a loopback.
SUCCESS sqlite-collate-depth how=asan-stack-overflow control=50 crash-n=120000 SQLITE-COLLATE-DEPTH-WITNESS
50 COLLATE devuelve 1. 8k y 40k también devuelven 1. 120k muere rc=134, desbordamiento de pila con ASan en sqlite3WalkExprNN. La comprobación del pin es SELECT sqlite_version() / SELECT sqlite_source_id().
Llamar a sqlite3ExprCheckHeight sobre el nodo COLLATE después de adjuntar pLeft, tal como ya hace sqlite3PExpr. Recalcular nHeight a partir del hijo. Un operador postfijo sigue siendo un árbol de expresión.
Trunk 252c0b7bf5 (2026-10-04) es posterior a esta GA.
b09c88c14082339b66c7b7158d609a771e64ca69)src/parse.y acción COLLATEsrc/expr.c sqlite3ExprAddCollateToken, sqlite3ExprAlloc (nHeight = 1), sqlite3PExpr / sqlite3ExprCheckHeightsrc/walker.c sqlite3WalkExprNNsrc/sqliteLimit.h SQLITE_MAX_EXPR_DEPTH por defecto 1000