Enviando caracteres no representables en Android

Hace unos días Google anunció que no va a desarrollar más parches de seguridad para versiones inferiores a la 4.4 (Kitkat), en respuesta al último reporte de un grupo de investigadores independientes, quienes encontraron una vulnerabilidad en el módulo “WebView” que afectaba a versiones de Android inferiores a 4.4.

Al leer esta noticia me entró “el afán del investigador” y casualmente encontré algo muy curioso en los emoticonos de nuestra querida aplicación para Android, Whatsapp. Para explicar ese ”algo” tan curioso recurriré a diversas capturas de pantalla donde podréis observar de lo que os hablo. Al parecer existen ciertos caracteres que Android no interpreta y que por lo tanto no los puede renderizar en la pantalla.

Todo empezó cuando me dispuse a enviar unas cuantas banderas (emoticonos) al Whatsapp de un amigo:


Ilustración 1 – Primer envío de banderas

Como podemos observar, no hay un comportamiento extraño de la aplicación Whassap para Android, simplemente lo que vemos: varios emoticonos de banderas. No obstante trasteando un poco y al realizar un “backspace” en la primera bandera, obtuve lo siguiente:


Ilustración 2 – Nuevos caracteres

¿Interesante, verdad? Como podemos ver al realizar dicho “backspace” los restantes emoticonos de banderas cambiaron, representándose ahora como caracteres unicode. Este hecho me llevo a seguir realizando pruebas en busca de algo más… Así que continué con la búsqueda del carácter no representable, como podemos ver a continuación:


Ilustración 3 – Añadimos nuevas banderas

Tal y como vimos en la imagen anterior añadí emoticonos de banderas justo antes del último emoticono representado como una bandera. Posteriormente realicé un “backspace” en el segundo emoticono de bandera añadido en el paso anterior y obtuve lo siguiente:


Ilustración 4 – Segundo «backspace»

Posteriormente a esto, probé a escribir cualquier texto delante de la única bandera que quedaba con vida (XD), y para mi sorpresa, los caracteres empezaron a desaparecer como por arte de magia. En realidad, lo que sucedía es que la aplicación Whatsapp era y es incapaz de representarlos, así que copie esa parte y me dispuse a enviarla. Estos fueron los resultados:


Ilustración 5 – Mensajes vacíos

Digamos que ahora podía enviar mensajes a cualquier contacto sin que Whatsapp pudiese representar dichos caracteres en mi pantalla, algo que podría ser muy útil en determinadas situaciones. Sorprendido por ese hecho decidí ver qué caracteres se almacenaban en mi historial de conversaciones:


Ilustración 6 – Historial

Como podemos observar, mandamos en primer lugar un “hola”, en segundo lugar “que tal” y por último “yo estoy genial”. Además añade el signo de interrogación como la representación del carácter “desconocido”.
El mensaje se guarda correctamente en el historial de la aplicación de Whatsapp, además el contacto recibe el mensaje correctamente, no obstante no se renderiza en nuestro terminal, es decir el mensaje no aparece en la pantalla de nuestro terminal.

Para averiguar qué carácter es el que Android es incapaz de representar, tiramos de un programa muy conocido: “hexadump”, para analizar el contenido en hexadecimal del historial de la conversación de Whatsapp.


Ilustración 7 – Hexadump

Ahora procederemos a analizar cada par de caracteres hexadecimales para encontrar cuál es ese carácter “desconocido”:


20 3f 68 6f 6c 61 0a -> ?hola
20 3f 71 75 65 20 74 61 6c 3f 0a -> ?que tal?
20 3f 6f 20 65 73 74 6f 79 20 67 65 6e 69 61 6c 20 3a 29 0a -> ?yo estoy genial :)
0a = Salto de línea.

Como vemos, no pude obtener qué carácter era el “desconocido”, ya que directamente la aplicación Whatsapp no pudo ni puede interpretar dicho carácter, y por lo tanto no lo guardó en el historial de conversaciones de la aplicación. Probé a hacerlo de otra forma, aprovechando que los caracteres Unicode tienen un tamaño de 1 a 4 bytes; existía la posibilidad de que el teclado de virtual de Android tuviese algún tipo de “bug” que permitiese el borrado parcial y no total de ciertos caracteres.


Ilustración 8 – Fichas de domino

Efectivamente así fue :). Al parecer, existen ciertos emoticonos en la aplicación de Whatsapp para Android, que cuando realizas un “backspace” para intentar borrarlos, no lo haces por completo. Si a esto le sumamos que añadimos un nuevo carácter o emoticono, obtenemos cosas tan curiosas como las que vimos en la imagen anterior: caracteres Unicode que representan una ficha de dominó en este caso.

Ya solo me quedaba ver el código hexadecimal de dichos caracteres:


Ilustración 9 – http://unicode.org/charts/PDF/U1F030.pdf

Con lo que concluí que 1F0 es el código hexadecimal (incompleto, pares de 2 números) que la aplicación para Android no puede representar :), y que automáticamente genera cuando sobre determinados emoticonos se le aplica un “backspace”:


Ilustración 10 – Decodificador de hexadecimal

Después de este análisis, me di cuenta de que esto sucedía en todas las aplicaciones para Android por lo que deduje (o intuyo) que se trata de un bug/problema/feature no documentada en el teclado virtual de Android, que permite no borrar por completo ciertos emoticonos cuando se dispone a eliminarlos (backspace), formando una secuencia que codificada en hexadecimal es 1F0, imposible de representar (renderizar) en la pantalla del usuario que lo envía.

