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, щоб методом грубої сили визначити невідомі JTAG pinout і навіть перерахувати регістри інструкцій.

  • Arduino: підключіть цифрові піни D2–D11 до до 10 підозрюваних JTAG pads/testpoints, а GND Arduino до GND цілі. Живіть ціль окремо, якщо не знаєте, що лінія безпечна. Вибирайте логіку 3.3 V (наприклад, Arduino Due) або використовуйте перетворювач рівнів/послідовні резистори при перевірці цілей 1.8–3.3 V.
  • Raspberry Pi: версія Pi має менше доступних GPIO (тому сканування повільніше); перевірте репозиторій для актуальної карти пінів і обмежень.

Після прошивки відкрийте серійний монітор на 115200 бод і надішліть h для отримання допомоги. Типовий потік:

  • l знайти петлі, щоб уникнути хибнопозитивних результатів
  • r перемикати внутрішні підтягуючі резистори, якщо потрібно
  • s сканувати для TCK/TMS/TDI/TDO (і іноді TRST/SRST)
  • y метод грубої сили IR для виявлення не задокументованих опкодів
  • x знімок стану пінів за допомогою boundary-scan

Якщо знайдено дійсний TAP, ви побачите рядки, що починаються з FOUND!, що вказують на виявлені піни.

Поради

  • Завжди діліть землю і ніколи не підключайте невідомі піни вище Vtref цілі. Якщо сумніваєтеся, додайте послідовні резистори 100–470 Ω на кандидатних пінах.
  • Якщо пристрій використовує SWD/SWJ замість 4-провідного JTAG, JTAGenum може його не виявити; спробуйте інструменти SWD або адаптер, що підтримує SWJ‑DP.

Безпечніше полювання за пінами та налаштування апаратного забезпечення

  • Спочатку визначте Vtref і GND за допомогою мультиметра. Багато адаптерів потребують Vtref для встановлення напруги I/O.
  • Перетворення рівнів: віддавайте перевагу двонаправленим перетворювачам рівнів, призначеним для сигналів push‑pull (лінії JTAG не є відкритими). Уникайте автоматичних I2C перетворювачів для JTAG.
  • Корисні адаптери: плати FT2232H/FT232H (наприклад, Tigard), CMSIS‑DAP, J‑Link, ST‑LINK (специфічні для постачальника), ESP‑USB‑JTAG (на ESP32‑Sx). Підключайте принаймні TCK, TMS, TDI, TDO, GND і Vtref; за бажанням TRST і SRST.

Перший контакт з OpenOCD (сканування та IDCODE)

OpenOCD - це де-факто 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"

Notes

  • Якщо ви отримали "всі одиниці/нулі" IDCODE, перевірте з'єднання, живлення, Vtref та те, що порт не заблокований запобіжниками/опційними байтами.
  • Дивіться OpenOCD низькорівневий irscan/drscan для ручної взаємодії з TAP при підключенні невідомих ланцюгів.

Зупинка ЦП та скидання пам'яті/флеш-пам'яті

Якщо TAP розпізнано і вибрано цільовий скрипт, ви можете зупинити ядро та скинути області пам'яті або внутрішню флеш-пам'ять. Приклади (налаштуйте ціль, базові адреси та розміри):

  • Загальна ціль після ініціалізації:
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 на нецільових пристроях або використовуйте файл плати, який визначає всі TAP.

Трюки з граничним скануванням (EXTEST/SAMPLE)

Навіть коли доступ до налагодження ЦП заблоковано, граничне сканування все ще може бути доступним. З UrJTAG/OpenOCD ви можете:

  • SAMPLE для знімка станів контактів під час роботи системи (знайти активність шини, підтвердити відображення контактів).
  • EXTEST для управління контактами (наприклад, біт-банг зовнішніх ліній SPI флеш-пам'яті через 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 пристрою, щоб знати порядок бітів регістра межі. Будьте обережні, деякі постачальники блокують клітини сканування межі в процесі виробництва.

Сучасні цілі та примітки

  • ESP32‑S3/C3 включає вбудований USB‑JTAG міст; OpenOCD може спілкуватися безпосередньо через USB без зовнішнього зонда. Дуже зручно для тріажу та дампів.
  • Налагодження RISC‑V (v0.13+) широко підтримується OpenOCD; віддавайте перевагу SBA для доступу до пам'яті, коли ядро не може бути зупинено безпечно.
  • Багато МК реалізують аутентифікацію налагодження та стани життєвого циклу. Якщо JTAG виглядає мертвим, але живлення правильне, пристрій може бути зафіксований у закритому стані або вимагати аутентифікований зонд.

Захист і зміцнення (чого очікувати на реальних пристроях)

  • Постійно вимикайте або блокуйте JTAG/SWD у виробництві (наприклад, STM32 RDP рівень 2, ESP eFuses, які вимикають PAD JTAG, NXP/Nordic APPROTECT/DPAP).
  • Вимагайте аутентифіковане налагодження (ARMv8.2‑A ADIv6 Аутентифікація налагодження, управління OEM викликами-відповідями) при збереженні доступу до виробництва.
  • Не прокладайте легкі тестові площадки; закопуйте тестові вії, видаляйте/заповнюйте резистори для ізоляції TAP, використовуйте роз'єми з ключами або конструкціями з пружинами.
  • Блокування налагодження при увімкненні: закривайте 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