Shared Preferences y SQLite en Android ¿Seguridad? (I de III)

Antes de empezar con estas entradas me gustaría dejar claro que en ningún momento se debería usar esta información para realizar ninguna acción ilegal, como modificar fechas de expiración de aplicaciones, leer datos privados ni obtener claves de seguridad privadas de terceros. Publico estas entradas sólo con el ánimo de enseñar los problemas de seguridad que nos pueden traer asociados el desarrollar nuestras aplicaciones con un método de almacenamiento de datos determinado y el poco cuidado que ponen ciertos desarrolladores de aplicaciones a la hora de tratar datos tan sensibles como las claves públicas y privadas de nuestro servicio de almacenamiento en la nube «supuestamente» seguro, o el crear un sistema de licenciamiento de aplicaciones basado en almacenar la fecha de expiración en el propio dispositivo en lugar de hacerlo en servidores en la nube del propio desarrollador o con algún método más eficaz, como cifrando de algún modo dichos datos.

Hecha esta aclaración, insisto en que cada uno es responsable de la aplicación que le dé a esta información y que quede constancia de que puede estar incurriendo en acciones ilegales.

Siguiendo con las entradas de dicadas a Android, esta vez os voy a hablar de las «Shared Preferences».

Ya os dejé claro en el primer post sobre Android, que no soy ningún experto en el tema, así que podéis encontrar alguna información que sea incorrecta. Agradeceré cualquier comentario al respecto para hacer la entrada lo más fiable posible.

Cuando desarrollamos una aplicación en Android, tenemos distintas maneras de almacenar la información que nuestra aplicación necesita. Según la guía de desarrolladores de Android, las opciones que tenemos son las siguientes:

  • Shared Preferences: Almacenamiento privado en parejas «clave-valor».
  • Almacenamiento Interno: Almacenar los datos privados en la memoria del dispositivo.
  • Almacenamiento Externo: Almacenar los datos públicos en el almacenamiento externo.
  • SQLite: Almacenar los datos en una base de datos SQLite privada.
  • Conexión de Red: Almacenar los datos en una web o nube en nuestro propio servidor.

Si utilizamos «Shared Preferences» en nuestra aplicación, las parejas clave-valor serán almacenadas en un archivo XML dentro de nuestro dispositivo, pudiendo elegir al desarrollar la aplicación si el archivo será accesible sólo por nuestra aplicación o puede ser accedido también por otras aplicaciones y compartir los datos.

El problema de seguridad que se nos presenta con éste método es, que siendo «root» del dispositivo, podemos tener acceso a dichos archivos XML de las aplicaciones y poder leer y modificar los datos almacenados en ellos. A simple vista no parece un fallo grave de seguridad, pero si lo analizamos más profundamente nos daremos cuenta de que podemos modificar, por ejemplo, una fecha de expiración de una aplicación que un desarrollador descuidado ha guardado ahí sin cifrar u ofuscar de algún modo, leer los mensajes de WhatsApp almacenados en la base de datos SQLite del dispositivo (sí, eso que todo el mundo pregunta cómo se puede hacer) y acceder a los archivos multimedia guardados en los servidores de WhatsApp (ya que tenemos las rutas URL de cada unos de los archivos enviados y recibidos en dicha base de datos SQLite), así como sacar claves públicas y privadas de Mega, por ejemplo (esas que te permiten descifrar cualquier archivo de Mega que te pertenezca y cifrarlos como si fuesen tuyos) que se quedan almacenadas en el archivo XML en texto plano. ¿Tal vez activar una opción de una aplicación que sólo es accesible desde la versión de pago? Si está almacenada en las Shared Preferences, tal vez sólo hay que sustituir un «false» por un «true» para que esté accesible para nosotros también…

En esta primera entrada sobre «Shared Preferences» nos centraremos en explicar el funcionamiento de una de las muchas aplicaciones que nos permiten acceder a los datos y cómo podemos modificarlos de una manera muy sencilla. La aplicación se llama «Hack App Data» de SteelWorks, disponible gratuitamente desde Play Store.

La necesidad de ser «root» del dispositivo es porque a priori, los archivos están almacenados dentro de las carpetas de sistema, y no son accesibles por exploradores que no tengan permisos de superusuario (otra excusa más para probar a rootear nuestro dispositivo).

Si somos «root», no hace falta ni siquiera buscar el archivo y exportarlo a un PC, ya que con las citadas aplicaciones podemos acceder desde el propio dispositivo a todos los archivos XML de todas las aplicaciones que tenemos instaladas (tanto aplicaciones de Usuario como aplicaciones de Sistema)  y modificar sus valores directamente.

Una vez instalada y ejecutada dicha aplicación, nos aparece una pantalla donde podemos elegir de qué tipo de aplicaciones queremos mostrar los archivos XML. Podemos escoger entre aplicaciones de usuario o aplicaciones de sistema.

imagen1 imagen2 imagen3

Dentro de las aplicaciones de sistema encontraremos el calendario, la propia Play Store, Gmail, Contactos, Aplicación de Teléfono, Galería… y todas las aplicaciones que vienen integradas en el sistema operativo del teléfono o tableta.

Si optamos por las aplicaciones de usuario, encontraremos todas las aplicaciones que hayamos descargado e instalado que no forman parte del propio sistema operativo.

Seleccionamos una de las aplicaciones pulsando sobre ella y nos aparecerá una nueva pantalla con los datos básicos de la aplicación: nombre, nombre del paquete instalado, tamaño, fecha de instalación…

imagen4 imagen5 imagen6

Seleccionando el botón «Preference» que se encuentra al pie de la pantalla, podremos ver todos los registros que almacena la aplicación en las citadas «Shared Preferences».

Si seleccionamos el botón «Database» y la aplicación tiene una base de datos SQLite donde almacenar datos, nos aparecerá una pantalla con todas las bases de datos que utiliza.

Seleccionando una base de datos concreta, nos aparecerá una nueva pantalla con las tablas que contiene dicha base de datos, y seleccionando una tabla, nos aparecerán los registro propiamente dichos.

imagen8 imagen9

Comentar que los registros de la base de datos SQLite no son editables desde esta aplicación, pero podemos encontrar muchas gratuitas en el propio Play Store que nos permiten gestionar las bases de datos de este tipo.

Y pasamos a la parte que nos ocupa en esta entrada del blog, seleccionar las «Shared Preferences».

Desde esta pantalla sí que podremos pulsar sobre una pareja clave-valor y editar su contenido, pudiendo guardarlo directamente en el dispositivo.

imagen7 imagen10

Sólo habría que pulsar sobre el botón «Save» para que los cambios se guardasen en el archivo en cuestión, y que la aplicación en la siguiente ejecución tomase el nuevo valor editado.

¿Y si cambiamos el valor de una pareja clave-valor almacenada que se llama «expiry» y tiene por valor 1397656370 (Epoch Time Linux)? ¿Si cambiamos el primer 1 por un 5 por ejemplo? Podéis probar por vosotros mismos pero probablemente la aplicación en lugar de «expirar» en 2014, expiraría en 2141.

Hasta la próxima, saludos.

¿Y si usamos nuestro teléfono para algo más?

Para continuar con el blog, he decidido hacer unas entradas relacionando mis asignaturas con los dispositivos Android, y viendo como nos pueden aportar soluciones para sistemas, así como para descubrir y explotar fallos de seguridad.

Dejar claro que no soy ningún experto en Android, y que seguro que se me escapará alguna que otra cosa que no es correcta, pero seguro que podréis perdonarme.

En esta primera entrada, relacionaré Android con Sistemas. Para ello os voy a hablar sobre la aplicación «DriveDroid» de Softwarebakery (se puede descargar gratuitamente desde Play Store). Antes de seguir leyendo, un apunte. Hay que ser «root» para poder utilizarla (otro motivo más para animaos a rootear vuestro dispositivo).

Lo que nos permite básicamente esta aplicación es convertir nuestro dispositivo Android en un disco de arranque USB. Nos permite emular una unidad USB externa (en modo sólo lectura como en modo lectura/escritura) o incluso una unidad de CD USB externa, para montar ISOS de CD directamente sin tener que convertir la imagen a USB Bootable. También nos permite crear una unidad USB vacía para almacenar lo que necesitemos (pero almacenando el contenido dentro de un archivo de imagen, no dentro del sistema de archivos del dispositivo, para poderla grabar posteriormente en CD, por ejemplo).

Sobra decir, que el teléfono deberá contar con un gran almacenamiento interno o si no con una buena tarjeta SD, ya que tenemos que almacenar las ISOS directamente en el dispositivo (y pueden ocupar desde unas cuantas MB hasta unas cuantas GB).

¿Y para qué quiero yo una aplicación que me emula una unidad USB externa? ¡Si cuando lo enchufo por USB ya puedo pasar las fotos del dispositivo al teléfono!

Pues bien, imaginemos un caso como el siguiente. El ordenador, no arranca. Nos aparece un error en el arranque de que Windows se ha corrompido y necesitamos acceder al ordenador para salvar los datos. Podríamos arrancar con una ISO de Linux desde nuestro dispositivo Android y utilizarlo para acceder a los discos duros y salvar los datos. ¿Necesitamos instalar una distribución Linux o Windows? Podemos instalarlo directamente desde nuestro dispositivo Android. ¿Office? También… ¡Todo lo que sean ISOS y queramos ejecutar directamente! ¿Necesitas un disco USB para almacenar datos, pero no quieres que estén en el sistema de archivos de Android mezclados con los demás contenidos? Creamos una unidad USB vacía y nos almacena el contenido como una imagen (que luego podemos usar para grabar a CD por ejemplo). Y todo esto sin tener que llevar los CD’s siempre encima o nuestro disco USB de almacenamiento externo.

