¿Se puede hackear la Bip!?

El primer intento

A principios del 2014, con un amigo se nos ocurrió investigar cómo funcionaban las tarjetas Bip!. Él es ingeniero eléctrico picado a computín (ahora se dedica al software), yo computín con inclinación por la electrónica.

Tenía un par de Raspberry Pi (obvio) y compré un módulo NFC (creo que era este) para empezar a jugar.

La Bip! (que en realidad era un rebranding de la tarjeta multivía del metro) es una tarjeta con chip MIFARE Classic de 1KB. Básicamente es un espacio de memoria de 1KB, dividida en 16 sectores de 4 bloques de 16 bytes cada uno, donde el último bloque de cada sector especifica las llaves criptográficas del sector (2 llaves A y B de 48 bits c/u por sector) y la configuración de cada bloque (ej: la llave B tiene permiso de sólo lectura; o la llave A sólo puede disminuir el valor de un número). 

La comunicación va encriptada (con un sistema propietario “crypto1”, spoiler alert: no por nada se dice en los círculos de ciencia de la computación “never roll your own crypto”, un corolario de la ley de Schneier). Y en ese entonces no se conocía demasiado el sistema como para romper las llaves. El protocolo no era público y sólo existían implementaciones en hardware (en el mismo chip, no en código).

La multivía del Metro, usada en 2003 y ahora guardada en las mazmorras de la memoria

Pero obviamente alguien con habilidades y dedicación se puso las pilas con la ingeniería inversa y publicó una implementación en software (le llamó crapto1, adivinen por qué). En el proceso descubrió que el protocolo crypto1 tenía una vulnerabilidad grave: conociendo al menos una de las llaves, podías iterativamente extraer un byte de otra llave. Y así sucesivamente podías terminar de extraer todas las llaves completas, obteniendo las llaves del reino, o sea, poder modificar todo el contenido de la tarjeta. 

Otro grupo tomó parte de ese trabajo y publicó mfcuk (MIFARE Classic Universal Toolkit) y mfoc (MIFARE Offline Cracker), que empaquetan estas vulnerabilidades en programas autocontenidos que hacían mucho más fácil aprovecharlas y ejecutarlas en la práctica.

Pero no conocíamos ninguna de las llaves de la Bip!. No usaba ninguna de las default o las más comunes como 0xffffffffffff, que viene de fábrica en las tarjetas nuevas, 0xd3f7d3f7d3f7 o 0xa0a1a2a3a4a5, que son parte de la aplicación de chips MIFARE, como tags NDEF, u otras que circulan por internet de distintas aplicaciones

Empezamos a buscar cualquier tarjeta que pareciera NFC y las leíamos, la mayoría usaba alguna de las llaves default en al menos uno de los sectores, y con eso sacábamos las otras. Tarjetas de acceso, estacionamiento, bibliotecas, casi todas eran MIFARE Classic. Todavía no aparecían en Chile las tarjetas de crédito EMV contactless (que es otra bestia mucho más segura, pero todavía le siguen encontrando vulnerabilidades, como este ejemplo, por eso no es mala idea tener una billetera con bloqueo de RFID/NFC). Las tarjetas de débito de varios bancos venían con una Bip! integrada, pero tampoco logramos nada. Hasta las credenciales de algunas universidades servían como Bip!, y también para la biblioteca o para entrar a algunos edificios, incluso algunas decían el nombre en una pantallita al pasar por el torniquete de la biblioteca. 

Esto nos dio esperanzas: las Bip! tienen capacidad de 1KB pero en la práctica son como 700 bytes usables, en los que tienen que guardar el saldo, información de los últimos viajes para poder hacer combinaciones gratis o con pasaje reducido, información sobre convenios (pase escolar, adulto mayor, etc.). Probablemente las tarjetas de universidades, para poder guardar información extra, usaban chips de 4KB que eran compatibles con los otros pero con el cuádruple de memoria. 

Y claro, probamos con las tarjetas de un puñado de universidades, y una de ellas usaba alguna de las llaves default en los sectores adicionales. Con esto teníamos un pie adentro. Luego pudimos extraer las otras llaves, incluidas las de los primeros 16 sectores. Probamos esas llaves con otra Bip! y para nuestra sorpresa… ¡funcionaron! (en realidad no fue para nada sorpresivo)

