
Intel Management Engine JTAG Prova de Conceito
Todas as informações são fornecidas apenas para fins educacionais. Siga estas instruções por sua conta e risco. Nem os autores nem seu empregador são responsáveis por qualquer dano direto ou consequente ou perda decorrente de qualquer pessoa ou organização que aja ou deixe de agir com base nas informações contidas nesta página.
Introdução
Software Necessário
Gerando o Payload
Gerando o Token de Desbloqueio
Preparando a Imagem SPI Flash
Integrando Arquivos na Imagem de Firmware
Desabilitando a Assinatura OEM
Construindo a Imagem de Firmware
Inicialização da CPU Principal
Gravando a Imagem na SPI Flash
Preparando o Cabo de Depuração USB
Aplicando Patches nos Arquivos de Configuração do OpenIPC
Descriptografando os Arquivos de Configuração do OpenIPC
Adicionando o Núcleo LMT à Configuração
Definindo a Variável de Ambiente IPC_PATH
Realizando uma Verificação Inicial da Operabilidade do JTAG
Exibindo a Thread do ME da CPU
Parando Núcleos
Depuração do ME: Início Rápido
Lendo Memória Arbitrária
Lendo a ROM
Por que TXE?
Lista de Plataformas Testadas
Autores
Licença
A vulnerabilidade INTEL-SA-00086 permite ativar o JTAG para o núcleo do Intel Management Engine. Desenvolvemos nosso PoC de JTAG para a plataforma Gigabyte Brix GP-BPCE-3350C. Embora recomendemos que futuros pesquisadores usem a mesma plataforma, plataformas de outros fabricantes com o chipset Intel Apollo Lake também devem suportar o PoC (para a versão TXE 3.0.1.1107).
A vulnerabilidade INTEL-SA-00086 envolve um estouro de buffer ao manipular um arquivo armazenado no MFS (o sistema de arquivos interno do ME). O caminho completo do arquivo é /home/bup/ct. Você precisará integrá-lo ao firmware do ME usando o Intel Flash Image Tool (FIT), uma das Ferramentas de Sistema da Intel fornecidas pela Intel a OEMs de hardware baseado em chipsets Intel PCH. Esta é a estrutura do diretório raiz do pacote Intel System Tools:

Os utilitários das Ferramentas de Sistema do Intel ME (TXE, SPS) não são destinados a usuários finais — portanto, você não os encontrará no site oficial da Intel. No entanto, alguns OEMs os publicam como parte de atualizações de software junto com drivers de dispositivos. Assim, para integrar nosso PoC, você precisa do Intel TXE System Tools versão 3.x, que pode ser encontrado online.
Você precisa instalar o Intel System Studio, cuja versão de avaliação pode ser baixada do site da Intel. Em nossos experimentos, usamos Intel System Studio 2018.
O PoC tem como alvo o firmware Intel TXE versão 3.0.1.1107. A imagem SPI Flash para Gigabyte GB-BPCE-3350C versão F5 contém a versão necessária do firmware.
Todos os nossos scripts são escritos em Python. Recomendamos usar Python 2.7. Os scripts também exigem o pacote pycrypto. Para instalar o pycrypto, execute o seguinte comando:
pip install pycrypto
Este utilitário só é necessário se você precisar inicializar a CPU.
EFI Human Interface Infrastructure (HII) é um mecanismo especial para criar uma interface de usuário na UEFI, bem como processar e gerenciar a entrada do usuário. O EFI HII identifica valores padrão para todas as opções, incluindo as ocultas. Assim que a opção relacionada a DCI é encontrada, ela pode ser ativada para a configuração padrão, e o DCI pode ser habilitado restaurando as configurações de fábrica do BIOS. Para inicializar a CPU principal, você precisa do AMI BIOS Configuration Program versão 5.xx, que também pode ser encontrado online.
Execute o script me_exp_bxtp.py:
me_exp_bxtp.py -f <file_name>
O script gera os dados necessários e os exporta para o arquivo especificado (indique o caminho completo do arquivo ou, dentro do diretório atual, apenas um nome, ct.bin por padrão). Este arquivo será usado posteriormente pelo FIT.
Execute o script me_utok_bxtp.py:
me_utok_bxtp.py -f <file_name>
O script gera os dados necessários e os exporta para o arquivo especificado (indique o caminho completo do arquivo ou, dentro do diretório atual, apenas um nome, utok.bin por padrão). Este arquivo será usado posteriormente pelo FIT.
Ignore esta etapa se você não precisar inicializar a CPU.
Para ativar a opção DCI Enable, execute o utilitário AMIBCP e use-o para abrir a imagem de firmware SPI fornecida com sua plataforma. Para o Gigabyte Brix GP-BPCE-3350C, abra o arquivo baixado do link da Gigabyte indicado acima (caminho do arquivo de imagem no arquivo compactado: F5/image.bin).

Agora precisamos habilitar a opção HDCIEN na aba Setup Configuration.
Para integrar os arquivos ct.bin e utok.bin, execute o utilitário FIT (fit.exe) e use-o para abrir a imagem de firmware SPI.

