Vulnerabilidad en WhatsApp: falsificación de mensajes manipulando la base de datos

WhatsApp es la aplicación de mensajería instantánea más utilizada del mundo. Más de setecientos millones de usuarios en todo el planeta (la décima parte de toda la Humanidad), la utiliza para intercambiar mensajes de texto y de voz, ficheros de audio y de vídeo, etc. El hecho de que sea una aplicación universalmente utilizada, implica también que muchas personas, involucradas en procesos judiciales, presenten los mensajes de WhatsApp como prueba si quieren demostrar que una conversación, en unos términos concretos, ha tenido lugar entre determinados interlocutores.

Existe ya jurisprudencia en España en la admisión como prueba de mensajes de WhatsApp, como por ejemplo en la Sentencia de la Audiencia Provincial de Alicante Número 4/2014, de 9 de enero, en el ámbito civil, o la Sentencia de la Audiencia Provincial de Madrid Número 533/2014, de 24 de julio, en el ámbito penal. También han sido rechazados, como por ejemplo en la Sentencia de la Audiencia Provincial de Madrid Número 51/2013 de 23 de septiembre, por entenderse que, según transcripción textual de la sentencia, los “contenidos no han sido reconocidos por el acusado, ni se ha practicado sobre los mismos prueba pericial informática que acredite su autenticidad y su envío”, lo cual quiere decir que, si la otra parte no reconoce el envío de los mensajes, se deberá presentar un peritaje informático que avale la autenticidad de los mismos. Además, recientemente se ha fallado por el Tribunal Supremo en la STS 2047/2015 que, en general, para la admisión como prueba de cualquier conversación mantenida a través de una red social, es necesaria la presentación de un informe pericial informático por parte de un perito informático.

Que actualmente ya se estén admitiendo como pruebas los mensajes enviados y recibidos a través de WhatsApp, otorga una dimensión extraordinaria a esta aplicación, de tal forma que debe tenerse en cuenta la posibilidad de que los mensajes puedan ser manipulados, no sólo a la hora de realizar el envío del propio mensaje, como ya fue demostrado por dos ingenieros informáticos españoles, sino también una vez los mensajes han sido enviados o recibidos, es decir, directamente sobre la base de datos en la que se almacenan los mismos. Éste es el archivo sobre el que debe practicarse la prueba pericial informática cuando se presentan los mensajes de WhatsApp en un procedimiento judicial, por lo que es de vital importancia que dicho fichero permanezca íntegro o, al menos que, si se manipula maliciosamente, esta alteración pueda ser advertida tras un análisis forense por parte de un perito informático. Lo que se pretende demostrar en el presente artículo, es que dicho archivo de base de datos puede ser manipulado, alterando las conversaciones de tal forma que la manipulación podría perfectamente pasar inadvertida para un perito informático que realizase una investigación forense sobre el terminal móvil.

 

En primer lugar, se procederá a un intercambio de mensajes de WhatsApp (los que luego serán manipulados), entre dos terminales móviles cuya versión de WhatsApp instalada es la 2.12.250 en ambos. Estos terminales son un Samsung Galaxy S6 y un Wiko Goa, cuyo sistema operativo en ambos casos es Android, versión 5.1.1 y 4.4.2, respectivamente. Así pues, a continuación, se muestran los mensajes enviados y recibidos a modo de ejemplo entre ambos terminales.

Captura conjunta

Seguidamente, se ha de indicar que la base de datos interna de WhatsApp utiliza SQLite como Sistema Gestor de Base de Datos, por lo que se trata, por tanto, de un sistema relacional. Asimismo, una copia de esta base de datos, se encuentra fácilmente accesible conectando el terminal móvil al ordenador, estando ésta cifrada mediante criptografía simétrica utilizando el algoritmo AES, cuyo funcionamiento puede observarse en el siguiente diagrama.

Diagrama AES

Como se puede apreciar, la clave de cifrado y descifrado es la misma. Esto equivale a decir que la misma clave se utiliza para cifrar y para descifrar la base de datos, estando ésta almacenada y accesible en el directorio que utiliza WhatsApp. Sin embargo, la base de datos original, es decir, la que es utilizada por la aplicación para almacenar los mensajes inmediatamente después de ser enviados o recibidos, no está cifrada, sino que se encuentra almacenada en texto claro en uno de los directorios que la aplicación tiene en el sistema operativo. Esta base de datos no es accesible conectando directamente el terminal al ordenador, pero sí lo es una vez el terminal Android ha sido rooteado, es decir, configurado para ser accedido en modo súper-usuario, lo cual es algo muy sencillo de realizar incluso para usuarios no expertos.

 

