Cómo hackear un auto con vulnerabilidades de Remote Keyless Entry (RKE)

Los sistemas Remote Keyless Entry (RKE) son básicamente controles remotos de radio capaces de hacer que un automóvil abra o cierre sus puertas e incluso arranque el motor.

Siempre he encontrado que la seguridad cibernética es más interesante cuando las implicaciones se reflejan en el “mundo real” y esta es la razón por la que hackear dispositivos físicos es divertido para mí. Bueno resulta que cuanto más controvertido es el truco, ¡más divertido es llevarlo a cabo! Por esta razón me metí en el hackeo de dispositivos controlados a distancia y en particular en el hackeo de controles remotos de automóviles. Hace un tiempo obtuve todo el hardware necesario para intentar atacar estos dispositivos, por lo que finalmente pude intentar algunos ataques.

En este artículo quiero compartir la teoría de cómo funcionan estos dispositivos cuáles son sus debilidades y cómo podemos explotarlas tanto en la teoría como en la práctica.

Antes de comenzar, unas palabras de nuestro patrocinador: su sentido de la ética .
Todos sabemos que hackear a otras personas sin su permiso es malo pero entrar en el vehículo de alguien sin su permiso es REALMENTE malo. Entonces utilice la información que obtiene de este artículo para aprender cómo funcionan estos sistemas y no por razones poco éticas, ¿de acuerdo?

Cómo hackear un auto abierto (en teoría)

Los sistemas RKE o Remote Keyless Entry son lo que comúnmente se conoce como llaveros o controles remotos para automóviles. En pocas palabras, se trata de un radiocontrol capaz de hacer que un coche realice acciones como abrir o cerrar las puertas, la cajuela, etc. El funcionamiento de los mandos a distancia del coche es bastante sencillo: generan una señal de radio que contiene un código de autenticación y unos bits que representan el comando que debe ejecutar el coche, el coche lo recibe y si se puede validar el código de autenticación, el coche ejecuta el comando, es ¡simple! ¿O es eso?

Códigos fijos y ataques de repetición.

Como se mencionó hay dos partes de un código enviado por un control remoto: un código de autenticación y un código que representa el comando que se ejecutará. Los automóviles solían tener un código de autenticación único asociado con ellos y la llave enviaba dicho código junto con un código de comando para hacer que el automóvil realizara una determinada acción. La siguiente imagen muestra cómo funciona la comunicación:

Esquema de trabajo de código fijo

Este sistema se denomina sistema de ” código fijo ” ya que el código de autenticación único nunca cambia. Este sistema es trivial de implementar pero tiene una vulnerabilidad importante: es vulnerable a los ataques de repetición . Esto se traduce en el hecho de que un atacante podría colocar un receptor de radio cerca de un automóvil y capturar la señal de radio enviada por el control remoto del automóvil cuando el propietario lo opera. Una vez que se captura la señal, simplemente se puede reproducir y el automóvil se abriría. Puedes ver un ejemplo en la siguiente imagen:

Ataque de repetición de código fijo

Si bien requiere herramientas especializadas, el ataque es relativamente fácil de realizar con éxito y también se puede lograr con hardware extremadamente económico. Tenga en cuenta que si bien los automóviles ya no usan este mecanismo algunos dispositivos más simples todavía lo hacen (puede encontrar un análisis de uno de estos controles remotos aquí ).

Ataques de fuerza bruta a códigos fijos

En aras de la exhaustividad, vale la pena mencionar que, si se conoce el arquetipo de la señal (modulación, longitud del código, presencia de preámbulo/bits finales, …) sería posible recuperar el código fijo a través de un ataque de fuerza bruta . Dependiendo de la longitud del código y del hardware utilizado, puede ser más o menos práctico realizar este ataque.

En lugar de un ataque de fuerza bruta “sin procesar”, potencialmente podría ser mucho más rápido aplicar fuerza bruta al código usando una secuencia De Bruijn .

Una secuencia de De Brujin es el flujo de bits más corto que contiene todos los códigos posibles de una cierta longitud a partir de un alfabeto específico. Un ataque ordinario de fuerza bruta requiere que el atacante envíe códigos incrementales secuencialmente intentando todos los códigos posibles de manera exhaustiva, usando una secuencia De Brujin es posible generar un flujo de bits que contendrá todos los códigos posibles en el alfabeto una vez y solo una vez.

Para facilitar la comprensión de este ataque, aquí hay una representación práctica de una secuencia de De Brujin:

   {0 0 0 0} 1 1 1 1 0 1 1 0 0 1 0 1
    0 {0 0 0 1} 1 1 1 0 1 1 0 0 1 0 1
    0 0 {0 0 1 1} 1 1 0 1 1 0 0 1 0 1
    0 0 0 {0 1 1 1} 1 0 1 1 0 0 1 0 1
    0 0 0 0 {1 1 1 1} 0 1 1 0 0 1 0 1
    0 0 0 0 1 {1 1 1 0 } 1 1 0 0 1 0 1
    0 0 0 0 1 1 {1 1 0 1} 1 0 0 1 0 1
    0 0 0 0 1 1 1 {1 0 1 1} 0 0 1 0 1
    0 0 0 0 1 1 1 1 {0 1 1 0} 0 1 0 1
    0 0 0 0 1 1 1 1 0 {1 1 0 0} 1 0 1
    0 0 0 0 1 1 1 1 0 1 {1 0 0 1} 0 1
    0 0 0 0 1 1 1 1 0 1 1 {0 0 1 0} 1
    0 0 0 0 1 1 1 1 0 1 1 0 {0 1 0 1}
    0} 0 0 0 1 1 1 1 0 1 1 0 0 {1 0 1 …
… 0 0} 0 0 1 1 1 1 0 1 1 0 0 1 {0 1 …
… 0 0 0} 0 1 1 1 1 0 1 1 0 0 1 0 {1 …

En este ejemplo, es posible ver cómo cada posible código de 4 bits está contenido en un solo flujo de 16 bits.

Por supuesto, este ataque solo funciona en circunstancias específicas, en particular, el receptor necesita usar registros de desplazamiento para leer la señal entrante. Los registros de desplazamiento se pueden imaginar como una memoria de tamaño fijo que maneja datos en un estilo FIFO, sacando de la memoria los bits más antiguos para hacer espacio para los más nuevos. El siguiente GIF lo explica bastante bien:

Funcionamiento del registro de desplazamiento – Fuente: Wikipedia

Ver esta animación hace que sea más fácil entender por qué las secuencias de De Brujin y los registros de desplazamiento funcionan tan bien juntos.

Otro requisito para que este ataque funcione es que la comunicación no utilice ningún tipo de preámbulo o bits finales ya que inutilizaría la secuencia.

Códigos rodantes

Afortunadamente, los automóviles de hoy en día son un poco más seguros de lo que solían ser porque los sistemas de ” código variable ” se utilizan ampliamente. Con estos sistemas, en lugar de reutilizar el mismo código cada vez, la llave enviará un código diferente cada vez que se presione el botón. Si intenta reproducir una señal capturada en un automóvil que utiliza un sistema de código variable el automóvil simplemente la ignorará.

En aras de la simplicidad podemos imaginar que el automóvil y la llave asociada comparten una lista ordenada de códigos válidos que se invalidarán, uno por uno, una vez utilizados.

Las implementaciones pueden variar, pero cada llave y automóvil tendrán un contador que se actualizará cada vez que se envíe o reciba una señal y probablemente habrá un algoritmo generador de números pseudoaleatorios (PRNG) que usa el contador y una clave criptográfica compartida por el coche y su llave, como semilla para generar el siguiente código. Aquí puedes ver un ejemplo de cómo funciona este proceso:

Esquema de trabajo de código variable

Este enfoque hace que sea realmente difícil para un atacante generar un “código futuro” y hace que sea imposible reutilizar los códigos que ya recibió el automóvil lo que representa un gran paso adelante con respecto a un enfoque de código fijo.

Sin embargo hay un problema con este enfoque: la llave y el automóvil funcionan de forma independiente por lo que si la llave envía una señal fuera del alcance del automóvil (aumenta el contador y marca el código actual como utilizado en su lista de códigos) dice ” fuera de sincronización” ya que el automóvil todavía esperaría el código que la llave acaba de marcar como usado, en la siguiente señal.

Para solucionar esta vulnerabilidad, en lugar de considerar válido un único código, el coche mantiene una gama de códigos válidos (n, n+1, …, n+k) actualizados cada vez que recibe una señal. Si la llave envía múltiples señales fuera del rango del automóvil y sale del rango de códigos válidos la siguiente señal que contenga un código válido fuera del rango válido servirá como un paquete de resincronización y no hará que el automóvil realice ninguna acción. .

Ataque RollJam

El mecanismo detrás de los códigos rodantes es bastante seguro pero el hecho de que la llave y el automóvil funcionen de manera independiente es un punto débil en el diseño de este sistema. Como hicimos antes, consideremos los códigos utilizados en este esquema como una lista ordenada de códigos, compartidos por la llave y el automóvil. En un escenario normal la evolución de la pila de código sería similar a esto:

Estado de las pilas de código en un escenario de trabajo normal

Para cada interacción, tanto la pila de códigos de llave como la pila de códigos de coche están en el mismo estado. Pero como se mencionó las dos pilas pueden desincronizarse como se muestra en el siguiente ejemplo:

Estado de las pilas de código en un escenario “fuera de sincronización”

Si bien las dos pilas ahora están sincronizadas esta situación sigue siendo anormal ya que el siguiente código utilizado será N+2, pero el código N sigue siendo válido en la pila del automóvil y la llave nunca lo volverá a usar. El ataque RollJam es una técnica que fuerza las pilas de códigos de la llave y del automóvil en un estado fuera de sincronización para recuperar un código válido, que no será utilizado por la llave pero que aún es aceptable para el automóvil. Este ataque fue desarrollado originalmente por Samy Kamkar , pero creo que los investigadores conocían la debilidad antes de que él lo presentara.

La técnica recrea con fuerza el escenario en el que se presiona la tecla mientras está fuera del alcance del automóvil. Esto se logra utilizando un bloqueador de frecuencia capaz de inhibir la comunicación entre la llave y el automóvil. Pero la interferencia no es suficiente para abrir el automóvil ya que el atacante no captura automáticamente el código válido, por esta razón es necesario “olfatear” la comunicación original mientras se bloquea para recuperar el código válido. En este escenario, el atacante actúa como un intermediario intermediario. Aquí hay un esquema que explica cómo se lleva a cabo el ataque:

Esquema de ataque RollJam

Si bien este ataque parece trivial de llevar a cabo en la práctica hay algunos obstáculos que superar.

Este ataque todavía funciona en muchos autos ya que es compatible con la mayoría de las implementaciones de código variable, pero está limitado de otras maneras:

  • Es posible que los códigos válidos recuperados no duren demasiado
  • Cada código válido se puede usar para una y solo una operación en el automóvil
  • Puede ser difícil cambiar la operación realizada por una señal que contiene un código válido (requiere ingeniería inversa de la señal en sí)

Algunos autos corrigieron esta vulnerabilidad con una solución simple: en lugar de marcar solo los códigos recibidos como usados el auto puede invalidar cada código N+K con K menor que el del código recién recibido. De esta manera el código válido recuperado será válido solo hasta la próxima vez que la llave se comunique con el automóvil.

Otros ataques contra RKE

Vale la pena mencionar que existen ataques contra la implementación específica de los sistemas RKE. Si bien no son tan ampliamente aplicables, estos ataques suelen tener un mayor impacto en comparación con los ataques RollJam.

Ataque de reversión

El ataque Rollback , presentado en la convención Blackhat USA 2022, es una nueva forma de atacar los sistemas RKE basados ​​en código variable. Los investigadores detrás de esta técnica descubrieron que ciertos automóviles después de recibir dos o más códigos consecutivos (usados) en un lapso de tiempo determinado restaura un estado anterior: si un atacante tiene acceso a los códigos N ​​y N+1 usados ​​y los reproduce, el estado de la pila de códigos del automóvil se restablecerá de tal manera que los códigos desde N+2 en adelante volverán a ser válidos.

En la práctica el ataque es similar a RollJam porque para capturar códigos consecutivos un atacante debe usar un bloqueador para inhibir una señal de la llave al automóvil para que el propietario presione el botón de la llave nuevamente.

Este ataque es mucho más versátil que RollJam ya que permite que un atacante controle el automóvil en cualquier momento y tantas veces como sea necesario (ya que puede restablecer el estado del automóvil varias veces). Sin embargo dependiendo de los objetivos algunos parámetros pueden variar tales como: la consecutividad de los códigos reproducidos, la cantidad de códigos reproducidos y el período de tiempo en el que se reproducen dichos códigos.

Además de esto parece que los autos de fabricantes asiáticos son los más afectados por esta vulnerabilidad. Se han realizado pruebas con automóviles Honda, Hyundai, Kia, Mazda, Nissan y Toyota y, según el codificador de código rodante específico utilizado, los automóviles eran seguros o vulnerables a instancias específicas del ataque. El único fabricante que resultó seguro durante la investigación fue Toyota.

No está confirmado, pero la documentación de algunos de los codificadores de código rodante sugirió que esta vulnerabilidad se debe a un “proceso de aprendizaje del llavero”.

Unoriginal-Rice-Patty (CVE-2019-20626) y Rolling-PWN (CVE-2021-46145)

Las siguientes vulnerabilidades son específicas de los sistemas RKE de los automóviles Honda.

Unoriginal-Rice-Patty es el nombre de la investigación/ataque detrás de CVE-2019-20626 , el ataque en sí es básico. Aunque los vehículos afectados por la vulnerabilidad usan sistemas de código variable, son vulnerables a un ataque de repetición simple. Esto demuestra cómo los automóviles modernos pueden ser vulnerables a ataques muy simples.

Además, incluye la posibilidad de arrancar el motor de forma remota, permitiendo al atacante, abrir el coche e incluso encender el motor.

Los autos que se sabe que son vulnerables son:

  • 2009 Acura TSX
  • 2016 Honda Accord V6 Touring Sedán
  • 2017 Honda HR-V (CVE-2019-20626)
  • Honda Civic Hatchback 2018
  • 2020 Honda Civic LXHonda

Rolling-PWN

Esta técnica explota CVE-2021-46145  aunque no se han revelado detalles sobre el ataque, sabemos que la vulnerabilidad radica en el hecho de que los automóviles afectados aceptan ventanas deslizantes de códigos, y cuando se presenta una secuencia específica de comandos al automóvil, el estado del código variable en el automóvil se vuelve a sincronizar con un estado anterior.

Es imposible decirlo con certeza porque los detalles no son públicos, pero el ataque parece ser similar al ataque de reversión.

Los autos que se sabe que son vulnerables son:

  • Honda Cívico 2012
  • Honda X-RV 2018
  • Honda C-RV 2020
  • Honda Accord 2020
  • Honda Odisea 2020
  • Honda inspirar 2021
  • Honda Fit 2022
  • Honda Cívico 2022
  • Honda VE-1 2022
  • Honda brisa 2022
  • Honda Accord 2021

Cómo hackear un auto abierto (en la práctica)

Ahora que conocemos bien la seguridad de los sistemas RKE podemos intentar atacarlos en la vida real. Todos los ataques mencionados anteriormente son similares para llevar a cabo pero el objetivo de esta sección será intentar un ataque rolljam ya que es compatible con la mayoría de los vehículos.

Tenga en cuenta que también hablaremos sobre la interferencia de frecuencias de radio esta práctica puede interrumpir el funcionamiento de los dispositivos de radio cercanos y probablemente sea ilegal en su país así que asegúrese de saber lo que está haciendo si planea probar esto en casa.

Hardware necesario

Para trabajar con señales de radio se necesita un transmisor y un receptor. Hay algunas opciones disponibles:

FS1000A & XY-MK-5V
Estos módulos, a menudo vendidos en pares, son una solución extremadamente económica (< 5 €) para recibir y transmitir datos con señales de radio. Estos dispositivos son bastante simples y no están listos para usar. Para trabajar con estos, lo más probable es que necesite un microcontrolador como un Arduino y una antena (DIY es una opción).

Como se puede imaginar, existen limitaciones, de hecho, los dispositivos están limitados a frecuencias de 433,92 MHz, 315 MHz o 330 MHz (según el modelo) y solo admiten OOK.

Los dispositivos están ampliamente disponibles y se admiten fácilmente en el entorno Arduino, por lo que puede ser útil tenerlos cerca.

CC1101
El CC1101 es un transceptor sub GHz de bajo coste (5-10€), es ligeramente más caro que la solución anterior pero ofrece mejor compatibilidad. MHz, 387-464 MHz y 779-928 MHz, cubriendo todas las posibles frecuencias RKE de uso común en todo el mundo. También admite modulaciones 2-FSK, 4-FSK, GFSK, MSK, así como OOK y ASK flexible.

Este circuito integrado está disponible en una variedad de placas, la mayoría de las cuales incluyen una antena y pines para interactuar con un Arduino u otro microcontrolador. Dadas las especificaciones, este es el dispositivo que como era de esperar maneja el sistema Sub GHz en el flipper zero .

Si bien este dispositivo es mucho más poderoso que los anteriores, el soporte de software no es el mejor y es necesario trabajar en ciertas situaciones.

Radios definidas por software (SDR)
Estos dispositivos son definitivamente la solución más cara disponible (~100-∞€), pero también la más generalizada y la que tiene un mejor rendimiento general. Las radios definidas por software son dispositivos capaces de recibir (ya veces transmitir) señales de radio pero usan computadoras para elaborar los datos para mantener el diseño del hardware más simple y económico.

Estos dispositivos suelen trabajar hasta 2GHz como mínimo y ofrecen soporte para todas las modulaciones y codificaciones (ya que la elaboración se realiza vía software).

Algunos SDR son solo receptores, algunos son transceptores. Algunos son semidúplex otros son dúplex completo. Algunos ofrecen rangos de frecuencia de operación más amplios que otros. Dependiendo de sus necesidades (y disponibilidad de dinero), seguramente encontrará el SDR perfecto. Tenga en cuenta que los experimentos de RKE se centran en frecuencias inferiores a GHz por lo que no se necesita nada demasiado sofisticado siempre que pueda transmitir una señal.

Estos son los dispositivos con los que he experimentado, pero estoy seguro de que muchos más son adecuados para el trabajo.

En mis experimentos he usado un HackRF One con portapack H2 (firmware mayhem) y un FS1000A para llevar a cabo el ataque.

HackRF (izquierda) y bloqueador (derecha)

Escenario de ataque y configuración

Para llevar a cabo un ataque RollJam necesitaremos poder bloquear la frecuencia RKE y simultáneamente olfatear la señal enviada por la tecla.

Teóricamente, podría ser posible hacer eso con un transceptor full-duplex, pero como el HackRF One es semidúplex creé un bloqueador de frecuencia para encargarse de la parte de la interferencia. El bloqueador utiliza un diseño extremadamente simple que presenta una placa ESP32 (para control de Wi-Fi) y un FS1000A como transmisor de RF. El proyecto llamado 433mhz_jam está disponible en github.También usé un paquete de baterías para alimentar el dispositivo, por lo que se puede controlar a distancia y se puede tirar. Esto permite una mayor flexibilidad y trabajar en tiempo real en el ataque en lugar de automatizar el proceso. Si no desea construir un bloqueador usted mismo puede usar otra llave del automóvil que funcione en la misma frecuencia para perturbar la señal o incluso una radio HAM (pero la potencia de transmisión en este caso sería excesiva y probablemente imposibilitaría cualquier esfuerzo de rastreo).

Por contexto, así es como se ve la señal de atasco en mi configuración:

señal de atasco

Y así es como se ve una señal bloqueada de la tecla:

Señal de llavero atascado

Ahora en el ataque RollJam original, necesitaría bloquear una frecuencia específica mientras olfatea una frecuencia cercana, donde se repite la señal original (debido a los armónicos, pero eso está fuera del alcance de este artículo). Los resultados de este enfoque pueden variar mucho, principalmente porque un bloqueador barato no es capaz de bloquear una frecuencia específica y necesitaría usar un filtro de paso de banda para lograrlo.

Por esta razón, “desarrollé” una ligera variación de este ataque que me gusta llamar *RollDumb*, porque es más simple pero sorprendentemente efectivo.

Dado que el dispositivo bloqueador que creé es arrojable y controlado a distancia puedo colocarlo justo al lado del automóvil que estoy tratando de atacar, de modo que la señal de interferencia sea recibida con mucha fuerza. Dado que la potencia del bloqueador no es demasiado fuerte, a pocos metros de distancia la potencia de la señal se reduce considerablemente.

Ahora puedo colocar mi rastreador lejos del automóvil, en una posición en la que pueda recibir fácilmente la señal de la llave del automóvil en la misma frecuencia que estoy interfiriendo.

Siento que esta variación del ataque es un poco más realista, generalizada y mucho más fácil de llevar a cabo automáticamente o por un atacante en tiempo real. La única razón por la que me siento así es porque para llevar a cabo un ataque RolllJam, se deben llevar a cabo investigaciones y pruebas exhaustivas en el modelo de automóvil exacto antes de que se pueda intentar un ataque en la vida real mientras que los requisitos pueden ser más laxos en un ataque RollDumb ya que solo necesitaría averiguar la frecuencia del llavero.

Demostración y conclusiones

Ahora que he explicado cómo funciona todo el ataque una demostración es obligatoria:

No hace falta decir que cuando se abre el coche es increíblemente satisfactorio.

Bueno, dicho esto ha sido divertido experimentar con la apertura de autos he intentado esta técnica en varios vehículos y debo decir que una vez que la dominas bien es fácilmente reproducible y efectiva (o al menos lo era en mi país ya que la mayoría, si no todos los llaveros funcionan a 433,92 MHz). Se requiere un conocimiento básico de las transmisiones de radio, pero debo decir que las buenas herramientas también juegan un papel importante en este tipo de ataques.

Fuente: https://www.secjuice.com/attacking-rke-how-to-hack-a-car-open/