10 agosto 2012

Forense de SQLite II - Cabecera

Los ficheros SQLite, para hacernos una idea, tienen una forma similar a un taco de folios, compuesto por páginas de un mismo tamaño en las que se almacena la información.

El tamaño de la página y otros aspectos importantes de la configuración de la base de datos se definen en números enteros big-endian en la cabecera del fichero. La cabecera son los primeros 100 bytes. Los parámetros más importantes dentro del ámbito de análisis forense son:

Figura 1. Principales bytes de la cabecera de  SQLite

Usando como ejemplo la base de datos de correo electrónico de iPhone, se sacan los siguientes datos:

Figura 2. Ejemplo de cabecera SQLite

Donde se han metido en un recuadro rojo la cabecera  y en colores la tabla de la figura 1:

  • 53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00: Simplemente la cadena descrita acabada en "00"
  • 10 00: Tamaño de la página: 4096bytes (a excepción de la primera, que empieza en el 100)
  • 01: No dispone de modo WAL para escritura
  • 01: No dispone de modo WAL para lectura
  • 00 00 5F C5: El fichero ha sido cambiado 24.517 veces
  • 00 00 08 0C: El fichero dispone de 2060 páginas, lo que si todo es correcto el fichero tendrá un tamaño de 4096*2060 = 8.437.760.
  • 00 00 02 E4: Número de la primera página libre troncal: 740. Lo que significa que en la posición 3026944 del fichero  (    sacado con la formula:  (740-1)*4096    ), se encontrá la primera página de este tipo.
  • 00 00 00 01: Codificación de texto UTF-8, ya que representa 1.
  • 00 00 00 00: Al estar todo a 0, no hay auto-vacuum.
  • 00 2D E2 1F: Representa 3007007, por lo que la versión de la base de datos es 3.7.7
No todas las líneas son obvias, así que continúo explicando WAL, página troncal libre y auto-vacuum.

WAL  (Write-Ahead Logging) es un método de rollback introducido en la versión 3.7.0, que invierte el proceso tradicional de rollback. Lo normal es que los cambios en una base de datos sqlite sean escritos en el fichero original, manteniendo un registro de modificaciones en otro fichero del que podrán ser recuperados si algo no fuese escrito correctamente por una interrupción. Con WAL, se crea un nuevo fichero (generalmente el mismo nombre añadiendo -wal al final), sobre el que se harán los cambios y que sobrescribirá el original cuando se reciba la orden para ello.

Para entender las páginas libres "troncales" hay que saber que las páginas del fichero pueden ser de distintos tipos según la información que contengan, a modo de referencia y para profundizar posteriormente existen: 
  • Páginas de lock-byte
  • Paginas libres, que pueden ser a su vez hojas (leaf) o troncal (trunk)
  • B-Tree, que son de cuatro tipos: tabla interior, tabla de hoja, índice interior e índice de hoja  (en inglés: table interior page, table leaf page, index interior page, index leaf page).
  • Páginas de desbordamiento (overflow)
  • Páginas mapa de punteros.
Una página troncal libre es un índice (como el de un libro) que identifica las "hojas" libres que el motor de la base de datos puede usar para almacenar información. Al igual que ocurre en un sistema de ficheros, cuando un dato es eliminado no se borra por completo, tan solo es marcado como espacio disponible, quedando la información original en el mismo lugar. Por lo tanto, de una página libre troncal se puede averiguar en qué partes del fichero hubo información que actualmente se considera eliminada (aunque siga existiendo). Cómo recorrer esa y otras zonas donde hay información, el próximo día ;)

Todos las entradas de la serie:

3 comments :

little endian dijo...

Me ha encantado, muy buen trabajo y muy bien explicado :)

Madrikeka dijo...

Tiene muy buena pinta estos post, así que como los de Infección de Ejecutables en Linux, cuando esté terminado, me hago el macroPDF y me lo leo del tirón. :D

Alex dijo...

Buen trabajo y gracias por dedicar tu tiempo a escribir este tipo de cosas, estoy aprendiendo mucho. Aún tengo pendiente el de los ejecutables en linux.


Un saludo!