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.
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 :
| Signal | Rôle |
|---|---|
| TCK | Horloge de test |
| TMS | Sélection de l’état de la machine à états |
| TDI | Entrée de données de test |
| TDO | Sortie de données de test |
| TRST | Reset 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.