Con eso listo ya podíamos leer las tarjetas. Analizando la configuración de las tarjetas, también podíamos escribirlas enteras, excepto el sector 0, que tiene un número único del chip. Spoiler: hay unas tarjetas alternativas compatibles chinas en las que se puede cambiar también. Pero no sabíamos qué significaba nada de lo que estaba en la tarjeta. Así que partimos a comprar unas pocas tarjetas, a cargarlas con distintos montos, y de vuelta a la casa a leerlas, y ver si nos calzaban algunos de los números. 

Pudimos adivinar cómo se guardaba el saldo. Después cada día volvíamos a leerlas y ver qué bytes cambiaban cuando las usábamos. Era una lata porque teníamos que hacerlo en la casa o en la oficina conectados al computador. Por supuesto, ahí llegaba el Raspberry Pi al rescate:

Con esto íbamos a darnos vueltas en micro y metro, nos bajábamos a las dos cuadras o a la siguiente estación y partíamos de vuelta, leyendo cada vez que pasábamos por un validador o cargábamos las tarjetas, y quedaban todas guardadas en el Raspberry Pi. 

Después con toda esa información recolectada nos sentábamos a analizar los datos. Además del saldo encontramos que se guardaba la fecha y hora de cuando empezabas un viaje, para calcular hasta cuándo podías combinar gratis. Y se guardaban los últimos 3 viajes y las últimas 3 recargas. Y también otros datos que nunca adivinamos qué significaban, pero parecían variar si andabas en metro, o en micros troncales, o alimentadoras (¿se acuerdan de esas? Flashback al 2007).

Después empezamos a probar cambiando cosas: ¿se podía llegar y cambiar el saldo no más? ¿O generar una transacción de carga? La respuesta es sí. Se podía modificar el saldo (el máximo era $65536: pregúntenme cómo lo descubrí), y todo funcionaba como esperabas. 

Probamos las tarjetas cargadas a la mala en micros, metro, y todo funcionaba. Vale decir que por cada viaje con tarjeta cargada a la mala, cargábamos otra, para no robarle a nadie. Pero unos días después al usar una tarjeta modificada, el validador nos dice: tarjeta bloqueada. Resulta que cada cierto tiempo acumulan la información de las transacciones y si algo no cuadra se decide bloquear la tarjeta. Y se distribuye una “lista negra” de tarjetas bloqueadas para que cualquier validador que las vea, las bloquee (sobreescribe todos los datos, cambia las llaves, y configura la tarjeta de tal modo que no se puede volver a escribir, como un botón de autodestrucción).

Ya habíamos satisfecho nuestra curiosidad. Aprendimos mucho, y preparamos un mini informe para reportar las vulnerabilidades, pero al final no lo mandamos a nadie por las historias de horror de otros hackers white hat chilenos que habían terminado en problemas por reportar vulnerabilidades de buena voluntad. Y hasta ahí quedó todo. Tipo febrero o marzo de 2014, hicimos un salud por los descubrimientos y pasó al libro de las anécdotas para contar en las fiestas. 

Era una buena historia para conquistar a alguien, hay que decirlo: “Hey, ¿sabías que el protocolo crypto1 que usan las Bip! tiene una vulnerabilidad de timing que permite filtrar las llaves un byte a la vez, midiendo cuánto se demora en responder a comandos autenticados?”

No podía fallar.

Sin relación con nuestros experimentos, en octubre de ese año las vulnerabilidades fueron noticia, porque alguien publicó una app para celulares Android con NFC que permitía cargarlas gratis:

La era del Flipper Zero

Era 2020, plena pandemia. El 30 de julio un grupo de nerds lanza un Kickstarter buscando financiamiento para el Flipper Zero: algo entre un tamagotchi y una herramienta para hackers. En 8 minutos alcanzaron su objetivo inicial de 60.000 USD, y al final terminaron juntando casi 5 millones de dólares.

El Flipper Zero

¿Qué es? Es un dispositivo de bolsillo, con una pantalla y botones, que muestra un delfín muy tierno. Pero en realidad es una multi-herramienta programable para hackers. Tiene RFID, NFC, Bluetooth, una radio Sub-GHz, sensor y transmisor infrarrojo, entre otros, y además es expandible con módulos adicionales que pueden agregar Wi-Fi, GPS, o lo que seas capaz de imaginar. 

Y todo eso… ¿para qué sirve? Puedes recibir las señales del control remoto de la TV o del aire acondicionado. O del portón automático de tu edificio. O leer el microchip de tu perro. O tu tarjeta Bip!. Pero no sólo eso, también puedes clonar ese control de la TV, o tu portón del edificio, o modificar el contenido de tu Bip!. O lo que te imagines si tienes las ganas, y sabes programar un microcontrolador en C. Todo el software es open-source, es decir, está disponible para examinarlo y modificarlo a tu gusto.