¿Qué es un “Exchange” y para qué sirve?

Seguramente hayamos oído hablar mucho acerca del “e-Money” últimamente, sobre todo tras la llegada del famoso Bitcoin. Actualmente podemos encontrarnos infinidad de monedas digitales, tales como: Bitcoin, Litecoin, Namecoin.

La moneda digital es un tipo de moneda alternativa que no depende de un banco central o entidades específicas, por lo tanto no está regulada por ningún gobierno, al menos de momento. Dichas monedas utilizan algoritmos criptográficos para regular la creación y la transacción. ¿Y para qué podemos usar este tipo de moneda? La respuesta puede ser todo lo amplia que queramos, pero sobre todo, lo que podemos comprar con este tipo de moneda son servicios. ¿Qué tipo de servicios? Pues depende de qué queramos, pero desde el punto de vista de un delincuente, se puede adquirir desde la contraseña de una cuenta de correo, hasta una red botnet adecuada a nuestras necesidades. Pues bien, entre estos servicios y el dinero real, existe una cosa llamada “Exchange”.

El propósito de un “Exchange”, cuyo funcionamiento se muestra en la siguiente imagen, es sencilla: cambiar de divisa. Imaginemos que un delincuente obtiene los datos de las tarjetas de crédito de una tienda online mediante un ataque, datos que no quiere utilizar para no delatarse. Para ello, recurre a un “Exchange”, por donde pasará el dinero hasta encontrar la forma de que se pierda la traza del mismo.

Por ejemplo, el delincuente puede comprar Bitcoins con los datos de las tarjetas , para posteriormente venderlos a otros usuarios, y magia, dinero 100% limpio. Otra opción que podemos observar en el diagrama anterior, sería vender esas tarjetas de crédito a otras personas, que se encargarían de realizar el mismo procedimiento.
Podemos encontrar páginas “Exchange” de todo tipo: de Paypal a Bitcoin, de tarjeta de crédito a Bitcoin, de Western Money a Payza, etc. Estos son algunos ejemplos:

¿Quién se esconde tras estos servicios de “Exchange”?

Personas que desean blanquear grandes cantidades de dinero, y que ven en servicios de “Exchange” un negocio seguro. En cuanto al funcionamiento interno de un “Exchange”, poco podemos decir; no es más que dinero que se cambia por otro dinero, un servicio bidireccional de blanqueo, entre el usuario y la empresa, TODOS GANAN.
Quizá esta sea una de las razones por las que está tan demandado el Bitcoin y las e-currency, básicamente porque es una moneda muy útil para los delincuentes.

¿Renovar nuestro viejo terminal? Sí, pero con cuidado

Recientemente, el Centro de Seguridad TIC de la Comunidad Valenciana (CSIRT-cv), ha publicado un “estudio desarrollado por AVAST”. Dicho estudio ha demostrado que fue posible recuperar datos de dispositivos de Android después de que estos hubiesen sido eliminados, incluso empleando la opción de “Restablecer datos de fábrica”.

En este post, veremos que medidas de seguridad debemos adoptar si tenemos pensado renovar nuestro terminal y vender el viejo. Estas son algunas de las medidas más significativas:

1º) No incluir nuestra vieja SD en la venta del terminal. Esto nos ahorrará muchos quebraderos de cabeza, ya que como todos sabemos a estas alturas, el contenido de una tarjeta SD o micro SD es recuperable.

2º) Mover el software instalado desde Google Play a nuestra tarjeta SD. De esta forma, todos los datos se guardarán siempre en nuestra tarjeta SD o micro SD.

3º) Encender nuestro terminal en modo recovery y formatear el terminal desde ahí. Este proceso, aunque puede parecer complicado, no lo es tanto. Hay varios métodos para poner nuestro terminal en modo recovery:

    a) Lo primero será apagar nuestro terminal. Una vez apagado, mantendremos pulsados simultáneamente el botón “encendido” y el botón “bajar volumen” durante unos segundos. Tengamos en cuenta que la combinación puede variar, y si esta no funciona probad con encendido + volumen arriba o encendido + las dos teclas de volumen. Hay variaciones dependiendo del dispositivo. A continuación nos debería aparecer una lista con opciones y entre ellas escogeremos la opción recovery.

      Debería salir algo parecido a la ilustración 1, más tarde debemos buscar la opción wipe data factory reset, y debería aparecer algo como lo siguiente :

      Una vez acabe el proceso, ya tendremos nuestro terminal formateado.
    b) Si con el método anterior, no somos capaces de acceder al modo recovery, tenemos otra opción más simple de acceso. Si nuestro terminal está rooteado, simplemente tenemos que descargarnos la siguiente app:

    Una vez reiniciado, simplemente tenemos que seguir el 2º paso.

    c) Por último, si no podemos acceder al modo recovery con los métodos anteriormente descritos, tenemos otra opción, un poco más complicada pero infalible.
    En primer lugar, necesitaremos acceso a un PC. Tenemos que descargar el Android SDK, e instalaremos el siguiente software, Android Debug Bridge:

    Dentro del ADB entraremos en la carpeta Platform Tools, y mientras pulsamos el botón “Mayus” clicaremos con el botón derecho de nuestro ratón. Escogeremos la opción “Abrir ventana de comandos Aquí“. En la ventana que aparecerá escribiremos lo siguiente:

    >>adb reboot recovery

    Una vez se haya reiniciado nuestro terminal, simplemente debemos de seguir el 2º paso.

    Ahora que sabemos cómo proteger nuestra información sensible, ya no hay excusa para no hacerlo.