Así pues, una vez el móvil ha sido rooteado (para este ejemplo, se usará el Wiko Goa), tener acceso a la base de datos original es una operación muy sencilla. Para ello, usando la utilidad ADB para Windows de las herramientas de desarrollo de Android, es necesario ejecutar los siguientes comandos al objeto de abrir una sesión con el terminal (primeramente es necesario haber instalado correctamente las herramientas de desarrollo de Android y los drivers del dispositivo móvil del cual se desea obtener su base de datos de WhatsApp, así como haber activado el “modo de depuración USB” en el citado terminal Android):

C:\android-sdk-windows\platform-tools>adb devices
C:\android-sdk-windows\platform-tools>adb shell

Una vez se han ejecutado estos dos comandos, la utilidad ADB abre una sesión con el terminal móvil, tal y como se observa en la siguiente imagen.

DOS-1

Es necesario indicar que, como servidor de ADB en el dispositivo móvil, es posible que sea necesario instalar y ejecutar una aplicación como ADB Insecure, más conocido como ADBD, al objeto de que se pueda transferir información entre el móvil y Windows y viceversa. Esto es así debido a que ciertas características de la utilidad ADB de serie no pueden ser utilizadas en versiones estables, es decir, finales, de Android, sino únicamente en versiones de desarrollo.

A continuación, es necesario acceder en modo súper-usuario al terminal, ya que la base de datos original de WhatsApp se encuentra en un directorio que sólo puede ser visualizado con privilegios de administrador. Para ello, es necesario ejecutar el comando “su”, tal y como se aprecia en la siguiente imagen.

DOS-2

Siendo ya súper-usuario, es necesario moverse al directorio en el que se encuentra la base de datos original de WhatsApp, ejecutando el siguiente comando:

# cd /data/data/com.whatsapp/databases

Al ejecutar un listado de los ficheros presentes en dicho directorio, mediante el comando “ls -la”, se aprecian los siguientes archivos:

DOS-3

Como se puede observar, el fichero que interesa es el remarcado en rojo. Ésta es la base de datos original de WhatsApp en la que se almacenan los mensajes inmediatamente después de ser enviados o recibidos. Una vez se ha visualizado el archivo que interesa, es necesario ejecutar el comando “exit” dos veces para volver a Windows, ya que será desde allí desde donde se tomará el archivo de base de datos de WhatsApp.

 

Ya en Windows, es necesario ejecutar el siguiente comando, al objeto de traer a Windows la base de datos (aunque es necesario, previamente, para disponer de todos los mensajes, incluyendo los enviados y recibidos en último lugar, haber realizado una copia de seguridad de los mensajes desde la propia aplicación WhatsApp, en el menú Ajustes -> Chats y llamadas -> Guardar chats):

C:\android-sdk-windows\platform-tools>adb pull /data/data/com.whatsapp/databases/msgstore.db

La ejecución exitosa del comando presenta la siguiente información en la consola:

DOS-4

La siguiente captura de pantalla del directorio de Windows en el que se encuentra la utilidad ADB, muestra que en dicha carpeta ha sido depositado el fichero “msgstore.db” (seleccionado en la imagen):

WIN-1

Para abrir el mencionado fichero de base de datos, será necesario un cliente de SQLite, habiendo sido seleccionado para este ejemplo el cliente de código abierto SQLiteStudio. Así pues, es necesario abrir el programa y, posteriormente, navegar hasta el menú Database -> Add a database, al objeto de añadir una nueva base de datos, por lo que se deberá buscar y seleccionar el archivo de base de datos que se desea alterar, en este caso “msgstore.db”, localizado en el directorio en el que se encuentra la utilidad ADB. Una vez añadida la base de datos, ésta aparece en SQLiteStudio como se aprecia en la siguiente imagen (remarcada en rojo).

WIN-2

Seguidamente, es necesario conectarse a la base de datos. Para ello, con la base de datos seleccionada, hay que navegar hasta el menú Database -> Connect to the database, de tal forma que el cliente se conecta inmediatamente a la base de datos. Desplegando la base de datos, se puede observar que ésta está conformada por once tablas, tal y como se observa en la siguiente imagen.

