JTAG

Reading time: 7 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

HackTricks

JTAGenum

JTAGenum est un outil que vous pouvez charger sur un MCU compatible Arduino ou (expĂ©rimentalement) un Raspberry Pi pour forcer les pinouts JTAG inconnus et mĂȘme Ă©numĂ©rer les registres d'instructions.

  • Arduino : connectez les broches numĂ©riques D2–D11 Ă  jusqu'Ă  10 pads/testpoints JTAG suspects, et GND Arduino Ă  GND cible. Alimentez la cible sĂ©parĂ©ment Ă  moins que vous ne sachiez que le rail est sĂ»r. PrĂ©fĂ©rez la logique 3,3 V (par exemple, Arduino Due) ou utilisez un convertisseur de niveau/rĂ©sistances en sĂ©rie lors de la sonde des cibles 1,8–3,3 V.
  • Raspberry Pi : la version Pi expose moins de GPIO utilisables (donc les scans sont plus lents) ; vĂ©rifiez le dĂ©pĂŽt pour la carte des broches actuelle et les contraintes.

Une fois flashé, ouvrez le moniteur série à 115200 bauds et envoyez h pour obtenir de l'aide. Flux typique :

  • l trouver les boucles de retour pour Ă©viter les faux positifs
  • r basculer les pull-ups internes si nĂ©cessaire
  • s scanner pour TCK/TMS/TDI/TDO (et parfois TRST/SRST)
  • y forcer IR pour dĂ©couvrir des opcodes non documentĂ©s
  • x instantanĂ© de scan de frontiĂšre des Ă©tats des broches

Si un TAP valide est trouvé, vous verrez des lignes commençant par FOUND! indiquant les broches découvertes.

Conseils

  • Partagez toujours la masse, et ne jamais alimenter des broches inconnues au-dessus de Vtref cible. En cas de doute, ajoutez des rĂ©sistances en sĂ©rie de 100–470 Ω sur les broches candidates.
  • Si le dispositif utilise SWD/SWJ au lieu de JTAG Ă  4 fils, JTAGenum peut ne pas le dĂ©tecter ; essayez des outils SWD ou un adaptateur qui prend en charge SWJ‑DP.

Chasse aux broches plus sûre et configuration matérielle

  • Identifiez d'abord Vtref et GND avec un multimĂštre. De nombreux adaptateurs ont besoin de Vtref pour dĂ©finir la tension I/O.
  • Conversion de niveau : prĂ©fĂ©rez les convertisseurs de niveau bidirectionnels conçus pour les signaux push‑pull (les lignes JTAG ne sont pas Ă  drain ouvert). Évitez les convertisseurs I2C Ă  direction automatique pour JTAG.
  • Adaptateurs utiles : cartes FT2232H/FT232H (par exemple, Tigard), CMSIS‑DAP, J‑Link, ST‑LINK (spĂ©cifique au fournisseur), ESP‑USB‑JTAG (sur ESP32‑Sx). Connectez au minimum TCK, TMS, TDI, TDO, GND et Vtref ; TRST et SRST en option.

Premier contact avec OpenOCD (scan et IDCODE)

OpenOCD est le OSS de facto pour JTAG/SWD. Avec un adaptateur pris en charge, vous pouvez scanner la chaĂźne et lire les IDCODEs :

  • Exemple gĂ©nĂ©rique avec un J‑Link :
openocd -f interface/jlink.cfg -c "transport select jtag; adapter speed 1000" \
-c "init; scan_chain; shutdown"
  • ESP32‑S3 USB‑JTAG intĂ©grĂ© (aucune sonde externe requise) :
openocd -f board/esp32s3-builtin.cfg -c "init; scan_chain; shutdown"

Notes

  • Si vous obtenez un IDCODE "tous les uns/zĂ©ros", vĂ©rifiez le cĂąblage, l'alimentation, Vtref, et que le port n'est pas verrouillĂ© par des fusibles/bytes d'option.
  • Voir OpenOCD bas niveau irscan/drscan pour une interaction manuelle TAP lors de la mise en route de chaĂźnes inconnues.

ArrĂȘt du CPU et vidage de la mĂ©moire/flash

Une fois que le TAP est reconnu et qu'un script cible est choisi, vous pouvez arrĂȘter le cƓur et vider les rĂ©gions de mĂ©moire ou la flash interne. Exemples (ajuster la cible, les adresses de base et les tailles) :

  • Cible gĂ©nĂ©rique aprĂšs init :
