Ya lo habéis oído todos: se ha descubierto una vulnerabilidad de Android que afecta al 99% de dispositivos y que permitiría a un atacante reemplazar ciertas APKs por un fallo en el sistema criptográfico y de actualizaciones.
Antes de seguir, vamos a pararnos un poco. Intentemos explicar para todo el mundo y sin omitir detalles qué es lo que realmente está pasando. Como siempre, vamos primero a las bases: exploremos las aplicaciones de Android, por qué van firmadas y cómo se actualizan.
¿Quién puede actualizar aplicaciones?
Cualquiera mínimamente familiarizado con Android sabe que las aplicaciones están empaquetadas en archivos APK: básicamente, un archivo ZIP con el ejecutable (podríamos decir que es como si fuese un .EXE), información y recursos e imágenes de la aplicación.
Android tiene todas las aplicaciones de vuestro teléfono en archivos APK en el sistema. A la hora de actualizar una aplicación, la cosa es sencilla: reemplazamos el APK viejo con el nuevo . Puede que haga más tareas, pero esto es lo principal.
Ahora bien, hay un problema potencial: ¿qué pasa si el APK nuevo no es del mismo desarrollador? Por ejemplo, ¿qué debería hacer Android si tú creas una actualización de Gmail y quieres instalarla sustituyendo la que ya tienes? La respuesta obvia es que no debería dejarte. Android sólo permite actualizaciones en las que el APK nuevo ha sido creado por el mismo que creó el APK viejo. Para ello usa un proceso llamado firma criptográfica.
En qué consiste la firma de un APK
Plantearos que la firma criptográfica es como sellar un papel. Sólo tú tienes ese sello, y si alguien escribe algo más en el papel tendrá que hacerlo por encima del sello (usad la imaginación), de tal forma que sabrás que se ha modificado.
El proceso más técnico, pero simplificado, es el que sigue:
- Obtenemos la huella digital del APK. Esta huella o hash es como tu huella dactilar: es única para ese APK y no se repite (teóricamente). Si algo cambia, el _hash_ cambia también.
- Ciframos el _hash_ con la clave privada del desarrollador. Esta clave sólo la tiene él y no la comparte con nadie más, por algo es privada. Ese hash cifrado es la firma digital.
Vayamos ahora a la parte de verificación de la firma:
- Recibimos la firma digital, y la desciframos con la clave pública del desarrollador.
- Calculamos el _hash_ del APK que hemos recibido y comparamos con lo que hemos descifrado de la firma digital. Si coinciden, la firma es válida.
Como el hash es único para cada APK, nos aseguramos de que el paquete no se ha modificado desde que lo creó el desarrollador. Por otra parte, si un mensaje se cifra con una clave privada sólo se puede descifrar con la clave pública correspondiente; y con esa clave pública no podrás descifrar mensajes de ninguna otra clave privada. De esta forma que te aseguras que sólo ha podido ser el desarrollador quien ha creado el paquete.
Es decir, que tal y como está planteada la firma digital, es un certificado imposible de falsificar (como siempre, en teoría) que te asegura que el desarrollador fue el que creó esa aplicación y que nadie más la ha modificado.
A la hora de instalar la actualización, Android comprueba dos cosas: que la firma del APK sea válida y que la clave privada sea la misma con la que se firmó la versión anterior. Si el paquete se ha firmado con otra clave, el sistema lo reconocerá como una aplicación nueva y no sustituirá a la vieja.
Este método asegura que sólo el desarrollador original, y nadie más que él, puede crear actualizaciones para sus aplicaciones.
¿Dónde está la vulnerabilidad?
Una vez que ya sabemos perfectamente cómo se actualiza una aplicación de Android, veamos dónde se ha encontrado la vulnerabilidad. Bluebox no ha desvelado todos los detalles del fallo, ni cómo funciona ni cómo explotarlo. Sólo ha dicho dónde está y en qué consiste.
Se trata de un fallo en el sistema de verificación de la firma de las aplicaciones. Gracias a él, alguien podría modificar un APK de tal forma que la firma digital seguiría siendo válida. Por ejemplo, podría cambiar el APK de Gmail y Android seguiría pensando que no ha sido modificado desde que lo firmó Google al crearlo.
Una vez que podemos modificar los paquetes sin invalidar la firma, alguien podría introducir código malicioso en un APK conocido sin que el sistema lo detecte. Básicamente, pueden conseguir que instales una aplicación maliciosa disfrazada de aplicación conocida y confiable.
Un ejemplo de escenario de ataque: te envían un enlace diciendo que ha salido una nueva actualización de Google Maps. Descargas el paquete (un APK de Google Maps firmado por Google), te aparece el aviso preguntando si quieres actualizar, aceptas y listo. Android no detecta que en realidad ese paquete ha sido modificado y tiene un troyano que permitirá a un atacante obtener acceso a tu teléfono.
Al ser una actualización no necesita pedirte permisos: ya se los diste al instalar la aplicación original. Quizás no pase nada si instalas una actualización maliciosa de Angry Birds: al fin y al cabo no tendrá muchos más permisos que la aplicación original. Pero, ¿y si la actualización es para Gmail, por ejemplo? Tendrían acceso a todos tus correos, a Internet... Perfecto para montar una _botnet_ o para robar tus cuentas.
Incluso hay un esceneario peor: una actualización de una aplicación de sistema que tenga todos los permisos posibles. El atacante tendría acceso ilimitado a tu sistema mientras tú piensas que has instalado una actualización inocente para mejorar algún ajuste del móvil.
¿Cómo protegernos?
Este fallo afecta a cualquier tipo de aplicación de Android. La cuestión es cómo puede hacerte llegar el atacante esa aplicación modificada.
La recomendación es no instalar ninguna aplicación fuera de Google Play.
Para que te llegasen estas aplicaciones maliciosas a través de una actualización de Google Play, los atacantes deberían de haber entrado en los servidores de Google y enviado una actualización manualmente. No es precisamente una tarea fácil, así que podéis contar con que usar el mercado oficial de Android, Google Play, es seguro.
La única forma que nos queda es instalando aplicaciones de orígenes no oficiales: descargándolas de otros mercados con menos controles y seguridad, o simplemente haciendo un clic en una página web que descargue el APK.
En resumen: si queréis protegeros frente a esta vulnerabilidad, desactivad la opción de instalar las aplicaciones de orígenes desconocidos.
Google tiene difícil corregirlo
El fallo es grave. Se notificó a Google y demás fabricantes en febrero, pero sólo Samsung ha podido preparar un parche para su S4. Como afecta a casi todos los teléfonos desde Android 1.6, y teniendo en cuenta el ritmo de actualizaciones de Android, un buen número de teléfonos se van a quedar con él para siempre.
Muchos usuarios poco experimentados pueden caer en la trampa de confiar en estas actualizaciones, ya que pueden parecer totalmente legítimas y no resultar tan extrañas como un juego de pinball que pide acceso a tus SMS. Incluso podrían caer usuarios más avanzados: con distribuir enlaces de "Nueva versión filtrada de Gmail para Android" valdría para infectar un buen número de teléfonos de gente que conoce perfectamente el sistema.
Con fallos como este, cada vez se hace más necesaria una vía de actualizaciones rápidas por parte de Google y los fabricantes. Al menos a mí no me parece serio que una gran parte de los móviles con Android se vayan a quedar con un fallo grave de seguridad porque no puedan actualizarse a siguientes versiones del sistema.
Ver 28 comentarios