Recuperación de datos borrados de SQLite: Navegando por la Cadena de Bloqueo Libre

Introducción

Las bases de datos SQLite son tesoros de pruebas digitales que se encuentran en muchas aplicaciones, desde mensajes de chat hasta registros de transacciones. Pero, ¿qué ocurre cuando se borran los registros? Entra en freeblocks-secciones ocultas de espacio no utilizado dentro de páginas de bases de datos que retienen restos de datos eliminados. Estos bloqueos libres son una mina de oro para los investigadores forenses, ya que permiten recuperar registros críticos y descubrir pruebas ocultas.

Este blog desmitifica los freeblocks de SQLite, explicando cómo funcionan, cómo localizarlos con herramientas como editores hexadecimales y cómo recuperar registros borrados. Tanto si eres un investigador como un aficionado al análisis forense digital, esta guía te proporcionará las técnicas esenciales para extraer datos ocultos.

¿Qué son los Freeblocks en SQLite?

Los bloques libres son secciones de espacio no utilizado dentro de una página de base de datos SQLite. Cuando se elimina un registro, el espacio correspondiente no se sobrescribe inmediatamente a menos que se active un mecanismo de borrado seguro. En su lugar, se marca como freeblockdisponible para futuros escritos.

En este proceso:

  • Se elimina el puntero al registro eliminado.
  • La cabecera de la página se actualiza para reflejar la eliminación.
  • Si procede, se ajusta el desplazamiento que apunta al primer bloque libre.

 

Estos bloqueos libres suelen conservar restos de los datos originales, lo que los convierte en un foco crítico para los investigadores forenses que pretenden recuperar registros borrados.

Ejemplo:

En la siguiente captura de pantalla, examinamos una base de datos SQLite utilizando DB Browser. La tabla "mensajes" muestra dos registros vivos, pero las pistas forenses sugieren la presencia de registros eliminados adicionales.

Cómo encajar los Freeblocks en las cabeceras de página SQLite

Para localizar y analizar los freeblocks, primero tenemos que entender la estructura de las páginas de la base de datos SQLite. Cada página contiene una cabecera que proporciona metadatos críticos, incluyendo punteros a freeblocks.

La siguiente tabla muestra la estructura de cabecera para un tipo de página 0D:

Desplazamiento Talla Descripción
0 1 Byte Tipo de página
1 2 Bytes Desplazamiento del byte al primer bloque libre
3 2 Bytes Número de celdas de la página
5 2 Bytes Desplazamiento al primer byte del contenido de la celda
7 1 Byte Número de bytes libres fragmentados en celdas

Lo más importante:

El valor en el offset 1 de la cabecera de página apunta al primer bloque libre. Si este valor es 0x0000, no hay freeblocks en la página.

Uso de editores hexadecimales para analizar bloqueos gratuitos

Para localizar el primer bloque libre, abrimos la base de datos en un editor hexadecimal. El valor de dos bytes en el offset 1 de la cabecera de página proporciona el offset de la ubicación del freeblock.

En el ejemplo siguiente:

  • El editor hexadecimal resalta el desplazamiento 0x03A9 (decimal 937) en rojo, que señala la ubicación del primer bloque libre.

Si se desplaza a este desplazamiento, se verá el inicio del bloque libre. A continuación, examinamos la celda situada en el desplazamiento 937.

Descodificación de cabeceras Freeblock

Cada bloque libre contiene una cabecera de cuatro bytes que comprende:

  1. 2 primeros bytes: Desplazamiento al siguiente bloque libre (0x0000 si no existe).
  2. Segundo 2 bytes: Tamaño total del bloque libre, incluida la propia cabecera.

Ejemplo:

En offset 0x03A9, indica la cabecera del bloque libre:

  • El siguiente bloque libre está en el offset 0x03EA (decimal 1002).
  • El tamaño del bloque libre es 0x0024 (36 bytes, incluida la cabecera).

Recuperación de registros borrados mediante bloqueos gratuitos

