JTAG
Reading time: 6 minutes
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao đŹ grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter đŠ @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositĂłrios do github.
JTAGenum
JTAGenum Ă© uma ferramenta que vocĂȘ pode carregar em um MCU compatĂvel com Arduino ou (experimentalmente) em um Raspberry Pi para forçar a descoberta de pinagens JTAG desconhecidas e atĂ© enumerar registradores de instrução.
- Arduino: conecte os pinos digitais D2âD11 a atĂ© 10 pads/testpoints JTAG suspeitos, e o GND do Arduino ao GND do alvo. Alimente o alvo separadamente, a menos que vocĂȘ saiba que a linha Ă© segura. Prefira lĂłgica de 3,3 V (por exemplo, Arduino Due) ou use um conversor de nĂvel/resistores em sĂ©rie ao sondar alvos de 1,8â3,3 V.
- Raspberry Pi: a construção do Pi expÔe menos GPIOs utilizåveis (portanto, as varreduras são mais lentas); verifique o repositório para o mapa de pinos atual e restriçÔes.
Uma vez gravado, abra o monitor serial a 115200 baud e envie h
para ajuda. Fluxo tĂpico:
l
encontrar loopbacks para evitar falsos positivosr
alternar pullâups internos se necessĂĄrios
escanear para TCK/TMS/TDI/TDO (e Ă s vezes TRST/SRST)y
forçar IR para descobrir opcodes não documentadosx
instantĂąneo de boundaryâscan dos estados dos pinos
Se um TAP vĂĄlido for encontrado, vocĂȘ verĂĄ linhas começando com FOUND!
indicando pinos descobertos.
Dicas
- Sempre compartilhe o terra e nunca acione pinos desconhecidos acima do Vtref do alvo. Se tiver dĂșvidas, adicione resistores em sĂ©rie de 100â470 Ω nos pinos candidatos.
- Se o dispositivo usar SWD/SWJ em vez de JTAG de 4 fios, o JTAGenum pode nĂŁo detectĂĄ-lo; tente ferramentas SWD ou um adaptador que suporte SWJâDP.
Caça a pinos mais segura e configuração de hardware
- Identifique Vtref e GND primeiro com um multĂmetro. Muitos adaptadores precisam de Vtref para definir a tensĂŁo de I/O.
- ConversĂŁo de nĂvel: prefira conversores de nĂvel bidirecionais projetados para sinais pushâpull (as linhas JTAG nĂŁo sĂŁo openâdrain). Evite conversores I2C de direção automĂĄtica para JTAG.
- Adaptadores Ășteis: placas FT2232H/FT232H (por exemplo, Tigard), CMSISâDAP, JâLink, STâLINK (especĂficos do fornecedor), ESPâUSBâJTAG (no ESP32âSx). Conecte no mĂnimo TCK, TMS, TDI, TDO, GND e Vtref; opcionalmente TRST e SRST.
Primeiro contato com OpenOCD (varredura e IDCODE)
OpenOCD Ă© o OSS de fato para JTAG/SWD. Com um adaptador suportado, vocĂȘ pode escanear a cadeia e ler IDCODEs:
- Exemplo genĂ©rico com um JâLink:
openocd -f interface/jlink.cfg -c "transport select jtag; adapter speed 1000" \
-c "init; scan_chain; shutdown"
- ESP32âS3 USBâJTAG embutido (nenhuma sonda externa necessĂĄria):
openocd -f board/esp32s3-builtin.cfg -c "init; scan_chain; shutdown"
Notas
- Se vocĂȘ receber um IDCODE "todos uns/zeros", verifique a fiação, a energia, o Vtref e se a porta nĂŁo estĂĄ bloqueada por fusĂveis/opçÔes de bytes.
- Veja OpenOCD
irscan
/drscan
de baixo nĂvel para interação manual com TAP ao iniciar cadeias desconhecidas.
Parando a CPU e despejando memĂłria/flash
Uma vez que o TAP Ă© reconhecido e um script de destino Ă© escolhido, vocĂȘ pode parar o nĂșcleo e despejar regiĂ”es de memĂłria ou flash interno. Exemplos (ajuste o alvo, endereços base e tamanhos):
- Alvo genérico após a inicialização:
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 (prefira SBA quando disponĂvel):
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, programar ou ler via helper OpenOCD:
openocd -f board/esp32s3-builtin.cfg \
-c "program_esp app.bin 0x10000 verify exit"
Tips
- Use
mdw/mdh/mdb
para verificar a integridade da memĂłria antes de dumps longos. - Para cadeias de mĂșltiplos dispositivos, defina BYPASS em nĂŁo-alvos ou use um arquivo de placa que defina todos os TAPs.
Truques de boundary-scan (EXTEST/SAMPLE)
Mesmo quando o acesso de depuração da CPU estĂĄ bloqueado, o boundary-scan ainda pode estar exposto. Com UrJTAG/OpenOCD vocĂȘ pode:
- SAMPLE para capturar estados dos pinos enquanto o sistema estå em execução (encontrar atividade no barramento, confirmar mapeamento de pinos).
- EXTEST para acionar pinos (por exemplo, bit-bang linhas SPI externas via o MCU para lĂȘ-las offline se a fiação da placa permitir).
Fluxo mĂnimo do UrJTAG com um adaptador 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>
VocĂȘ precisa do BSDL do dispositivo para conhecer a ordem dos bits do registrador de limite. Cuidado, pois alguns fornecedores bloqueiam cĂ©lulas de boundary-scan na produção.
Alvos modernos e notas
- ESP32âS3/C3 incluem uma ponte USBâJTAG nativa; OpenOCD pode se comunicar diretamente via USB sem uma sonda externa. Muito conveniente para triagem e dumps.
- O debug RISCâV (v0.13+) Ă© amplamente suportado pelo OpenOCD; prefira SBA para acesso Ă memĂłria quando o nĂșcleo nĂŁo puder ser interrompido com segurança.
- Muitos MCUs implementam autenticação de debug e estados de ciclo de vida. Se o JTAG parecer morto, mas a energia estiver correta, o dispositivo pode estar fundido em um estado fechado ou requerer uma sonda autenticada.
Defesas e endurecimento (o que esperar em dispositivos reais)
- Desative permanentemente ou bloqueie JTAG/SWD na produção (por exemplo, nĂvel 2 RDP STM32, eFuses ESP que desativam PAD JTAG, APPROTECT/DPAP NXP/Nordic).
- Exija autenticação de debug (ARMv8.2âA ADIv6 Autenticação de Debug, desafio-resposta gerenciado por OEM) enquanto mantĂ©m o acesso de fabricação.
- Não roteie pads de teste fåceis; enterre vias de teste, remova/popule resistores para isolar TAP, use conectores com chaves ou fixaçÔes de pinos pogo.
- Bloqueio de debug na inicialização: proteja o TAP atrås de um ROM inicial que impÔe o boot seguro.
ReferĂȘncias
- 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
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao đŹ grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter đŠ @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositĂłrios do github.