Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
sqlite-fj-using-auth — SQLite 3.53.4 - Alta - Local - Privilegio residual - FULL JOIN USING omite sqlite3AuthRead | Kitploit
Herramientas/GitHubGitHub/abraxas/sqlite-fj-using-auth
Autenticación y AutorizaciónEscalada de PrivilegiosAnálisis EstáticoAnálisis de VulnerabilidadesAnálisis de CódigoExplotaciónPapers e InvestigaciónSeguridad de Bases de Datos
GitHubabraxas/sqlite-fj-using-auth

sqlite-fj-using-auth

SQLite 3.53.4 - Alta - Local - Privilegio residual - FULL JOIN USING omite sqlite3AuthRead

23hace 7 díasAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
Ver Repositorio

Abraxas Labs - sqlite-fj-using-auth

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  sqlite-fj-using-auth

Write-up: https://abraxaslabs.tech/research/sqlite-fj-using-auth

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 se ejecuta solo 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 siguen denegados / sin fuga. coalesce(t2.x) explícito sigue autorizando.

IDaún sin CVE
ClasePrivilegio residual (omisión del authorizer a nivel de columna)
AlcanceLocal (embedder sqlite3_set_authorizer; SQL del atacante)
CWECWE-863, CWE-284
CVSSAlto: 7.5 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
ProductoSQLite (espejo en GitHub sqlite/sqlite)
Afectado3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69). La corrección del authorizer para FULL JOIN USING, exclusiva de 3.54 (2cb2287768), no está en esta GA.
Authel embedder instaló sqlite3_set_authorizer; la callback por defecto es NULL
LicenciaGNU Affero GPL v3.0
Labsolo 127.0.0.1:18840. Cadena testigo. No es RCE.

Qué puede hacer un atacante

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 se deniega (SQLITE_AUTH 23). La forma FULL JOIN USING devuelve la columna denegada para READ. 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 presenta este residuo. No es RCE.

Cómo lo encontré

Veinte búsquedas en el código fuente de 3.53.4 después de PHP. La lista de omisiones ya nombraba el check-in del authorizer para 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

Las decisiones incorrectas ya registradas: tratar el autorizador como activado por defecto; esperar que LEFT JOIN USING o FULL JOIN ON filtraran; esperar que coalesce(t2.x) explícito omitiera AuthRead; fijar la versión 3.54.0 mientras aún era un borrador.

Laboratorio

cd lab
./run.sh

Compila la amalgama oficial sqlite-src-3530400. El arnés es lab/auth.c. Loopback 127.0.0.1:18840. El autorizador 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 de 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

La solución

Recorrer sqlite3AuthRead sobre cada hijo de pFJMatch después de la reescritura de coalesce, tal como lo hace el 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 remanente.

Referencias

  • sqlite.org/src etiqueta version-3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69)
  • src/resolve.c reescritura de coalesce de lookupName y puerta de AuthRead
  • src/auth.c sqlite3AuthRead / sqlite3AuthReadCol
  • Foro 2026-07-24T02:52:08Z / 2026-05-31T02:00:37Z
Descargar herramienta