openocd -f interface/jlink.cfg -f target/stm32f1x.cfg \
-c "init; reset halt; mdw 0x08000000 4; dump_image flash.bin 0x08000000 0x00100000; shutdown"
  • RISC‑V SoC (prĂ©fĂ©rer SBA lorsque disponible) :
openocd -f interface/ftdi/ft232h.cfg -f target/riscv.cfg \
-c "init; riscv set_prefer_sba on; halt; dump_image sram.bin 0x80000000 0x20000; shutdown"
  • ESP32‑S3, programmer ou lire via l'assistant OpenOCD :
openocd -f board/esp32s3-builtin.cfg \
-c "program_esp app.bin 0x10000 verify exit"

Conseils

  • Utilisez mdw/mdh/mdb pour vĂ©rifier la mĂ©moire avant de faire de longs dumps.
  • Pour les chaĂźnes multi-appareils, dĂ©finissez BYPASS sur les non-cibles ou utilisez un fichier de carte qui dĂ©finit tous les TAPs.

Astuces de test de frontiĂšre (EXTEST/SAMPLE)

MĂȘme lorsque l'accĂšs de dĂ©bogage du CPU est verrouillĂ©, le test de frontiĂšre peut encore ĂȘtre exposĂ©. Avec UrJTAG/OpenOCD, vous pouvez :

  • SAMPLE pour prendre un instantanĂ© des Ă©tats des broches pendant que le systĂšme fonctionne (trouver l'activitĂ© du bus, confirmer le mappage des broches).
  • EXTEST pour piloter des broches (par exemple, bit-bang des lignes SPI flash externes via le MCU pour les lire hors ligne si le cĂąblage de la carte le permet).

Flux minimal UrJTAG avec un adaptateur FT2232x :

jtag> cable ft2232 vid=0x0403 pid=0x6010 interface=1
jtag> frequency 100000
jtag> detect
jtag> bsdl path /path/to/bsdl/files
jtag> instruction EXTEST
jtag> shift ir
jtag> dr  <bit pattern for boundary register>

Vous avez besoin du BSDL de l'appareil pour connaĂźtre l'ordre des bits des registres de frontiĂšre. Attention, certains fournisseurs verrouillent les cellules de scan de frontiĂšre en production.

Cibles modernes et notes

  • ESP32‑S3/C3 incluent un pont USB‑JTAG natif ; OpenOCD peut communiquer directement via USB sans sonde externe. TrĂšs pratique pour le triage et les dumps.
  • Le dĂ©bogage RISC‑V (v0.13+) est largement supportĂ© par OpenOCD ; prĂ©fĂ©rez SBA pour l'accĂšs mĂ©moire lorsque le cƓur ne peut pas ĂȘtre arrĂȘtĂ© en toute sĂ©curitĂ©.
  • De nombreux MCU mettent en Ɠuvre l'authentification de dĂ©bogage et les Ă©tats de cycle de vie. Si JTAG semble mort mais que l'alimentation est correcte, l'appareil peut ĂȘtre fusionnĂ© dans un Ă©tat fermĂ© ou nĂ©cessite une sonde authentifiĂ©e.

Défenses et durcissement (à quoi s'attendre sur des appareils réels)

  • DĂ©sactivez ou verrouillez dĂ©finitivement JTAG/SWD en production (par exemple, niveau 2 RDP STM32, eFuses ESP qui dĂ©sactivent PAD JTAG, APPROTECT/DPAP NXP/Nordic).
  • Exigez une authentification de dĂ©bogage (ARMv8.2‑A ADIv6 Debug Authentication, dĂ©fi-rĂ©ponse gĂ©rĂ© par l'OEM) tout en conservant l'accĂšs Ă  la fabrication.
  • Ne pas acheminer de pads de test faciles ; enterrez les vias de test, retirez/peuplement les rĂ©sistances pour isoler TAP, utilisez des connecteurs avec codage ou des dispositifs Ă  broches pogo.
  • Verrouillage de dĂ©bogage Ă  l'alimentation : placez le TAP derriĂšre un ROM prĂ©coce imposant un dĂ©marrage sĂ©curisĂ©.

Références

  • OpenOCD User’s Guide – JTAG Commands and configuration. https://openocd.org/doc-release/html/JTAG-Commands.html
  • Espressif ESP32‑S3 JTAG debugging (USB‑JTAG, OpenOCD usage). https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/api-guides/jtag-debugging/

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks