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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.