La configuración de la aplicación es bastante sencilla, ya que a no ser que queramos seleccionar alguna opción concreta (que veremos más adelante), se realiza mediante un pequeño «wizard».

Una vez instalada, accedemos a ella. Lo primero que nos solicitará es si queremos comprobar si nuestros dispositivo se encuentra en una «black list» que la propia aplicación tiene con dispositivos con problemas de compatibilidad conocidos. Simplemente pulsando sobre el botón de comprobar, nos informará de si estamos listados o no. Decir que en todos los dispositivos que lo he probado, nunca han estado listados como incompatibles, aunque si es verdad que según el dispositivo sólo nos dará la opción de unidad USB o unidad USB + unidad USB de CD (incluso dependiendo del dispositivo, nos dará la opción de montar 2 unidades a la vez).

Acto seguido nos preguntará sobre el modo USB que queremos utilizar cuando conectemos nuestro dispositivo por cable USB al ordenador (por si queremos seguir teniendo las opciones de depuración habilitadas mientras tenemos la unidad montada, por ejemplo). Simplemente aceptando todas las configuraciones, debería funcionar sin problema. Más adelante os presentaré qué opciones se pueden modificar.

Ya está todo listo. ¿Cómo consigo las imágenes necesarias? Tenemos dos métodos. Copiamos la ISO que queramos dentro de la carpeta de imágenes mediante cable USB, WiFi… Una vez copiada, nos aparecerá en la lista de imágenes disponibles. No hace falta nada más. ¿Queremos alguna distribución Linux o de sistema de recuperación bootable? No hace falta descargarla en el PC y copiarla, la propia aplicación nos trae unos repositorios configurados desde donde podemos descargar muchas distribuciones, preparadas para su uso sin nada más que hacer. Descargar y utilizar.

Os pongo un listado con las distribuciones Linux, sistemas de recuperación y multimedia que se pueden descargar directamente desde su repositorio, por si consideráis que son pocas o no hay ninguna que os pueda interesar…

  • AlphaOS
  • Arch Linux
  • BBQLinux
  • Clonezilla
  • Debian
  • Elementary OS
  • Fedora
  • FreeBSD
  • FreeDOS
  • Fuduntu
  • GeeXboX
  • Gentoo
  • GParted
  • Grml
  • Kali Linux
  • Kubuntu
  • Linux Lite
  • Linux Mint
  • Lubuntu
  • Mageia
  • Manjaro
  • OpenSUSE
  • Ophcrack
  • Peppermint
  • RebeccaBlackOS
  • RIPLinux
  • SliTaz
  • SystemRescueCD
  • Tails
  • Tiny Core Linux
  • Trisquel
  • UbertStudent
  • Ubuntu
  • Voyage Linux
  • XBMCbuntu
  • Xubuntu
  • Zorin OS

Como veis, tenéis donde elegir (sí, habéis leído bien XBMCbuntu, Kali Linux… ¿interesantes?).

Una vez tenemos las imágenes preparadas en el dispositivo, simplemente pulsamos sobre una de ellas y nos aparecerá el menú de cómo queremos montarla (USB lectura, USB lectura/escritura o CD).

imagen2 imagen3

Como veis en un Samsung Galaxy S2, nos ofrece las opciones que os comento (las 3), pero si vemos otro dispositivo distinto, un Leotec Xenon 153, sólo nos ofrece la opción de USB (las imágenes funcionan igual, a no ser que requieras CD por algún motivo muy muy concreto).

Además dependiendo del dispositivo, podemos incluso montar 2 unidades simultáneamente. Dos unidades con dos ISOS distintas… Una ISO Live CD y una vacía de almacenamiento… y las combinaciones que necesitemos (como veis en las capturas, también depende de que el dispositivo lo soporte. Samsung SÍ, Leotec NO).

Pulsamos sobre la opción que queramos utilizar y ya está. Si tenemos el sistema operativo iniciado, nos aparecerá una nueva unidad (USB externo o CD) dentro de «Equipo». Si queremos arrancar con él, reiniciamos el equipo, entramos en la BIOS y seleccionamos arrancar desde la unidad de USB que nos aparecerá. Arrancamos el equipo y veremos cómo arranca nuestra distribución Linux o nuestro asistente de instalación de Windows, por ejemplo.

Ya podemos utilizar nuestro escritorio Live CD, montar los discos duros y recuperar archivos o instalar el sistema operativo que queramos desde nuestro dispositivo Android.

Sólo me queda mostraos el menú de opciones, que realmente es muy sencillo, así como las opciones que queremos utilizar mientras tenemos la aplicación corriendo (como mantener las opciones de depuración a la vez).

imagen4 imagen5

Para los que nos dedicamos a los sistemas, es un gran adelanto, ya que podemos llevar con nosotros nuestras distribuciones necesarias o preferidas sin tener que llevar CD’s todo el día encima. Las llevamos en un dispositivo que siempre llevamos con nosotros, nada más.

¡¡Sacar todo el partido a vuestros dispositivos Android y hasta la próxima!!