WIN-3

De todas estas tablas, las que interesan son las siguientes:

  • messages, que almacena los mensajes enviados y recibidos, así como varias propiedades de los mismos.
  • messages_fts_content, que almacena los mensajes enviados y recibidos sin ninguna propiedad, únicamente con la misma clave primaria que en la tabla messages.

 

Para modificar un mensaje enviado o recibido es tan sencillo como realizar los siguientes pasos:

  1. En primer lugar, es necesario conocer la clave primaria del mensaje que se desea modificar. Para ello, lo más óptimo es ejecutar una consulta de búsqueda por el patrón del mensaje en el propio cliente de SQLite. Así pues, para modificar el mensaje del ejemplo, se ejecutará la siguiente consulta, que proporcionará todos aquellos mensajes donde aparece la palabra “whatsapp”, de tal forma que pueda tomarse el identificador del mensaje que se desea modificar:
    select * from messages where data LIKE “%whatsapp%”;

    La ejecución de la consulta se aprecia en la siguiente imagen, en la que únicamente se han devuelto dos registros, debido a que la palabra “whatsapp” sólo aparece dos veces en todos los mensajes (se ha remarcado en rojo, asimismo, el botón del cliente de SQLite con el cual se puede acceder al editor de SQL).

    WIN-4

    Ampliando la imagen sobre los mensajes, remarcados en rojo, se ve claramente que se trata de los mensajes recibidos desde el Samsung Galaxy S6 en el Wiko Goa:

    WIN-5

  2. El mensaje que se va a modificar va a ser el que tiene como clave 7934. Por tanto, es necesario anotar dicha clave y, acto seguido, editar el campo data de la tabla messages, directamente desde el propio resultado devuelto por la consulta, escribiendo lo que interese, para inmediatamente después pulsar en el botón commit al objeto de persistir los cambios realizados. En la siguiente imagen se muestra el registro ya modificado y persistido tras haber pulsado el botón commit (el cual se halla remarcado en rojo).

    WIN-6

    La nueva frase, como se puede observar, es “WhatsApp es una aplicación segura. No hay nada que temer sobre ella.” Nótese que la anterior frase era “WhatsApp es una aplicación insegura.”

  3. Posteriormente, es necesario editar la tabla messages_fts_content, para lo cual hay que dirigirse al árbol de tablas, pinchar con el botón derecho en la misma y seleccionar la opción Edit the table. Una vez en el editor, es necesario aplicar un filtro (remarcado en rojo y usando la clave, 7934), al objeto de encontrar el registro deseado, tal y como se aprecia en la siguiente imagen.

    WIN-7

    Una vez se ha localizado al registro, es necesario proceder a cambiar el texto. A continuación, se muestra una imagen con el registro modificado y persistido, procurando mantener el estilo de la citada tabla (todo el texto en minúsculas, las palabras separadas por tres espacios y los signos de puntuación separados de la palabra anterior por un espacio):

    WIN-8

    En realidad, la modificación de esta tabla no sería estrictamente necesaria para que en la aplicación se viesen los mensajes alterados como si fuesen auténticos, pero sí es necesario si se quiere dificultar el trabajo del perito informático que vaya a analizar los mensajes y dictaminar si realmente fueron enviados y/o recibidos, es decir, si son auténticos.

 

Una vez realizados todos los pasos anteriores, es necesario seleccionar con el botón derecho del ratón la base de datos en SQLiteStudio y ejecutar la opción Disconnect from the database, para acto seguido salir del programa. Posteriormente, se debe copiar la base de datos alterada en el teléfono, sustituyendo la original. Para ello, es necesario ejecutar el siguiente comando en la consola de Windows (como se mencionó anteriormente, la aplicación ADB Insecure debe encontrarse en ejecución en el móvil):

C:\android-sdk-windows\platform-tools>adb push msgstore.db /data/data/com.whatsapp/databases/msgstore.db

La ejecución exitosa de este comando presenta la siguiente salida por pantalla:

DOS-5

Para dejar el menor rastro posible de la manipulación, es necesario modificar tanto el propietario como el grupo del fichero de base de datos, que al haberlo copiado como root, es decir, como súper-usuario, tendrá tanto este propietario como este grupo. Para apreciarlo, se debe navegar hasta el directorio en el que se encuentra la base de datos, ejecutando los siguientes comandos:

C:\android-sdk-windows\platform-tools>adb shell
# su
# cd /data/data/com.whatsapp/databases
# ls –la

Tras la ejecución de los comandos anteriores, la salida es la siguiente:

DOS-6

Como se puede apreciar dentro del rectángulo remarcado en rojo, el nuevo propietario del fichero “msgstore.db”, es el súper-usuario, así como también el nuevo grupo del fichero es el grupo del súper-usuario. Para revertir esta situación, es necesario ejecutar el siguiente comando:

# chown u0_a88:u0_a88 msgstore.db

Posteriormente, ejecutando el comando “ls –la”, se puede observar que tanto el propietario como el grupo ya han cambiado, tal y como se observa en la siguiente imagen:

DOS-7

Como se puede apreciar, el nuevo propietario y el nuevo grupo del fichero “msgstore.db” es u0_a88, que es el mismo que tienen todos los demás ficheros. Para abandonar el modo de depuración, es necesario ejecutar dos veces el comando “exit” y, posteriormente, ya desde Windows, es necesario ejecutar el comando “exit” para cerrar la consola.

 

Una vez realizado todo el proceso, debe reiniciarse el teléfono móvil y acceder, mediante la utilidad ADB, al directorio en el que se encuentra la base de datos, al objeto de comprobar que las fechas de último acceso de la misma se han actualizado y que no es posible determinar si la base de datos ha sido sustituida por una alterada. Para ello, es necesario ejecutar los siguientes comandos:

C:\android-sdk-windows\platform-tools>adb devices
C:\android-sdk-windows\platform-tools>adb shell
# su
# cd /data/data/com.whatsapp/databases
# ls -la

La ejecución de estos comandos ofrece el siguiente resultado:

DOS-8

Como se puede observar, la fecha de última modificación de la base de datos es muy similar al resto de fechas de los otros archivos utilzados por WhatsApp, por lo que sería muy difícil dictaminar que la base de datos ha sido manipulada. Para ello, serían necesarias técnicas de file carving, es decir, recuperación de ficheros borrados, las cuales son muy costosas debido a las herramientas hardware y software necesarias y, además, no garantizan el éxito porque las áreas del sistema de ficheros ocupadas por ficheros borrados, son sobrescritas por el sistema operativo en función de las necesidades de éste.

A continuación, se muestra el resultado del proceso visualizado en el WhatsApp del teléfono Wiko Goa, junto a la imagen original de los mensajes enviados por el Samsung Galaxy S6:

Captura conjunta final modificada

Como se puede observar, el último mensaje ha sido alterado, de tal forma que ha pasado de aparecer “WhatsApp es una aplicación insegura.”, a “WhatsApp es una aplicación segura. No hay nada que temer.” Seguidamente, se adjunta una captura de pantalla en la que aparecen tanto la versión original como la modificada, para apreciar las diferencias.

Capturas original y modificada

Como se puede apreciar, la manipulación es sencillamente indetectable a simple vista y, aún realizando un examen pericial informático, resultaría muy difícil de detectar si se han tomado todas las precauciones indicadas en este artículo. También es necesario indicar que muchas más precauciones pueden ser tomadas para evitar que un perito informático detecte una manipulación en el envío y la recepción de mensajes de WhatsApp, puesto que la tecnología y la informática evolucionan cada día.

 

Cabe añadir que, de la misma forma que se han manipulado los mensajes ya enviados y/o recibidos, también es posible y relativamente sencillo generar mensajes que no existían, aparentemente procedentes de cualquier teléfono del mundo, incluso de números inexistentes, haciéndose pasar por auténticos y siendo también muy difícil determinar si lo son o no. Para ello es necesario, además de manipular las tablas en las que se almacenan los mensajes, alterar también la tabla que almacena los contactos, es decir, la denominada chat_list.

 

Como conclusión, se extrae que WhatsApp es una aplicación muy poco segura y fácilmente manipulable, por lo que la aceptación de conversaciones mantenidas a través de la misma como prueba en un juicio, debe realizarse con cautela y, por supuesto, siempre con el aval de un perito informático colegiado. Por tanto, cuando un perito informático se enfrente a la realización de un peritaje informático sobre la autenticidad de determinadas conversaciones mantenidas a través de WhatsApp, deberá realizar un profundo análisis forense de todos los elementos a su alcance para dictaminar si las conversaciones son o no auténticas.