SQLite es una base de datos relacional de código abierto que almacena todos los datos en un único archivo. Los datos se almacenan en una estructura de árbol B que contiene páginas de tablas, índices y páginas libres. Incluso después de eliminar datos, gran parte de la información permanece en el archivo en las páginas libres y en el espacio libre entre celdas y cabeceras.
Alejandro Ramos - Te pique lo que te pique, analiza un SQLite [Rooted CON 2013]
1. Te pique lo que te pique, analiza
un SQLite
Alejandro Ramos
www.SecurityByDefault.com
2. INTRODUCCIÓN
• Base de datos relacional (RDBMS) open source
• Creado en el año 2000 por Dwayne Richard Hipp
• No funciona en el modo tradicional cliente/servidor.
Es un único fichero embebido.
• Desarrollado para optimizar espacio.
• Ampliamente usado en móviles, también en
aplicaciones como Firefox, Chrome, Adobe Air,
Dropbox o Skype
3. Desde una perspectiva forense
• Existen Páginas libres / espacio libre en páginas.
• Rollback journal.
– Cambios directamente en el fichero original.
– Copia del original en fichero “-journal”
– Se aplican los cambios si todo es correcto.
• Versión 3.7.0 > Write Ahead Log (WAL)
– Invierte el proceso.
– Cambios en WAL “-wal”, original no se modifica
• VACUUM: recompone la base de datos ==
“desfragmenta”.
5. Estructura del SQLite
• Los datos se almacenan en una estructura
denominada “B-Tree” (común en bbdd y sistemas de
ficheros)
• Se componen de:
– Páginas libres: hojas y troncales.
– Páginas de tablas: hojas e interiores.
– Páginas de índices: hojas e interiores.
– Páginas de Overflow
6. Páginas libres
• Páginas que contenían
información de la base
de datos y han sido
marcadas como libres.
Por ej, tras un DELETE.
• Gran parte de los
datos permanece en
el fichero
7. Cabecera de las páginas
• Identifican el número de celdas en la página
• Donde comienza la primera celda.
Espacio libre = desde el fin de cabecera hasta
el comienzo de la primera celda.
8. Celdas en páginas
• Cada celda representa un registro de una tabla
• Una celda puede no entrar en una sola página,
produciendo una nueva página “overflow”.
• En las páginas libres, las celdas están intactas.
• En el resto, las celdas eliminadas pierden el tamaño
del payload y cabecera.
– No es posible saber donde empieza y acaba el dato de
forma estructurada.
9. … En definitiva …
Una base de datos SQLite mantiene los datos sin
eliminar (siempre y cuando no se haga un vacuum) en:
– Páginas de tabla e índices: espacio libre entre la cabecera y
el comienzo de celdas.
– También el espacio libre entre celdas, si se ha modificado y
reducido el tamaño de un celda.
– Páginas libres y troncales: prácticamente enteras menos la
cabecera.
– Páginas Overflow: desde que termina la celda hasta el final.