Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
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.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
Bootjack — Exploit-Tooling für den EDK II UEFI PXE ICMP-Fehlerüberlauf (CVE-2026-97631): erstellt gefälschte ICMP-Pakete, platziert ein nachgeahmtes EFI_EVENT und gibt den DXE-Speicher über UART aus. | Kitploit
Tools/GitHubGitHub/rayanziani/bootjack
Embedded-System-SicherheitPaket-Sniffing & AnalyseSchwachstellenanalyseExploitationShellcodeNetzwerksicherheitHardware- & IoT-SicherheitPayload-EntwicklungFirmware-AnalyseBinary-Exploitation
GitHub
1vor 5 TagenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
rayanziani/bootjack

Bootjack

Exploit-Tooling für den EDK II UEFI PXE ICMP-Fehlerüberlauf (CVE-2026-97631): erstellt gefälschte ICMP-Pakete, platziert ein nachgeahmtes EFI_EVENT und gibt den DXE-Speicher über UART aus.

Repository anzeigen

CVE-2026-97631: Pre-Boot-DXE-Speicherleser

Tooling für den ICMP-Fehlerüberlauf des EDK II PXE Base Code-Treibers (NetworkPkg/UefiPxeBcDxe, GHSA-99cj-7hg9-mp4m, CVSS 4.0 9.5).

Während eines PXE-Boots kopiert der Treiber eine ICMP-Fehlermeldung in einen festen 504-Byte- Puffer. Eine längere Nachricht wird zu einem linearen Schreibvorgang über diesen Puffer hinaus in den DXE- Pool. Da das Schreibziel die Adresse des Puffers selbst ist, ist die Nutzlast positionsunabhängig: Byte i des Datagramms landet bei &Mode->IcmpError + i. Der Überlauf platziert ein gefälschtes EFI_EVENT; der DXE-Kern leitet es über den normalen CoreSignalEvent-Pfad weiter; die Nutzlast stellt das Ereignis aus einem Snapshot wieder her, durchläuft vom Bediener gewählte Speicherbereiche und gibt EFI_SUCCESS zurück, damit der Boot fortgesetzt wird.

Der Wirkungsbereich bleibt innerhalb des DXE-Speichers der Firmware selbst. Kein Flash-Schreibvorgang, kein Persistenzmechanismus, kein Betriebssystem-Artefakt.

Aufbau

include/pxe_layout.h   EFI_PXE_BASE_CODE_ICMP_ERROR, IEVENT offsets, wire structs
include/craft.h        one packet = one primitive
include/graft.h        counterfeit event + payload parameter block
include/layout.h       the overflow region (single source of truth)
src/payload.S          ring-0 payload: restore, walk ranges, stream out
src/craft.c            packet construction, IPv4 + IPv6
src/graft.c            IEVENT overlay, parameter block
src/layout.c           overflow assembly, shared by sender and simulator
src/main.c             pxeinj: sniff xid, probe, send
src/net.c              raw L3 transport, DHCP xid sniffer
src/recv.c             pxerecv: serial collector, dump + map
sim/sim.c              host harness that proves the chain
tools/fw_offsets.py    pool offsets from a debug firmware build

Build

Payload:

as --64 -o build/payload.o src/payload.S
ld -Ttext=0 -e payload_start --oformat elf64-x86-64 -o build/payload.elf build/payload.o
objcopy -O binary --only-section=.text build/payload.elf build/payload.bin

Ergebnis ist 378 Bytes, positionsunabhängig, ohne Relokationen.

Sender und Empfänger sind POSIX (AF_PACKET, IP_HDRINCL, termios) und lassen sich mit make unter Linux bauen. Der Simulator lässt sich mit MSVC über Makefile.win bauen:

cl /nologo /W3 /O2 /Iinclude /Fe:build\sim.exe sim\sim.c src\craft.c src\graft.c src\layout.c

Die Kette, wie vom Simulator nachgewiesen

build/sim.exe mappt eine gefälschte Pool-Seite, schreibt den Overflow dorthin, wo das verwundbare memcpy ihn schreiben würde, prüft, ob das resultierende IEVENT die Payload dispatchen würde, ruft die Payload als echten Maschinencode auf und verifiziert anschließend:

  • das Event byteweise wiederhergestellt ist
  • die gedumpten Bytes dem Quellbereich entsprechen
  • die Open/Close-Frames intakt sind, sodass ein abgeschnittener Dump unterscheidbar ist
  • eine tote UART den Aufruf nicht zum Hängen bringt
  • die ICMP-Datagramm-Prüfsummen verifizieren und der Overflow an dem Offset landet, von dem der Treiber kopiert
  • die eingebettete BOOTP-xid unverändert überlebt

26 Prüfungen über Layout, ABI, Framing und Paketkonstruktion. Dies beweist, dass die Teile zueinander passen. Es beweist nicht die Pool-Adresse einer bestimmten Firmware, die eine Laufzeit-Allokation ist.

Betrieb

Zwei Modi, in dieser Reihenfolge zu verwenden.

Probe: nur legaler Pfad, kein Out-of-Bounds-Schreiben.

pxeinj --target 10.0.0.50 --spoof 10.0.0.1 --sniff --probe --send

Ein wohlgeformter ICMP-Fehler mit 504 Byte. Gleicher Spoof, gleiche eingebettete BOOTP-Transaktion, alles identisch. Wenn der Client weiterhin bootet, wurde der Fehler akzeptiert und die verwundbare Kopierschleife erreicht. Zerstörungsfreie Bestätigung, und sie benötigt keine Pool-Adresse.

Overflow: weigert sich zu bauen, bis drei Dinge vorhanden sind: die Pool-Basis (tools/fw_offsets.py), die unveränderten Event-Bytes (--shadow) und mindestens ein Bereich.

pxeinj --target 10.0.0.50 --spoof 10.0.0.1 --xid 0xdeadbeef \
       --pool-base 0x7f12345000 --payload build/payload.bin \
       --ranges ranges.txt --shadow shadow.bin --uart 0x3f8 --send

pxerecv -d /dev/ttyUSB0 -o dump.bin -m dump.map

ranges.txt enthält eine START-END-Angabe pro Zeile, hexadezimal ohne 0x; siehe ranges.example.txt für die Größen- und Zeitbudgetierung. Der v6-Overflow-Pfad ist deaktiviert: Die Probe funktioniert über v6, der Schreibvorgang nicht, bis die v6-Kopiergrenze aus dem gepatchten Quellcode neu abgeleitet wurde.

Warum es unauffällig ist

  • keine Boot-Services-Allokation, kein Logging und kein Lock innerhalb der Payload
  • keine IDT/GDT/CR/MSR-Änderungen, keine Interrupt-Hooks, keine Debug-Register
  • das Objekt wird vor dem Start des Dumps wiederhergestellt, nicht danach
  • die Ausgabe erfolgt über abgefragte UART, sodass nichts in einem firmwareverwalteten Puffer landet
  • gibt auf dem normalen Notify-Pfad EFI_SUCCESS zurück, sodass der Boot fortgesetzt wird
  • das SignalLink des Events ist selbstkonsistent, sodass der Listendurchlauf keine Assertion auslöst

Restspuren sind dem Bug inhärent: Das Event wurde zu einem Zeitpunkt signalisiert, zu dem es normalerweise nicht signalisiert würde, die Pool-Seite bleibt schmutzig, und wenn die Plattform DXE mit einem TPM misst, ist der PCR-Wert derjenige, der beim Start des Bootvorgangs galt. Alles darüber hinaus ist keine Eigenschaft dieses Bugs.

Sicherheitsvorkehrungen im Code

  • --send ist erforderlich; standardmäßig wird ein Dry Run ausgeführt
  • der Overflow weigert sich zu bauen ohne --pool-base, --payload, --shadow und eine nicht leere Bereichsliste. Jede dieser Angaben kann die Firmware auf eine bestimmte Weise beschädigen, wenn sie geraten wird, daher ist keine optional
  • --shadow muss an der erwarteten Position eine EFI_EVENT-Signatur enthalten, was eine mit Nullen gefüllte Datei und ein falsches --event-off in einer einzigen Prüfung erkennt statt erst zur Dispatch-Zeit
  • die Probe ist ein separater Modus und kann nicht außerhalb der Grenzen schreiben
  • die UART-Abfrage ist begrenzt, sodass ein fehlender 16550 einen Bootvorgang nicht aufhängen kann; sobald die Schätzung erschöpft ist, wird die UART verworfen und die RAM-Senke, falls vorhanden, läuft weiter
  • der Close-Frame macht eine Truncation sichtbar statt stillschweigend

Grenzen

  • Die Pool-Adresse von Mode->IcmpError ist eine Laufzeitallokation und unterscheidet sich je Firmware-Build. Sie kann nicht aus einer Link Map abgeleitet werden. tools/fw_offsets.py liefert die Offsets; die Basis muss auf der Ziel-Firmware gemessen werden, zum Beispiel aus einem DEBUG_POOL-Trace, und dann zwischengespeichert werden.
  • sizeof(EFI_PXE_BASE_CODE_MODE) und offsetof(..., IcmpError) ändern sich zwischen edk2-Releases. Die Standardwerte in tools/fw_offsets.py sind Ausgangspunkte, keine Werte, denen man vertrauen sollte.
  • Der genaue Ausdruck, aus dem die fehlerhafte Kopiergrenze berechnet wird, wird im Advisory nicht angegeben, und der Fix (#13302) ändert ihn. Lies die beiden DpcHandle- Funktionen im Zielbaum, bevor du dich auf den Overflow-Offset verlässt.
  • Das Wiederherstellen des Events erfordert einen Snapshot, der vor dem Overflow aufgenommen wurde. Ohne ihn schreibt die Wiederherstellung Nullen und hinterlässt ein beschädigtes Event in der Signal- Liste des Cores, in das der nächste CoreSignalEvent hineinläuft. Aus diesem Grund verweigert das Tool den Build ohne --shadow.
Tool herunterladen