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
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
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 positifsr
basculer les pull-ups internes si nécessaires
scanner pour TCK/TMS/TDI/TDO (et parfois TRST/SRST)y
forcer IR pour découvrir des opcodes non documentésx
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
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.