Accueil / Interfaces filaires

JTAG / SWD

Interfaces de debug donnant un accès profond au processeur : lecture mémoire, points d'arrêt, extraction de firmware.

Complet #jtag#swd#debug

Description

JTAG (Joint Test Action Group, norme IEEE 1149.1) est à l’origine une interface de test de circuit (boundary scan) permettant de vérifier les connexions d’une carte sans sondes physiques. En pratique, elle sert surtout de port de debug : elle donne accès au cœur du processeur — lecture/écriture de la mémoire et des registres, exécution pas à pas, points d’arrêt.

SWD (Serial Wire Debug) est l’équivalent d’ARM sur 2 fils (SWDIO + SWCLK), très répandu sur les microcontrôleurs Cortex-M. Fonctionnellement, il offre les mêmes possibilités de debug avec moins de broches.

Signaux (TAP)

Le port JTAG standard repose sur un Test Access Port :

SignalRôle
TCKHorloge de test
TMSSélection de l’état de la machine à états
TDIEntrée de données de test
TDOSortie de données de test
TRSTReset du TAP (optionnel)

Identification

Le JTAG est rarement sérigraphié. Indices utiles :

  • un groupe de broches rapprochées (4 à 10), parfois un connecteur non peuplé,
  • des pads de test regroupés près du SoC.

Pour retrouver le brochage sans documentation :

  • JTAGulator : un outil dédié qui teste automatiquement les combinaisons de broches pour identifier TCK/TMS/TDI/TDO.
  • JTAGenum : firmware pour Arduino qui remplit un rôle similaire à moindre coût.
  • Le TDO présente souvent une activité au démarrage ; TCK/TMS ont des signatures reconnaissables à l’analyseur logique.

Attacking

Se connecter

Une sonde de debug relie la cible à l’hôte :

  • J-Link, ST-Link (STM32), ou une carte FT2232H générique,
  • côté logiciel, OpenOCD est la référence libre.
# Lancer OpenOCD avec une interface FT2232 et une cible générique
openocd -f interface/ftdi/ft2232h.cfg -f target/stm32f1x.cfg

Puis, dans une autre console, se connecter au serveur OpenOCD :

# Ouvrir le port telnet exposé par OpenOCD
telnet localhost 4444

# Depuis l'invite OpenOCD : arrêter le CPU et lire la flash
> halt
> flash banks
> dump_image dump.bin 0x08000000 0x20000

Ce que le JTAG permet

  • Extraire le firmware en lisant la flash interne (si la lecture n’est pas verrouillée).
  • Halter le CPU, inspecter/modifier la RAM et les registres, poser des points d’arrêt.
  • Contourner des protections logicielles en modifiant l’exécution ou en patchant la mémoire.
  • Sur certaines puces, désactiver ou contourner la protection de lecture (RDP) via des attaques connues.

Protections

  • Activer la protection en lecture (ex. RDP niveau 2 sur STM32, fuses de verrouillage sur d’autres MCU) — idéalement irréversible en production.
  • Désactiver le JTAG/SWD après la phase de développement (fusible/eFuse).
  • Retirer les connecteurs de debug et masquer les pads.
  • Combiner avec un secure boot et le chiffrement de la flash.

Example devices

  • Microcontrôleurs (STM32, NXP, Nordic…), SoC applicatifs et modules radio exposant fréquemment un port SWD/JTAG.

Ressources