Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CustomProcessingUnit — The first analysis framework for CPU microcode | Kitploit
Tools/GitHubGitHub/pietroborrello/customprocessingunit
Static AnalysisDynamic Code Analysis (DAST)ExploitationReverse EngineeringDebuggersHardware SecurityPayload DevelopmentFirmware Analysis
GitHubpietroborrello/customprocessingunit

CustomProcessingUnit

The first analysis framework for CPU microcode

Repository anzeigen
41127vor 3 JahrenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Custom Processing Unit

DOI

Custom Processing Unit ist das erste dynamische Analyse-Framework, das in der Lage ist, CPU-Mikrocode auf Software-Ebene zu hooken, zu patchen und zu tracen.

Es funktioniert durch die Nutzung undokumentierter Befehle in Intel-CPUs, die Zugriff auf den CRBUS ermöglichen. Mithilfe unseres Mikrocode-Decompilers haben wir per Reverse Engineering herausgefunden, wie die CPU den CRBUS nutzt, und durch Nachbildung der Interaktionen haben wir volle Kontrolle über die CPU.

Das Static-Analysis-Framework finden Sie als Subtree in diesem Ordner oder unter https://github.com/pietroborrello/ghidra-atom-microcode.

Schauen Sie sich unsere Folien zu dieser Arbeit hier an.

Hinweis: Custom Processing Unit erfordert eine Red-Unlocked-CPU: Derzeit haben nur Goldmont-CPUs (GLM) einen öffentlichen Red Unlock. Wir haben Gigabyte GB-BPCE-3350C mit CPU-Stepping 0x9 und 0xa getestet (CPUID 0x000506C9 und 0x000506CA).

Custom Processing Unit besteht aus einer UEFI-Anwendung und einigen Bibliotheken. Die UEFI-Anwendung interagiert mit der GLM-CPU, während die Bibliotheken verschiedene Helfer bereitstellen, um Mikrocode in die UEFI-Anwendung zu kompilieren und ihre Ausgabe zu analysieren.

Voraussetzungen

  1. Befolgen Sie die Schritte zum Red-Unlock Ihrer Goldmont-CPU von https://github.com/ptresearch/IntelTXE-PoC.
  2. Erstellen Sie einen bootfähigen USB-Stick mit einer EFI-Shell.
  3. Installieren Sie gnu-efi auf Ihrem Hauptsystem.

Einrichtung

root@kitploit:~
GNU_EFI_DIR=<path_to_gnu_efi> make

Dies erstellt die Mikrocode-Quelldateien und die UEFI-Anwendung in cpu.efi. Kopieren Sie cpu.efi in den Ordner \EFI\ des USB-Sticks, stecken Sie ihn in den GLM und booten Sie in die EFI-Shell.

Führen Sie in der EFI-Shell map -r aus, um das USB-Stick-Gerät zu identifizieren, und <deviceid>: zum Einhängen.

Custom Processing Unit ausführen

Führen Sie ./cpu.efi aus, um die Hilfe anzuzeigen:

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]

Einfache Anweisungen

cpu bietet Helfer, um einfache Anweisungen von der Befehlszeile aus auszuführen:

  • cpuid
  • rdmsr
  • wrmsr

Komplexe Aktionen

cpu bietet Schnittstellen zu komplexen CPU-Routinen, deren Ausführung zur Untersuchung des CPU-Verhaltens interessant ist:

  • u: aktualisiert das CPU-Ucode mit dem bereitgestellten (signierten) Patch
  • f: sammelt Performance-Zähler während der Ausführung von Mikrocode

Raw udbgrd und udbwr

cpu bietet rohe Schnittstellen zu den undokumentierten Anweisungen udbrd und udbgwr. Die interessantesten Befehle, die sie bereitstellen, sind:

  • 0x0: Zugriff auf CRBUS
  • 0x10: Zugriff auf UROM
  • 0x40: Zugriff auf stgbuf
  • 0xd8: Ucode-Routine ab Adresse aufrufen

LDAT-Zugriff

cpu stellt LDAT-Zugriffsroutinen zum Lesen und Schreiben bereit. Geben Sie die Parameter [port] [array] [bank] [idx] [addr] an, um dort zu lesen oder zu schreiben. Interessante Ports sind:

  • 0x6a0: Mikrocode-Sequenzer, der Zugriff auf das interne Ucode-ROM und RAM hat
  • 0x120: Load/Store-Puffer
  • 0x3c0: Befehlscache
  • 0x630: ITLB

Bitte beachten Sie, dass der Zugriff auf einige dieser internen Komponenten dazu führen kann, dass die CPU einfriert.

Mikrocode patchen

cpu bietet Funktionen zum Installieren von Patches im Mikrocode.

  1. Schreiben Sie Ihren Mikrocode-Patch in bios/ucode_patches/ucode_patch.u (sehen Sie sich die anderen Patches als Beispiele an).
  2. Erstellen Sie die UEFI-Anwendung.
  3. Führen Sie cpu.efi p aus, um den Patch an der in .org angegebenen Adresse zu installieren.

Beachten Sie, dass im Mikrocode nur die Adressen zwischen 0x7c00 und 0x7e00 beschreibbar und für Patches sinnvoll sind.

Bei Ausführung von cpu.efi x wird zusätzlich der gepatchte Mikrocode ausgeführt und die Register rax, rbx, rcx, rdx als Ergebnis ausgegeben.

Match & Patch

Um Mikrocode automatisch bei bestimmten CPU-Ereignissen oder Mikrocode-Punkten auszuführen, nutzt cpu das Match & Patch. Es definiert eine Mikrocode-Adresse, die gehookt werden soll, und die Mikrocode-Adresse, zu der beim Auslösen des Hooks gesprungen werden soll.

  • z: setzt das gesamte Match & Patch zurück.
  • h: installiert einen Hook, gegeben einen Index (0-0x20), eine zu hookende Adresse (0-0x7c00) und eine Zieladresse für die Ausführung (0x7c00-0x7e00).

Mikrocode-Tracing

Durch die Installation mehrerer Hooks und die kontinuierliche Ausführung einer Anweisung kann cpu die von einer solchen Anweisung durchgeführten Mikrooperationen aufzeichnen und ausgeben. Zum Aufzeichnen:

  1. Schreiben Sie die aufzuzeichnende Anweisung nach dem // [TRACED INSTRUCTION HERE] in get_trace_clock_at().
  2. Erstellen Sie die UEFI-Anwendung.
  3. Zeichnen Sie mit cpu.efi m auf. Es wird eine Datei trace.txt erstellt, die alle getroffenen Adressen enthält.
  4. Führen Sie uasm-lib/uasm.py -t trace.txt > parsed_trace.txt aus. Es wird ein vollständiges Trace des während der Anweisung ausgeführten Mikrocodes erzeugt.

Beachten Sie, dass uasm.py die Dateien ms_arrayX.txt in seinem Ordner verwendet, um eine Disassemblierung der ausgeführten Mikroinstruktionen zu erzeugen. Diese gelten für GLM mit Stepping 0x9 (CPUID 0x000506C9). Bitte erzeugen Sie die passenden Arrays, falls Sie ein anderes Stepping haben. Sie können zu diesem Zweck die LDAT-Dump-Funktionen nutzen.

Dumper für geheimen Speicher

Die CPU besitzt verschiedene aus Sicht der Architektur unzugängliche Puffer, für die wir Routinen zum Dumpen bereitstellen:

  • smm: SMROM (oder jede andere Adresse, während der SMM-Schutz deaktiviert ist)
  • rom: internes ROM
  • imms: hartkodierte CPU-Immediates
  • msrs: interne MSR-Konfigurationen

Mikrocode-Patches schreiben

Wir stellen einen Assembler bereit, der Header-Dateien erzeugt, die in die UEFI-Anwendung cpu.efi kompiliert werden. Schauen Sie sich für die Syntax die bereitgestellten Patches in bios/ucode_patches an. Er unterstützt einfache Operationen und Labels. Assemblieren Sie einen Mikrocode-Patch mit uasm.py -i ucode_patch.u -o ucode_patch.h. cpu.efi wird kompiliert und den Mikrocode-Patch, den Sie anwenden möchten, automatisch einbinden.

Beispiel

Datei: code_patch.u

root@kitploit:~
.org 0x7c00

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

Kompilieren Sie neu und führen Sie dann auf dem GLM aus:

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

Nun gibt rdrand jedes Mal 0x1337 in den Registern zurück.

Zitieren

Unsere Arbeit wurde in einem Paper auf dem WOOT 2023 veröffentlicht:

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},
}

Experimente

Die im Paper beschriebenen Experimente können mit folgendem Befehl ausgeführt werden:

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

wobei [exp_idx]:

  1. Schnelle Ucode-Breakpoints
  2. Konstantzeit-Ucode-Division
  3. x86 PAC
  4. Angriff auf x86 PAC mit PACMAN
  5. Bedingte Hardware-Breakpoints
Tool herunterladen