Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CustomProcessingUnit — The first analysis framework for CPU microcode | Kitploit
Strumenti/GitHubGitHub/pietroborrello/customprocessingunit
Static AnalysisDynamic Code Analysis (DAST)ExploitationReverse EngineeringDebuggersHardware SecurityPayload DevelopmentFirmware Analysis

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi
GitHub
pietroborrello/customprocessingunit

CustomProcessingUnit

The first analysis framework for CPU microcode

Vedi Repository
411273 anni faRevisionato da Kitploit

Custom Processing Unit

DOI

Custom Processing Unit è il primo framework di analisi dinamica in grado di agganciare, patchare e tracciare il microcodice della CPU a livello software.

Funziona sfruttando istruzioni non documentate nelle CPU Intel che consentono l'accesso al CRBUS. Usando il nostro decompilatore di microcodice abbiamo effettuato il reverse engineering di come la CPU utilizza il CRBUS e, replicando le interazioni, abbiamo il pieno controllo della CPU.

Il framework di analisi statica è disponibile come subtree in questa cartella, oppure su https://github.com/pietroborrello/ghidra-atom-microcode.

Consulta le nostre slide che descrivono questo lavoro qui.

Nota: Custom Processing Unit richiede una CPU Red-Unlocked: attualmente, solo le CPU Goldmont (GLM) hanno una Red Unlock pubblica. Abbiamo testato Gigabyte GB-BPCE-3350C con CPU stepping 0x9 e 0xa (cpuid 0x000506C9 e 0x000506CA).

Custom Processing Unit è composta da un'applicazione UEFI e da alcune librerie. L'applicazione UEFI interagisce con la CPU GLM, mentre le librerie forniscono diversi helper per compilare il microcodice nell'applicazione UEFI e analizzarne l'output.

Prerequisiti

  1. Segui i passaggi per eseguire la red unlock della tua CPU Goldmont da https://github.com/ptresearch/IntelTXE-PoC.
  2. Crea una chiavetta USB avviabile con una shell EFI
  3. Installa gnu-efi sul tuo host principale

Configurazione

root@kitploit:~
GNU_EFI_DIR=<path_to_gnu_efi> make

Questo compilerà i file sorgente del microcodice e l'applicazione UEFI in cpu.efi. Copia cpu.efi nella cartella \EFI\ della chiavetta USB, inseriscila nella GLM e avvia la shell EFI.

Esegui map -r nella shell efi per identificare il dispositivo della chiavetta USB e <deviceid>: per montarlo.

Eseguire Custom Processing Unit

Esegui ./cpu.efi per stampare l'aiuto:

root@kitploit:~
Usage:
  patch:        <tool> p
  patch & exec: <tool> x
  perf:         <tool> f
  zero out m&p: <tool> z
  hook:         <tool> h  [m&p idx] [uop addr] [patch addr]
  template:     <tool> m
  dump imms:    <tool> di
  dump rom:     <tool> dr
  dump msrs:    <tool> dm
  dump SMM:     <tool> ds [address] [size]
  cpuid:        <tool> c  [rax] [rcx]
  rdmsr:        <tool> rm [msr]
  wrmsr:        <tool> wm [msr]
  read:         <tool> r  [cmd] [addr]
  write:        <tool> w  [cmd] [addr] [value]
  invoke:       <tool> i  [addr]
  update ucode: <tool> u  [size]
  ldat read:    <tool> lr [port] [array] [bank] [idx] [addr] [optional size]
  ldat write:   <tool> lw [port] [array] [bank] [idx] [addr] [value]

Istruzioni semplici

cpu fornisce helper per eseguire semplici istruzioni dalla riga di comando:

  • cpuid
  • rdmsr
  • wrmsr

Azioni complesse

cpu fornisce interfacce a routine complesse della CPU che è interessante eseguire per studiarne il comportamento:

  • u: aggiorna l'ucode della CPU con la patch (firmata) fornita
  • f: raccoglie i contatori delle prestazioni durante l'esecuzione del microcodice

Interfacce raw udbgrd e udbwr

cpu fornisce interfacce raw alle istruzioni non documentate udbrd e udbgwr. I comandi più interessanti che forniscono sono:

  • 0x0: accesso al CRBUS
  • 0x10: accesso all'UROM
  • 0x40: accesso a stgbuf
  • 0xd8: invoca la routine ucode dall'indirizzo

Accesso LDAT

cpu espone routine di accesso LDAT per leggere e scrivere. Specifica i parametri [port] [array] [bank] [idx] [addr] per leggere o scrivere lì. Le porte interessanti sono:

  • 0x6a0: sequencer del microcodice, che ha accesso alla ROM e alla RAM ucode interne
  • 0x120: buffer load/store
  • 0x3c0: cache delle istruzioni
  • 0x630: ITLB

