JTAG

Reading time: 6 minutes

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

HackTricks

JTAGenum

JTAGenum είναι ένα εργαλείο που μπορείτε να φορτώσετε σε ένα MCU συμβατό με Arduino ή (πειραματικά) σε ένα Raspberry Pi για να κάνετε brute‑force άγνωστες συνδέσεις JTAG και ακόμη και να καταγράψετε καταχωρητές εντολών.

  • Arduino: συνδέστε τις ψηφιακές ακίδες D2–D11 σε έως 10 υποψήφιες ακίδες/testpoints JTAG, και το GND του Arduino στο GND του στόχου. Τροφοδοτήστε τον στόχο ξεχωριστά εκτός αν γνωρίζετε ότι η γραμμή είναι ασφαλής. Προτιμήστε λογική 3.3 V (π.χ., Arduino Due) ή χρησιμοποιήστε έναν μετατροπέα επιπέδου/σειριακούς αντιστάτες όταν ελέγχετε στόχους 1.8–3.3 V.
  • Raspberry Pi: η κατασκευή του Pi εκθέτει λιγότερες χρησιμοποιήσιμες GPIOs (έτσι οι σαρώσεις είναι πιο αργές); ελέγξτε το repo για τον τρέχοντα χάρτη ακίδων και περιορισμούς.

Αφού αναβοσβήσετε, ανοίξτε τον σειριακό παρακολούθηση στα 115200 baud και στείλτε h για βοήθεια. Τυπική ροή:

  • l βρείτε loopbacks για να αποφύγετε ψευδώς θετικά
  • r εναλλάξτε εσωτερικές pull‑ups αν χρειαστεί
  • s σαρώστε για TCK/TMS/TDI/TDO (και μερικές φορές TRST/SRST)
  • y brute‑force IR για να ανακαλύψετε μη τεκμηριωμένες εντολές
  • x στιγμιότυπο boundary‑scan των καταστάσεων ακίδων

Αν βρεθεί έγκυρο TAP, θα δείτε γραμμές που ξεκινούν με FOUND! που υποδεικνύουν ανακαλυφθείσες ακίδες.

Συμβουλές

  • Μοιραστείτε πάντα το έδαφος και μην οδηγείτε άγνωστες ακίδες πάνω από το Vtref του στόχου. Αν έχετε αμφιβολίες, προσθέστε σειριακούς αντιστάτες 100–470 Ω στις υποψήφιες ακίδες.
  • Αν η συσκευή χρησιμοποιεί SWD/SWJ αντί για 4‑wire JTAG, το JTAGenum μπορεί να μην το ανιχνεύσει; δοκιμάστε εργαλεία SWD ή έναν προσαρμογέα που υποστηρίζει SWJ‑DP.

Ασφαλέστερη αναζήτηση ακίδων και ρύθμιση υλικού

  • Εντοπίστε πρώτα το Vtref και το GND με ένα πολύμετρο. Πολλοί προσαρμογείς χρειάζονται το Vtref για να ρυθμίσουν την τάση I/O.
  • Μετατόπιση επιπέδου: προτιμήστε διευθυνσιοδοτημένους μετατροπείς επιπέδου σχεδιασμένους για σήματα push‑pull (οι γραμμές JTAG δεν είναι open‑drain). Αποφύγετε τους αυτόματους μετατροπείς κατεύθυνσης I2C για JTAG.
  • Χρήσιμοι προσαρμογείς: FT2232H/FT232H boards (π.χ., Tigard), CMSIS‑DAP, J‑Link, ST‑LINK (ειδικοί προμηθευτές), ESP‑USB‑JTAG (σε ESP32‑Sx). Συνδέστε τουλάχιστον TCK, TMS, TDI, TDO, GND και Vtref; προαιρετικά TRST και SRST.

Πρώτη επαφή με OpenOCD (σάρωση και IDCODE)

Το OpenOCD είναι το de‑facto OSS για JTAG/SWD. Με έναν υποστηριζόμενο προσαρμογέα μπορείτε να σαρώσετε την αλυσίδα και να διαβάσετε IDCODEs:

  • Γενικό παράδειγμα με έναν J‑Link:
openocd -f interface/jlink.cfg -c "transport select jtag; adapter speed 1000" \
-c "init; scan_chain; shutdown"
  • ESP32‑S3 ενσωματωμένο USB‑JTAG (δεν απαιτείται εξωτερικός ανιχνευτής):
openocd -f board/esp32s3-builtin.cfg -c "init; scan_chain; shutdown"

Σημειώσεις

  • Αν λάβετε "όλα τα 1/0" IDCODE, ελέγξτε την καλωδίωση, την τροφοδοσία, το Vtref και ότι η θύρα δεν είναι κλειδωμένη από ασφάλειες/επιλογές.
  • Δείτε το OpenOCD χαμηλού επιπέδου irscan/drscan για χειροκίνητη αλληλεπίδραση TAP κατά την εκκίνηση άγνωστων αλυσίδων.

Σταμάτημα της CPU και εκφόρτωση μνήμης/flash

Αφού αναγνωριστεί το TAP και επιλεγεί ένα σενάριο στόχου, μπορείτε να σταματήσετε τον πυρήνα και να εκφορτώσετε περιοχές μνήμης ή εσωτερικό flash. Παραδείγματα (προσαρμόστε τον στόχο, τις βασικές διευθύνσεις και τα μεγέθη):

  • Γενικός στόχος μετά την αρχικοποίηση:
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 (προτιμήστε το SBA όταν είναι διαθέσιμο):
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, προγραμματίστε ή διαβάστε μέσω του βοηθού OpenOCD:
openocd -f board/esp32s3-builtin.cfg \
-c "program_esp app.bin 0x10000 verify exit"

Tips

  • Χρησιμοποιήστε mdw/mdh/mdb για να ελέγξετε τη μνήμη πριν από μεγάλες εκφορτώσεις.
  • Για αλυσίδες πολλών συσκευών, ρυθμίστε το BYPASS σε μη στόχους ή χρησιμοποιήστε ένα αρχείο πλακέτας που ορίζει όλα τα TAPs.

Τεχνάσματα boundary-scan (EXTEST/SAMPLE)

Ακόμα και όταν η πρόσβαση αποσφαλμάτωσης της CPU είναι κλειδωμένη, το boundary-scan μπορεί να είναι ακόμα εκτεθειμένο. Με το UrJTAG/OpenOCD μπορείτε να:

  • SAMPLE για να αποτυπώσετε τις καταστάσεις των ακίδων ενώ το σύστημα τρέχει (βρείτε δραστηριότητα λεωφόρου, επιβεβαιώστε την αντιστοίχιση ακίδων).
  • EXTEST για να οδηγήσετε ακίδες (π.χ., bit-bang εξωτερικές γραμμές SPI flash μέσω του MCU για να τις διαβάσετε εκτός σύνδεσης αν η καλωδίωση της πλακέτας το επιτρέπει).

Ελάχιστη ροή UrJTAG με προσαρμογέα 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>

Πρέπει να έχετε το BSDL της συσκευής για να γνωρίζετε τη σειρά των bits των καταχωρητών ορίου. Προσέξτε ότι ορισμένοι προμηθευτές κλειδώνουν τα κύτταρα ανίχνευσης ορίου στην παραγωγή.

Σύγχρονοι στόχοι και σημειώσεις

  • ESP32‑S3/C3 περιλαμβάνουν μια εγγενή γέφυρα USB‑JTAG; Το OpenOCD μπορεί να επικοινωνεί απευθείας μέσω USB χωρίς εξωτερικό αισθητήρα. Πολύ βολικό για τριχοτόμηση και εκφορτώσεις.
  • Η αποσφαλμάτωση RISC‑V (v0.13+) υποστηρίζεται ευρέως από το OpenOCD; προτιμήστε το SBA για πρόσβαση στη μνήμη όταν ο πυρήνας δεν μπορεί να σταματήσει με ασφάλεια.
  • Πολλοί MCU υλοποιούν αυθεντικοποίηση αποσφαλμάτωσης και καταστάσεις κύκλου ζωής. Εάν το JTAG φαίνεται νεκρό αλλά η τροφοδοσία είναι σωστή, η συσκευή μπορεί να έχει συγκολληθεί σε κλειστή κατάσταση ή να απαιτεί έναν αυθεντικοποιημένο αισθητήρα.

Άμυνες και σκληραγώγηση (τι να περιμένετε σε πραγματικές συσκευές)

  • Μόνιμα απενεργοποιήστε ή κλειδώστε το JTAG/SWD στην παραγωγή (π.χ., STM32 RDP επίπεδο 2, ESP eFuses που απενεργοποιούν το PAD JTAG, NXP/Nordic APPROTECT/DPAP).
  • Απαιτήστε αυθεντικοποιημένη αποσφαλμάτωση (ARMv8.2‑A ADIv6 Debug Authentication, OEM‑managed challenge‑response) διατηρώντας την πρόσβαση στη manufacturing.
  • Μην διαδρομείτε εύκολες δοκιμαστικές επιφάνειες; θάψτε τις δοκιμαστικές vias, αφαιρέστε/καλύψτε αντιστάτες για να απομονώσετε το TAP, χρησιμοποιήστε συνδέσμους με κλειδώματα ή fixtures pogo‑pin.
  • Κλείδωμα αποσφαλμάτωσης κατά την ενεργοποίηση: κλείστε το TAP πίσω από το πρώιμο ROM που επιβάλλει ασφαλή εκκίνηση.

Αναφορές

  • 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

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks