
SQLite 3.53.4 - Alta - Local - Privilegio residual - FULL JOIN USING omite sqlite3AuthRead
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-fj-using-auth
Clase: Privilegio residual Alcance: Local
SQLite 3.53.4 (b09c88c / SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci
lookupName() reescribe una columna de FULL JOIN USING a coalesce(...) (TK_FUNCTION). sqlite3AuthRead solo se ejecuta para TK_COLUMN / TK_TRIGGER, por lo que las columnas USING nunca reciben una callback SQLITE_READ. Un embedder que instaló sqlite3_set_authorizer y aplica DENY/IGNORE a READ sobre t2.x sigue devolviendo esa columna mediante SELECT x FROM t1 FULL JOIN t2 USING(x).
El authorizer está desactivado en la apertura por defecto. Residuo de esa API C. No es RCE. FULL JOIN ON y LEFT JOIN USING permanecen denegados / sin fuga. coalesce(t2.x) explícito sigue autorizando.
| ID | sin CVE todavía |
| Clase | Privilegio residual (omisión del authorizer a nivel de columna) |
| Alcance | Local (embedder sqlite3_set_authorizer; SQL del atacante) |
| CWE | CWE-863, CWE-284 |
| CVSS | Alto: 7.5 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| Producto | SQLite (espejo en GitHub sqlite/sqlite) |
| Afectado | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69). La corrección del authorizer para FULL JOIN USING exclusiva de 3.54 (2cb2287768) no está en esta GA. |
| Auth | el embedder instaló sqlite3_set_authorizer; la callback por defecto es NULL |
| Licencia | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18840. Cadena testigo. No es RCE. |
Contra un embedder que instaló sqlite3_set_authorizer como ACL de columnas, preparar SELECT x FROM t1 FULL JOIN t2 USING(x) (o NATURAL FULL JOIN). SELECT x FROM t2 sin más es denegado (SQLITE_AUTH 23). La forma FULL JOIN USING devuelve la columna con READ denegado. No se dispara ninguna callback READ t2.x.
El authorizer está desactivado a menos que el embedder instale uno. El sqlite3_open por defecto no es este residuo. No es RCE.
Veinte búsquedas en el código fuente de 3.53.4 después de PHP. La lista de descartes ya nombraba el check-in del authorizer de FULL JOIN USING de 3.54. Sigue faltando en la última GA. pExpr->op es TK_FUNCTION en lookupname_end, por lo que la compuerta AuthRead nunca se ejecuta. WRC_Prune también impide que el walker descienda a los argumentos de coalesce.
lookupname_end:
if( cnt==1 ){
#ifndef SQLITE_OMIT_AUTHORIZATION
if( pParse->db->xAuth
&& (pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER)
){
sqlite3AuthRead(pParse, pExpr, pSchema, pNC->pSrcList);
}
#endif
Caminos equivocados ya registrados: tratar el authorizer como activado por defecto; esperar que LEFT JOIN USING o FULL JOIN ON filtren; esperar que coalesce(t2.x) explícito omita AuthRead; fijar 3.54.0 mientras aún era borrador.
cd lab
./run.sh
Compila la amalgama oficial sqlite-src-3530400. El harness es lab/auth.c. Loopback 127.0.0.1:18840. Authorizer DENY READ t2.x. SELECT x FROM t2 denegado. SELECT x FROM t1 FULL JOIN t2 USING(x) devuelve el testigo, 0 READ t2.x. FULL JOIN ON denegado. LEFT JOIN USING sin fuga. La línea base con IGNORE es NULL; IGNORE FULL JOIN USING sigue filtrando.
SUCCESS sqlite-fj-using-auth how=full-join-using-skip-authread baseline=denied fj-using=witness fj-on=denied left-using=no-leak SQLITE-FJ-USING-AUTH-WITNESS
Recorrer con sqlite3AuthRead cada hijo de pFJMatch tras la reescritura a coalesce, tal como lo hace trunk 2cb2287768 / Git 5694c3bb para 3.54. Autorizar solo a[0] (bbd69ce274) no es suficiente. LEFT JOIN USING y FULL JOIN ON ya autorizan; no son este residuo.
b09c88c14082339b66c7b7158d609a771e64ca69)src/resolve.c reescritura a coalesce de lookupName y compuerta AuthReadsrc/auth.c sqlite3AuthRead / sqlite3AuthReadCol