Nota: l'accesso ad alcuni di questi componenti interni potrebbe causare il blocco della CPU.

Patch del microcodice

cpu fornisce funzionalità per installare patch nel microcodice.

  1. Scrivi la tua patch di microcodice in bios/ucode_patches/ucode_patch.u (guarda le altre patch per esempi)
  2. Compila l'applicazione UEFI
  3. Esegui cpu.efi p per installare la patch all'indirizzo fornito in .org.

Nota che nel microcodice, solo gli indirizzi tra 0x7c00 e 0x7e00 sono scrivibili e significativi per la patch.

Eseguendo cpu.efi x, eseguirà anche il microcodice patchato e stamperà i registri rax, rbx, rcx, rdx come risultato.

Match & Patch

Per eseguire automaticamente il microcodice in determinati eventi della CPU o punti del microcodice, cpu sfrutta il Match and Patch. Definisce un indirizzo di microcodice da agganciare (hook) e l'indirizzo di microcodice a cui saltare quando l'hook viene attivato.

  • z: reimposta tutto il match & patch.
  • h: installa un hook, dato un indice (0-0x20), un indirizzo da agganciare (0-0x7c00) e un indirizzo target da eseguire (0x7c00-0x7e00).

Tracciamento del microcodice

Installando più hook ed eseguendo continuamente un'istruzione, cpu è in grado di tracciare le microoperazioni eseguite da tale istruzione e di scaricarle (dump). Per tracciare:

  1. Scrivi l'istruzione da tracciare dopo // [TRACED INSTRUCTION HERE] in get_trace_clock_at().
  2. Compila l'applicazione UEFI.
  3. Traccia con: cpu.efi m. Creerà un file trace.txt che contiene tutti gli indirizzi che sono stati raggiunti.
  4. Esegui uasm-lib/uasm.py -t trace.txt > parsed_trace.txt. Genererà una traccia completa del microcodice eseguito durante l'istruzione.

Nota che uasm.py utilizzerà i file ms_arrayX.txt nella sua cartella per generare un disassembly delle microistruzioni eseguite. Questi sono per GLM con stepping 0x9 (cpuid 0x000506C9). Genera gli array corretti nel caso tu abbia uno stepping diverso. Puoi usare le funzionalità di dump LDAT per questo scopo.

Dumper di memorie segrete

La CPU ha diversi buffer inaccessibili dall'architettura, per i quali forniamo routine per il dump:

  • smm: SMROM (o qualsiasi altro indirizzo disabilitando la protezione SMM)
  • rom: ROM interna
  • imms: immediati hardcoded della CPU
  • msrs: configurazioni interne degli MSR

Scrivere patch di microcodice

Forniamo un assembler che genera file header da compilare nell'applicazione UEFI cpu.efi. Guarda le patch fornite in bios/ucode_patches per la sintassi. Supporta semplici operazioni ed etichette. Assembla una patch di microcodice con uasm.py -i ucode_patch.u -o ucode_patch.h. cpu.efi verrà compilato e includerà automaticamente la patch di microcodice che vuoi applicare.

Esempio

file: code_patch.u

root@kitploit:~
.org 0x7c00

rax:= ZEROEXT_DSZ32(0x00001337)
rbx:= ZEROEXT_DSZ32(0x00001337)
rcx:= ZEROEXT_DSZ32(0x00001337)
rdx:= ZEROEXT_DSZ32(0x00001337)

ricompila, quindi esegui nella GLM:

root@kitploit:~
cpu.efi z # zero out match & patch
cpu.efi p # apply the patch
cpu.efi h 0 0x0428 0x7c00 # rdrand entry point

ora ogni volta che rdrand viene eseguita, restituirà 0x1337 nei registri.

Come citarci

Il nostro lavoro è stato pubblicato in un articolo al WOOT 2023:

root@kitploit:~
@inproceedings{Borrello2023CustomProcessingUnit,
    title = {{CustomProcessingUnit}: Reverse Engineering and Customization of Intel Microcode},
    author = {Borrello, Pietro and Easdon, Catherine and Schwarzl, Martin and Czerny, Roland and Schwarz, Michael},
    booktitle = {IEEE Workshop on Offensive Technologies (WOOT 23)},
    year = {2023},
}

Esperimenti

Gli esperimenti descritti nell'articolo possono essere eseguiti con:

root@kitploit:~
cpu.efi e [exp_idx]

con [exp_idx]:

  1. Breakpoint ucode rapidi
  2. Divisione ucode a tempo costante
  3. x86 PAC
  4. Attacco a x86 PAC con PACMAN
  5. Breakpoint hardware condizionali
Scarica lo strumento