O hardware hacking: o que é e para que é usado
Embora tenhamos falado há algum tempo sobre os gadgets mais utilizados no hardware hacking, é importante destacar que no mundo da cibersegurança, o hardware hacking não se limita ao uso de dispositivos eletrônicos para realizar testes ofensivos em diferentes sistemas. Também está relacionado ao uso de técnicas para explorar falhas de segurança e manipular o hardware de um dispositivo eletrônico para alterar seu funcionamento, adicionar novas funcionalidades, obter informações do equipamento ou violar sua segurança.
As técnicas de hardware hacking são usadas para engenharia reversa e manipulação do dispositivo que se deseja analisar. Elas podem ser usadas por pesquisadores de segurança para descobrir vulnerabilidades em dispositivos eletrônicos e melhorar sua segurança, mas também por atacantes para acessar sistemas ou informações protegidas.
O hardware hacking pode envolver a manipulação física de componentes eletrônicos, a engenharia reversa de circuitos e dispositivos, a soldagem de componentes, a criação de interfaces personalizadas e a extração de dados de dispositivos de armazenamento. Todas essas técnicas exigem conhecimentos especializados em eletrônica e programação e podem ser perigosas se não forem realizadas com cuidado, pois podem danificar os dispositivos que se deseja analisar ou colocar em risco a segurança da pessoa que as realiza.
No hardware hacking, também são usadas técnicas associadas à perícia em hardware como parte do processo de engenharia reversa em componentes eletrônicos de um dispositivo. Isso significa que são utilizadas ferramentas e técnicas especializadas para recuperar, analisar e preservar dados de dispositivos eletrônicos. Isso pode incluir a extração de dados de discos rígidos, a análise de dados na memória RAM e a recuperação de dados excluídos.
Sem dúvida, essas técnicas mais específicas são importantes ao investigar crimes cibernéticos. Por exemplo, em casos em que é necessário obter dados de um dispositivo para investigação, para recuperar dados perdidos devido a falhas de hardware ou software, ou quando a utilização das técnicas de perícia em hardware deve seguir as normas e procedimentos adequados para garantir a integridade e autenticidade dos dados recuperados e evitar a alteração da evidência digital.
Ao analisar um dispositivo eletrônico, é necessário estudar seu funcionamento e cada uma das partes que o compõem, mas é um fato que cada dispositivo eletrônico tem sua própria natureza e estrutura de funcionamento. Embora o objetivo deste artigo não seja abordar todas as possíveis variantes tecnológicas existentes e suas técnicas de análise associadas, é um fato que atualmente a maior parte dos dispositivos eletrônicos contém componentes comuns. Um exemplo desses componentes comuns são os microcontroladores, que por meio do firmware, gerenciam e controlam a operabilidade dos dispositivos eletrônicos e grande parte de suas funções.
Seguindo essa linha, a seguir veremos algumas questões relacionadas à análise do firmware de microcontroladores que são fundamentais ao aplicar o hardware hacking.
Extrair e analisar o firmware de um dispositivo
O firmware é um programa executado de forma dedicada e com um propósito específico em um microcontrolador ou microprocessador. Geralmente, é armazenado em um dispositivo de memória persistente, como uma NAND/NOR flash ou EEPROM, e o processo de extração envolve a leitura e cópia da imagem do firmware armazenada na memória do dispositivo para um arquivo em nosso computador.
Esse processo de extração da imagem do firmware também é chamado de dumping ou snarfing e é vital para entender como um dispositivo funciona, seja um disco rígido, um roteador, uma câmera IP ou qualquer outro dispositivo que utilize microcontroladores (o que acontece na maioria dos dispositivos eletrônicos).
Dessa forma, extrair e analisar a imagem do firmware do microcontrolador de um dispositivo eletrônico nos permite entender seu funcionamento e, portanto, nos ajuda em nosso objetivo de estudo, que, como mencionamos anteriormente, pode ser desde detectar vulnerabilidades até melhorar ou alterar o comportamento do dispositivo.
Técnicas para extrair o firmware de um dispositivo
Existem várias técnicas que podem ser utilizadas para extrair o firmware de um dispositivo eletrônico. Antes de decidir qual caminho seguir para iniciar este processo, um dos pontos essenciais é certificar-se de que a imagem do firmware não está disponível no site do fabricante.
Muitos fabricantes de dispositivos publicam imagens de firmware atualizadas em seus sites para que os clientes possam baixar e atualizar o dispositivo. Nesse caso, o esforço para extrair o firmware é nulo, pois não teremos que fazer nada além de baixá-lo do site do fabricante.
Agora, uma vez que temos acesso físico ao dispositivo, uma técnica para extrair o firmware é ler diretamente a memória de armazenamento do dispositivo. Para isso, podemos identificar o chip de memória da placa, removê-lo, soldá-lo em outra placa e extrair o firmware. Embora funcione, pode ser bastante complicado e talvez um pouco arriscado, já que há a possibilidade de queimar o chip de memória durante o processo de extração.
Uma técnica menos arriscada é ler a memória de armazenamento do dispositivo por meio de uma conexão com o gerenciador de inicialização ou o sistema operacional do dispositivo. Por exemplo, com acesso ao gerenciador de inicialização (por meio de uma conexão serial), podemos tentar ler a memória do dispositivo e enviar os dados para nossa máquina. Da mesma forma, com acesso a um terminal de linha de comando no sistema operacional (serial, ssh, etc.) e com privilégios, podemos tentar despejar a memória de armazenamento do dispositivo e enviá-la para nossa máquina.
Como podemos ver, dependendo da situação, diferentes técnicas podem ser usadas para extrair o firmware de um dispositivo. Se nenhuma dessas técnicas for viável, a interface JTAG pode ser nossa melhor aliada. A seguir, explicamos o que é essa interface.
Extração de firmware de dispositivos usando JTAG:
JTAG (Joint Test Action Group) é uma interface de hardware físico que permite, entre outras coisas, extrair a imagem do firmware de dispositivos eletrônicos. Foi criada em 1985 para substituir os antigos sistemas de teste para placas de circuito impresso (PCB), conhecidos como bed-of-nails, e é parte do padrão IEEE 1149.1 para testar placas de circuito impresso durante o processo de fabricação.
Com o tempo, JTAG se tornou uma das interfaces mais populares para testar circuitos eletrônicos. Também adicionou outras funções, como depuração e gravação de dispositivos flash. Atualmente, essa interface está disponível na maioria dos processadores e microcontroladores de diferentes arquiteturas, como ARM, x86, MIPS e PowerPC.
Como funciona a interface JTAG
Vamos ver um pouco mais detalhadamente como funciona a interface JTAG em nível baixo.
Embora existam algumas variações do padrão, os fabricantes de chips geralmente implementam a interface JTAG por meio de quatro pinos obrigatórios (TDI, TDO, TCK, TMS) e um pino opcional (TRST):
- TDI (Entrada de Dados de Teste): entrada de dados.
- TDO (Test Data Out): saída de dados.
- TCK (Test Clock): relógio cuja frequência máxima depende do chip (normalmente de 10MHz a 100MHz).
- TMS (Test Mode Select): pino para controlar a máquina de estado JTAG.
- TRST (Test Reset): pino opcional para reiniciar a máquina de estados JTAG.
Os pinos da interface JTAG são conectados internamente ao chip por meio de um módulo chamado TAP (Test Access Port).
A interface TAP implementa o protocolo de comunicação JTAG básico e vários TAPs podem ser conectados simultaneamente em uma arquitetura do tipo Daisy Chain.
A interface TAP implementa uma máquina de estados finitos (16 estados) que permitem acessar um grupo de registros (IR, DR) para instrumentar o chip. O controle desta máquina de estados é feito através dos pinos TMS e TCK. Através desta máquina de estados, é possível selecionar uma operação através do registro IR (Registro de Instruções) e passar parâmetros ou verificar o resultado através do registro DR (Registro de Dados).
Normalmente, o fabricante do chip define o tamanho do registro IR e o número de instruções suportadas. Por exemplo, um registro IR de 5 bits suportará até 32 instruções.
Cada instrução tem seu próprio DR (Data Register), que tem um tamanho variável. Três instruções são definidas pelo padrão JTAG e devem ser implementadas pelo fabricante (BYPASS, EXTEST, SAMPLE/PRELOAD). Outras instruções são opcionais, mas também costumam ser implementadas (por exemplo, IDCODE).
- BYPASS: instrução que seleciona um registro de 1 bit que gira de TDI para TDO. Muito útil para testar a interface JTAG.
- EXTEST: instrução que seleciona o BSR (Boundary Scan Register) para ler e alterar o estado dos pinos.
- SAMPLE/PRELOAD: instrução que seleciona o registro BSR (Boundary Scan Register) para ler o estado dos pinos.
- IDCODE: instrução que seleciona o registro de identificação do dispositivo (32 bits) que contém a identificação do chip.
Além das instruções definidas pelo padrão, o fabricante do chip pode implementar outras instruções conforme necessário. Dessa forma, muitos fabricantes ampliam a interface JTAG com funções de depuração e acesso à memória.
As informações sobre as instruções JTAG suportadas e os pinos em um chip geralmente são documentadas em um arquivo chamado BSDL (Boundary Scan Description Language), e também em um subconjunto chamado VHDL (VHSIC Hardware Description Language).
O que podemos fazer na prática com JTAG
Vejamos o que podemos fazer na prática com esta interface sobre o firmware de um dispositivo.
Embora com JTAG possamos controlar a execução do firmware (parar a execução, inspecionar a memória, configurar pontos de interrupção, executar o código passo a passo, etc.), também podemos inspecionar o estado do processador e seus registros, ler e escrever na memória e acessar qualquer dispositivo de E/S conectado ao processador.
Através de uma função chamada Boundary Scan, a interface JTAG permite o acesso a todos os pinos do chip e desta forma podemos ler e escrever individualmente em cada pino e consequentemente manipular os periféricos conectados ao processador/microcontrolador (GPIO, memória, flash, etc.).
Concretamente, na prática com a interface JTAG podemos:
- Identificar informações sobre o hardware (processador, memória, etc.).
- Realizar o despejo de memória RAM e obter acesso a dados confidenciais, como senhas e chaves criptográficas.
- Mudar o comportamento dos programas em tempo de execução para obter acesso privilegiado ao sistema.
- Capturar dados confidenciais de dispositivos de hardware, como informações armazenadas em uma EEPROM.
- Ativar os periféricos e mudar seu comportamento, como estabelecer ou redefinir um pino de E/S.
- E o ponto central: despejar a memória flash para extrair o firmware do dispositivo.
Como vemos, a interface JTAG é perfeita para inspecionar a execução do firmware, encontrar vulnerabilidades e explorar o dispositivo.
E se a essa altura você está se perguntando por que muitos fabricantes de hardware não eliminam ou desabilitam o acesso a ela se é tão insegura, a resposta é simples: porque é muito útil na fase de desenvolvimento e produção de hardware, já que com este tipo de interface os desenvolvedores podem depurar o firmware que é executado no dispositivo de uma maneira prática e simples e também podem usá-lo como uma ferramenta para programar e testar os dispositivos em produção.
Embora também seja um fato que alguns fabricantes podem adotar contramedidas para dificultar o uso da interface JTAG no produto final, que incluem ofuscação (como cortar trilhas, remover resistores, etc.), reconfiguração dos pinos JTAG em software, criptografia e validação da assinatura da imagem do firmware, muitos outros fabricantes vão além e desabilitam completamente a interface JTAG através de uns fusíveis (bits internos do chip que, uma vez programados, já não podem ser alterados). Apesar de todas essas medidas, ainda é possível reativar a interface JTAG com técnicas como o silicon die attack, o que demonstra que a segurança é sempre uma questão que está ligada ao tempo, conhecimento e recursos disponíveis.
Como extrair o firmware usando JTAG
Quanto aos requisitos para a extração do firmware usando JTAG, na prática é importante que tenhamos alguns pontos presentes. Embora esta publicação não inclua uma prova de conceito real, vejamos os quatro principais passos que devemos ter em mente para extrair o firmware de um dispositivo usando JTAG:
- Identifique os pinos de conexão JTAG.
- Teste a conexão com um adaptador JTAG.
- Recolha informações sobre o mapeamento de memória do chip.
- Extraia o firmware da memória flash.
Conclusão
Após esta introdução ao hacking de hardware, fica claro que estamos falando de um universo amplo que envolve conhecimentos interdisciplinares em eletrônica, programação e outras áreas afins. Também fica claro que está longe de se limitar ao uso de dispositivos eletrônicos para realizar ataques cibernéticos.
Se você gostou desta introdução, encorajamos você a aprofundar o assunto e, por que não, colocar em prática essa informação e extrair o firmware.