
SQLite 3.53.4 - Alta - Local - escritura fuera de límites en el heap - crecimiento de nCol con el mismo nombre en el changeset de la sesión
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-session-ncol
Análisis: https://abraxaslabs.tech/research/sqlite-session-ncol
Clase: escritura OOB en el heap Alcance: Local
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) con -DSQLITE_ENABLE_SESSION. Un changeset de dos bloques que reutiliza el nombre de tabla t con nCol=2 y luego nCol=64 omite el reinicio de sessionTableInfo (sqlite3session.c:5619) y hace memset más allá del aUpdateMask del primer bloque. Escritura ASan de tamaño 12 en sessionUpdateFind. Control: aplicación de un único UPDATE de 2 columnas con apply-rc=0.
No es una amalgamación por defecto a menos que SESSION esté activado. CVE-2026-50812 NPD está cerrado en 3.53.2+. No es una carga útil RCE weaponizada. El oráculo es la escritura ASan.
| ID | aún sin CVE |
| Clase | escritura OOB en el heap (escritura ASan de tamaño 12; RCE no demostrado) |
| Alcance | Local (changeset no confiable vía sqlite3changeset_apply*) |
| CWE | CWE-787 |
| CVSS | Alto: 8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Producto | SQLite Session extra (Hwaci) |
| Afectado | 3.53.4 (b09c88c) compilado con -DSQLITE_ENABLE_SESSION |
| Autenticación | el host aplica un changeset no confiable |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1:18900. Testigo de escritura ASan de tamaño 12. |
Aplicar un changeset no confiable cuyo segundo bloque de tabla reutiliza un nombre de tabla con un nCol mayor. Escritura OOB en el heap. Extra de compilación. No es una amalgamación por defecto a menos que SESSION esté activado.
El primer bloque asigna aUpdateMask a partir de pIter->nCol. El bloque posterior con el mismo nombre omite el reinicio de sessionTableInfo y hace memset de una máscara mayor sobre la asignación antigua. Laboratorio: UPDATE con nCol=2 y luego nCol=64. Escritura ASan de tamaño 12 en sessionUpdateFind. Control: aplicación de un único UPDATE de 2 columnas con apply-rc=0.
No trates este paquete como un gadget write-what-where. La escritura ASan de tamaño 12 es el oráculo.
Veinte búsquedas en el código fuente de SQLite 3.53.4 tras la oleada de FTS5 / session-NPD de 3.53.2. CVE-2026-50812 está cerrado (sessionBindRow trata un valor ausente como SQLITE_CORRUPT). Session sigue indexando SessionApplyCtx solo por nombre de tabla. Un segundo bloque con el mismo nombre y un recuento de columnas declarado mayor reutiliza aUpdateMask.
Pistas falsas ya registradas: tratar la amalgamación por defecto como dentro del alcance (SESSION está desactivado); volver a presentar CVE-2026-50812; enviar un único bloque de tabla con nCol=64 contra un esquema de 2 columnas (schemaMismatch, sin escritura); afirmar RCE a partir de un memset de 12 bytes.
cd lab
./run.sh
Amalgamación de ASan a partir del zip oficial sqlite-src-3530400. Compilar con -DSQLITE_ENABLE_SESSION -DSQLITE_ENABLE_PREUPDATE_HOOK adicionales. Health en 127.0.0.1:18900. Vincularlo a loopback.
SUCCESS sqlite-session-ncol how=asan-heap-write-sessionUpdateFind write-size=12 control-apply-rc=0 SQLITE-SESSION-NCOL-WITNESS
Cuando un bloque de tabla de changeset posterior reutiliza un nombre, reconstruir SessionApplyCtx de la misma forma en que ya lo hace un nombre nuevo: liberar aUpdateMask, volver a ejecutar sessionTableInfo, rechazar un nCol mayor que el esquema activo. Trunk 3f57024aec / branch-3.53 a1dd7123d8 (2026-08-17) es posterior a esta GA.
b09c88c14082339b66c7b7158d609a771e64ca69)sessionChangesetApply :5619, sessionUpdateFind :4381-4412