Se você estiver usando outra plataforma de hardware e não tiver acesso ao TXE 3.0.1.1107, você pode baixar uma imagem SPI Flash para Gigabyte GB-BPCE-3350C versão F5 e extrair a seção TXE por meio do FIT. O FIT extrai diferentes seções da imagem SPI completa (descritor SPI, firmware UEFI/BIOS, firmware Intel ME e Token de Desbloqueio) quando a imagem é aberta e as salva na pasta "nome_da_imagem"/Decomp.

Assim, você pode encontrar o arquivo com o firmware Intel TXE necessário em /Decomp/TXE Region.bin. Em seguida, no FIT, abra a imagem SPI da sua plataforma específica e substitua o arquivo que contém o firmware Intel TXE pela versão obtida da imagem GB Brix 3350c ("Intel(R) TXE Binary File" na aba Flash Layout):

Agora precisamos indicar no FIT os arquivos que geramos para /home/bup/ct e Unlock Token. Na aba Debug do FIT, você pode especificar o Trace Hub Binary e o Unlock Token para integrar ao firmware. Esses devem ser os arquivos que já geramos.

Simplesmente remova o campo OEM Public Key Hash do FIT:

Construa a imagem selecionando Build Image no menu Build.

Ignore a mensagem sobre as configurações de BootGuard (clique em "Sim"):

Se tudo tiver sido feito corretamente até este ponto, o processo de construção deve ser bem-sucedido e o FIT exibirá algo como a seguinte mensagem no console:

Ignore esta etapa se você não precisar inicializar a CPU.
Você precisa ativar o modo HAP para inicializar a CPU. O bit 0 do byte no offset +0x102 deve ser definido:

Para gravar a imagem na SPI flash, recomendamos fortemente o uso de um programador SPI.
Não deixe de fazer backup do firmware original para que você possa restaurá-lo se algo der errado!
Você precisará de um cabo de depuração USB 3.0 para conectar à plataforma. Compre um feito especialmente para esse fim ou monte um você mesmo a partir de um cabo USB 3.0 AM–AM, isolando os contatos D+, D- e Vcc.

A Intel desenvolve e fornece aos usuários dois pacotes de software que podem ser usados para depuração JTAG de plataformas e da CPU principal: DAL (DFx Abstraction Layer) e OpenIPC. Tanto o DAL quanto o OpenIPC fazem parte do Intel System Studio. Após a instalação do Intel System Studio 2018, o OpenIPC aparece no seguinte diretório:
Windows
C:\Intel\OpenIPC_1.1740.2381.100
Linux
/opt/intel/system_studio_2018/system_debugger_2018/debugger/openipc
A configuração do OpenIPC é criptografada e não suporta o núcleo TXE. Portanto, descriptografe a configuração e adicione uma descrição do TXE a ela.
Para descriptografar os arquivos de configuração, extraia a chave da biblioteca StructuredData (linux: libStructuredData_x64.so, Windows: StructuredData_x64.dll) em OpenIPC/Bin usando o script openipc_key_extract.py do IDA Pro. Passe a chave (no nosso caso, 4504fb02be0a9c4c84df2a89cf508bc3) para o script config_decryptor.py com o caminho para o diretório do OpenIPC.
config_decryptor.py –k 4504fb02be0a9c4c84df2a89cf508bc3 –p C:\Intel\OpenIPC
A versão fornecida do OpenIPC não tem as informações necessárias sobre o núcleo TXE. Portanto, precisamos aplicar um patch (patch.diff) aos arquivos de configuração descriptografados do OpenIPC. Veja como fazer:
patch -p2 < patch.diff
Após a descriptografia e o patch, defina a variável de ambiente IPC_PATH para o novo diretório do OpenIPC para que o ipccli use a versão modificada do OpenIPC. Por exemplo:
Windows
set IPC_PATH=c:\Intel\OpenIPC\Bin
O activator bloqueia carregamentos subsequentes mantendo o processo BUP em um loop após o JTAG ser ativado. Após o boot, a plataforma não mostrará nenhum sinal de vida (o monitor não liga, os indicadores do teclado não acendem e nenhum som de POST do BIOS é emitido). Portanto, você precisará verificar, por meio da depuração DCI, se a plataforma ficou "presa" no módulo BUP.
Assim como o DAL, a biblioteca OpenIPC inclui uma interface de linha de comando (CLI), escrita em Python e fornecida como biblioteca Python como parte do Intel System Studio, que pode ser instalada no sistema com a ajuda do pip. O pacote de instalação do ipccli está no seguinte caminho: Windows
<Program Files(x86)>\IntelSWTools\system_debugger_2018\debugger\ipccli\ ipccli-1.1740.544.100-py2.py3-none-any.whl
Linux
/opt/intel/system_studio_2018/system_debugger_2018/debugger/ipccli/ipccli-1.1811.727.100-py2.py3-none-any.whl
Para instalar o ipccli, execute o seguinte comando no console:
pip install ipccli-1.1740.544.100-py2.py3-none-any.whl
Depois de instalado, o ipccli fica disponível no ambiente de execução da versão correspondente do Python (aquela a partir da qual o pip foi invocado). Para começar a usar o OpenIPC, execute os seguintes comandos no console Python:
import ipccli
ipc = ipccli.baseaccess()
O mecanismo de conexão com a plataforma alvo via DCI é iniciado, resultando na seguinte saída no console:

Quando nenhuma conexão é estabelecida — por exemplo, se a plataforma não estiver ligada ou não estiver fisicamente conectada via DCI — as mensagens serão semelhantes às seguintes:

Se a conexão DCI for bem-sucedida, certifique-se de que o registrador PERSONALITY do dispositivo DFX_AGGRAGATOR seja igual a 3. O registrador PERSONALITY tem um código IR (Instruction Register) de 0x54. Para lê-lo, execute os seguintes comandos:
dfx_agg = ipc.devs.mdu_dfx_agg_tap0
ipc.irdrscan(dfx_agg, 0x54, 32)
Veja como deve ser o resultado desse comando:

O utilitário ipccli vem com documentação HTML bastante detalhada, que pode ser encontrada em uma pasta do pacote Python do ipccli:
<Python Dir>\Lib\site-packages\ipccli\html\Index.html
Se as etapas anteriores foram executadas corretamente, ao estabelecer uma conexão com a plataforma via ipccli, o núcleo TXE fica acessível por meio do CSE Tap, e o ipccli permite acessá-lo aplicando o seguinte caminho do ipccli:
ipc.devs.cse_c0.threads[0]
Mas como o PoC bloqueia o carregamento da plataforma até que a CPU principal seja inicializada, seus núcleos ficam inacessíveis via JTAG, e o núcleo do ME pode ser acessado pelo seguinte comando:
ipc.threads[0]
Para parar as instruções do processador do ME, execute o seguinte comando:
me = ipc.devs.cse_c0.threads[0]
me.halt()
Para parar as instruções do processador da CPU, execute o seguinte comando:
core = ipc.threads[0]
core.halt()

O console exibe o endereço lógico da instrução em que a parada foi feita.
O OpenIPC permite ler a memória após a parada, por exemplo:
ipc.threads[0].mem("0xf0080004P", 4)
Você pode especificar um endereço lógico (sel:offset), um endereço linear (modificador L) ou um endereço físico (modificador P).
O agente de sistema do ME (MISA) permite obter o endereço físico inicial da região da ROM, que inclui o vetor de reset do ME. Você pode obter o endereço da ROM por meio do registrador Hunit ROM Memory Base (HROMMB) no offset 0xe20 do MMIO do MISA (0xf0000000P):

A ROM sempre reside de ROMBASE até 0xffffffff Para copiar a ROM para um arquivo, execute o seguinte comando:
ipc.threads[0].memsave("<file path>", "0xfffe0000p", 0x20001)
É importante especificar o tamanho como 0x20001, em vez de 0x20000 (caso contrário, o OpenIPC encontra problemas devido a dificuldades com acesso de 64 bits, o que não é possível para o núcleo ME de 32 bits). O último byte do arquivo pode ser descartado, pois não faz parte da ROM.
A plataforma oferece mais oportunidades de depuração sem um adaptador especial Intel CCA-SVT e permite depurar os estágios mais iniciais do núcleo TXE por meio de um cabo de depuração USB comum.
Intel ME: The Way of the Static Analysis
Intel ME: Flash File System Explained
How to Hack a Turned-Off Computer or Running Unsigned Code in Intel Management Engine
Inside Intel Management Engine
Disabling Intel ME 11 via undocumented mode
Mark Ermolov (@_markel___)
Maxim Goryachy (@h0t_max)
Mark Ermolov (@_markel___)
Maxim Goryachy (@h0t_max)
Dmitry Sklyarov (@_Dmit)
Copyright (c) 2018 Mark Ermolov, Maxim Goryachy na Positive Technologies
É concedida permissão, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e dos arquivos de documentação associados (o "Software"), para lidar com o Software sem restrição, incluindo, sem limitação, os direitos de usar, copiar, modificar, mesclar, publicar, distribuir, sublicenciar e/ou vender cópias do Software, e de permitir que as pessoas a quem o Software for fornecido o façam, sujeito às seguintes condições: O aviso de direitos autorais acima e este aviso de permissão devem ser incluídos em todas as cópias ou partes substanciais do Software.
O SOFTWARE É FORNECIDO "NO ESTADO EM QUE SE ENCONTRA", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM DETERMINADO FIM E NÃO VIOLAÇÃO. EM NENHUM CASO OS AUTORES OU TITULARES DOS DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER REIVINDICAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM UMA AÇÃO DE CONTRATO, ATO ILÍCITO OU OUTRA, DECORRENTE DE, OU EM CONEXÃO COM, O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO SOFTWARE.