Los Freeblocks suelen contener restos de registros eliminados, lo que permite a los investigadores forenses recuperar datos parciales o completos. En la siguiente captura de pantalla, la carga útil de un registro eliminado está intacta y se puede recuperar a pesar de que se haya eliminado su puntero.

Ejemplo:

  • El registro eliminado en el offset 0x03A9 contiene el mensaje: "No mucho. ¿Cómo estás?"
  • Los campos clave permanecen intactos, incluido el contenido del mensaje, aunque se hayan sobrescrito otros metadatos.

Analizamos los bloqueos libres subsiguientes para descubrir registros eliminados adicionales. En el offset 0x03EA, revela la cabecera del bloque libre:

  • El tamaño del bloque libre es 0x0016 (22 bytes).
  • Este es el último bloque libre de la cadena, como indica 0x0000 en el siguiente campo de puntero de bloque libre.

La siguiente captura de pantalla resalta toda la zona de celdas del segundo freeblock de la cadena donde estaba el mensaje borrado: "¡Hola Andy!".

Identificación de registros adicionales eliminados

Pero resulta que hay otro registro borrado en esta página no referenciado por la cadena freeblock. Mirando la cabecera de la página, sólo había 2 registros en esta página según el valor de dos bytes en el offset 3 (0x00002). Y como sólo hay 2 registros, sólo hay dos punteros en la matriz de punteros. Esos dos punteros apuntan al registro #2 - "Hola, ¿qué tal?" y al registro #4 - "Hola, me preguntaba si tienes algo de Scooby snax". Puedes observar que hay otro mensaje largo situado más arriba en la página.

El valor de dos bytes en el offset 5 de la cabecera de página es el offset del área de contenido de la celda, esencialmente donde se escribiría el siguiente registro, es decir, a menos que quepa en uno de los freeblocks. Este valor es 0x0363 que es el offset decimal 867.

La flecha en la captura de pantalla anterior apunta al desplazamiento de página 867. Este es el inicio del contenido de la celda, lo que significa que el siguiente registro se añadirá justo encima de este registro. El registro borrado encima de éste contiene el mensaje "Resulta que anoche recibí un nuevo suministro. Estás de suerte. ¿Cuánto necesitas?"

La base de datos considera estos datos como espacio no asignado. También podría llenarse con 0x00 ya que no hay ningún puntero en la matriz de punteros que se dirija a él. 

Si en la tabla a la que pertenece esta página se añade un registro demasiado grande para caber en los dos bloqueos libres de la página, éste sobrescribirá el mensaje, que resulta ser el registro #5. 

Veamos cómo queda ahora que hemos identificado los dos freeblocks junto con el tercer registro borrado que está esperando a ser sobrescrito:

Tras analizar la base de datos en su formato original, podemos concluir que contenía algo más que los 2 registros "vivos" que mostraba el visor de la base de datos. 

El registro #1 era probablemente el mensaje "¡Hola Andy!" mientras que el registro #3 era probablemente el mensaje "No mucho. ¿Cómo estás?". El registro #5 todavía tiene su número de registro dentro de su celda identificado como el mensaje, "Resulta que anoche recibí un nuevo suministro. Estás de suerte. ¿Cuánto necesitas?"

 

Conclusión

Los bloqueos son una poderosa herramienta en las investigaciones forenses, ya que ofrecen una ventana a los registros borrados y a los datos no asignados. Dominando estas técnicas, los investigadores pueden descubrir los rastros digitales que dejan las bases de datos.

¿Está listo para llevar sus conocimientos forenses de SQLite al siguiente nivel? Explore nuestros programas de formación avanzada o póngase en contacto con nosotros para saber cómo podemos ayudarle a convertirse en un experto forense.

Facebook
Twitter
Correo electrónico
Imprimir

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Suscríbase para estar al día

No se pierda ni una entrada: reciba notificaciones cada vez que publiquemos un nuevo artículo en el blog, una guía forense o compartamos actualizaciones importantes.

Última publicación