Y bueno, obvio que tuve que comprar uno. Era mi deber moral. Me imagino lo fácil que habría sido todo el proceso de recolectar datos y hacerle ingeniería inversa a las Bip! si hubiera tenido este juguete herramienta. Lo primero que hice cuando me llegó fue acercarle una y ver si podía leerla… y me llevé la sorpresa (o no tanto) de que la pudo leer y desencriptar a la primera, ya tenía las llaves pre-cargadas. Claro, han pasado muchos años, y en la comunidad de hackers ya han recolectado las llaves de muchas tarjetas en el mundo, y el Flipper tiene un diccionario con muchas de esas, incluidas las de la Bip!. Pero no era muy útil, todo lo que podías ver era algo como:

💡
...000000000000000000000000000000F5
1C0200C0E3FDFF3F1C0200C021DE21DE
1C0200C0E3FDFF3F1C0200C021DE21DE...

Y eso no dice mucho. 

Pero en realidad lo dice todo: ya había pasado por esto hace años, y podía interpretar que 1C0200C0 en esa posición significaba que tenía un saldo de $540, pero no era muy amigable. Nada de amigable comparado con el delfín-tamagotchi que estaba usando para leer la tarjeta. Un par de horas después, recurriendo a los oxidados conocimientos de programar microcontroladores en C, ya había escrito un plugin para decodificar todo lo que sabía de la Bip!: saldo, viajes y recargas, tiempo para hacer combinaciones, etc., y lo mostraba en la pantalla en texto legible. 

Y gracias a la magia del open-source, y una ronda de limpieza para que el código no fuera una vergüenza, lo mandé en un Pull Request, y ya es parte de lo que será la próxima versión del software oficial del Flipper (desde 0.99.0 en adelante, ya disponible para instalar como release candidate a la fecha de publicación).

Fue muy, muy fácil

Y al alcance de la mano están las funciones de escribir datos en la tarjeta. No cuesta nada agregar un menú para editar el saldo y escribirlo a la tarjeta. O mejor nos olvidamos de la tarjeta completamente, y hacemos que el mismo Flipper simule ser una Bip! cuando lo acercamos al validador. Como ya descubrimos el 2014, en algún proceso de cuadratura de cuentas, se detectan las tarjetas con carga fraudulenta y se bloquean, pero el Flipper no tiene por qué seguir las reglas: podría presentarse como una tarjeta distinta cada vez. Y como pase escolar, para hacer las cosas más entretenidas.

Pero no es la idea. Por los ~200 USD que vale el Flipper con sus costos de importación y todo, podría pagar mi pasaje por un buen tiempo. Y muchísimo más si le pongo valor a las horas invertidas. Y esto creo que resuena con gran parte de la comunidad hacker alrededor del Flipper: la motivación es la curiosidad intelectual, el aprendizaje, y el descubrimiento ¿Es posible robar los pasajes de la micro con esto? Sí, pero la idea no es hacerlo, sino demostrar que se puede hacer para advertir sobre la falta de seguridad de algunas tecnologías que son bien antiguas y simples. Como el día que descubrí, a mis 11 años, que el candado de mi alcancía se podía abrir con un clip. Los fundadores de Flipper Zero buscan que entregue conciencia de cuándo algo no es seguro, para que los creadores lo arreglen o tengas cuidado si lo usas. 

A pesar de lo explícitos que han sido los creadores del Flipper con cuál es su misión, ha causado harto ruido. En Amazon ya no se puede comprar y en Canadá llegaron a prohibirlo porque podría ayudar en el robo de autos (puedes abrir algunos a distancia clonando el control de la alarma). Pero también puedes lograr lo mismo con un Raspberry Pi y un módulo de radio o con un buen golpe a la ventana, o sacándole silenciosamente las llaves a alguien de su bolsillo. ¿Por eso van a prohibir el Raspberry Pi, los martillos o los encuentros entre desconocidos en un estacionamiento? Según expertos en seguridad que hablaron con el medio canadiense CBC, la respuesta es que prohibir el Flipper no haría ninguna diferencia, así que ojalá el delfín no se extinga por culpa de las prohibiciones. 

Décadas atrás, Wozniak y Steve Jobs diseñaron un blue box: una caja que replicaba el tono de 2600 hertz para hacer llamadas ilegales de larga distancia gratis. Ese fue el inicio de una alianza histórica que llevó a que se fundara Apple. Esperamos que Flipper Zero también pueda ser algo parecido, “el inicio de alguna gran amistad”, como decían en Casablanca.