Donor-Profile und der Shadow Config Space
Was eine Donor-Identität auf Registerebene ist: Vendor- und Device-ID, Subsystem-IDs, BAR-Größen und Capability-Liste. Und warum ein plausibler Donor besser ist als ein generischer.
Kurze Antwort
Ein Donor-Profil ist die Identität eines echten PCIe-Geräts. Deine Karte schreibt sie in den Shadow Config Space und zeigt sie dem Host. Darin stehen Vendor-ID, Device-ID, die Subsystem-IDs, die BAR-Struktur und die Capability-Liste. Ein plausibler Donor liest sich wie normale Hardware. Ein generischer oder einer, den viele Karten teilen, ist ein Muster, das jeder auflisten kann.
Auf dieser Seite10
- Der Konfigurationsbereich ist das Erste, wonach alles fragt
- Der Shadow Config Space, und warum er beschreibbar ist
- Die Felder, und was jedes davon einem Beobachter verrät
- Warum plausibel besser ist als exotisch
- Was einen Donor plausibel macht
- Warum zwei Leute auf einem Donor schlechter dran sind als zwei mit gewöhnlichen Profilen
- Was ein Donor-Profil nicht leistet
- Fragen, die sich vor dem Kauf eines Profils lohnen
- Fragen zu Donoren
- Quellen
Der Konfigurationsbereich ist das Erste, wonach alles fragt
Jedes PCIe-Gerät trägt einen kleinen Registerblock, den Konfigurationsbereich. Der Host liest ihn bei der Enumeration und bekommt damit Antwort auf drei Fragen. Wer bist du, welche Geräteklasse bist du, und wie viel Adressraum willst du. Windows wählt anhand der Antworten einen Treiber. Alles andere, was auf dieser Maschine läuft, kann dieselben Register lesen. Diese Antworten liefert die Firmware deiner Karte. Der Konfigurationsbereich ist also die öffentliche Identität der Karte — egal, ob du seinen Inhalt bewusst gewählt hast oder nicht.
Der Shadow Config Space, und warum er beschreibbar ist
In einem unveränderten FPGA-Design beantwortet der PCIe-Hardblock Konfigurationszugriffe aus Werten, die bei der Synthese festgelegt wurden. DMA-Firmware legt eine beschreibbare Ebene von 4 KB im Block-RAM davor — den Shadow Config Space — und antwortet stattdessen daraus. In der öffentlichen pcileech-fpga-Linie steckt das in einer Koeffizientendatei, die in den Bitstream kompiliert wird. Die Identität der Karte ist damit Daten und kein Silizium. Genau deshalb lässt sich Firmware ohne neue Hardware um einen anderen Donor herum neu bauen.
Die Felder, und was jedes davon einem Beobachter verrät
Die Offsets zählen ab dem Anfang des Konfigurationsbereichs des Geräts. Entscheidend ist die letzte Spalte. Sie sagt nicht, wofür das Feld da ist, sondern was jemand erfährt, der es liest.
| Offset | Feld | Was darin steht | Was es einem Beobachter verrät |
|---|---|---|---|
| 0x00 | Vendor ID | Ein 16-Bit-Code, den die PCI-SIG dem Hersteller zuteilt | Welche Firma das angeblich gebaut hat. Ein nicht vergebener Wert oder ein bekannter FPGA-Hersteller auf einer Platine, die eine Netzwerkkarte sein will, ist ein sofortiger Widerspruch |
| 0x02 | Device ID | Ein 16-Bit-Code, den der Hersteller einem konkreten Produkt zuweist | Welches Produkt das genau sein will. Zusammen mit der Vendor-ID benennt es ein reales Teil, das es entweder gibt oder nicht |
| 0x08 | Revision ID | Die Silizium-Revision dieses Teils | Ob diese Revision jemals mit dieser Device-ID ausgeliefert wurde. Eine Revision, die es in keinem Produkt gab, ist für sich schon ein Widerspruch |
| 0x09-0x0B | Class code | Basisklasse, Unterklasse und Programmierschnittstelle | Zu welcher Kategorie das Gerät gehört. Ein Class Code, der nicht zur Device-ID passt, ist eine der billigsten Prüfungen überhaupt |
| 0x10-0x27 | BAR0 bis BAR5 | Base Address Register: wie viele Bereiche das Gerät anfordert, wie groß, Speicher oder I/O, prefetchable oder nicht | Der Speicherbedarf, den das echte Teil anmelden würde. Ein Donor mit 4 KB in BAR0 und eine Firmware, die etwas anderes anfordert, passen nicht mehr zu dem Teil, das sie zu sein vorgeben |
| 0x2C | Subsystem Vendor ID | Wer die Platine gebaut hat, auf der der Chip sitzt | Ob die Karte ein Referenzdesign oder eine bestimmte OEM-Variante ist. Bei Hardware aus erster Hand oft identisch mit der Vendor-ID |
| 0x2E | Subsystem ID | Welche Platinenvariante dieses Integrators | Das am seltensten mitkopierte Feld in schlechter Firmware. Ein echter Chip mit leerem oder unsinnigem Subsystem-Paar ist für sich schon ein starkes Signal |
| 0x34 | Capabilities pointer | Der Offset des ersten Eintrags in der verketteten Capability-Liste | Dass das Gerät überhaupt Capabilities hat. Ein Zeiger ins Leere ist auf eine Weise fehlerhaft, wie es normale Hardware nicht ist |
| 0x40+ | Capability-Liste | Verkettete Liste: Power Management, MSI oder MSI-X, die PCI-Express-Capability selbst, herstellerspezifische Einträge | Welche Funktionen das Teil unterstützt. Beim echten Gerät hat die Liste einen bestimmten Umfang in einer bestimmten Reihenfolge, und eine kürzere oder umsortierte Liste passt nicht dazu |
| 0x100+ | Erweiterte Capabilities | Der erweiterte PCIe-Bereich: Advanced Error Reporting, L1-Substates, Geräte-Seriennummer | Eine zweite, größere Fläche, die kaum jemand füllt. Schweigen dort, wo das echte Teil Einträge meldet, ist selbst schon ein Unterschied |
| Ext cap 0x0003 | Device Serial Number | Eine nur lesbare 64-Bit-Seriennummer, die genau ein physisches Gerät identifiziert | Ein einzelner Wert, der die Platine eindeutig markiert. Melden zwei Karten denselben, sind sie nachweislich dasselbe Profil |
Keine dieser Zeilen ist für sich eine Erkennungsmethode. Es sind die Felder, die ein Beobachter kostenlos lesen kann. Ein Profil ist nur so gut wie sein am wenigsten stimmiges Feld.
Warum plausibel besser ist als exotisch
Wer Firmware kauft, fragt oft nach dem seltensten Donor, der zu haben ist — in der Annahme, dass ihn noch niemand gesehen hat. Diese Überlegung steht auf dem Kopf. Ein Gerät, das noch niemand gesehen hat, ist interessant, und interessant ist genau das Gegenteil von dem, was du willst. Das Ziel ist ein Teil, das in deiner konkreten Maschine nicht auffallen würde. Eine Capture-Karte passt zu einer Maschine, die streamt. Eine Netzwerkkarte passt zu einer Maschine mit zweitem Netz. Ein Speichercontroller passt zu einer Maschine mit freiem Slot. Ein Donor ist plausibel, wenn jemand, der die Geräteliste liest, keinen Grund hat, zweimal hinzuschauen.
Was einen Donor plausibel macht
Fünf Dinge, ungefähr danach sortiert, wie oft sie danebengehen. Alle fünf ergeben sich daraus, dass der Donor ein echtes Teil ist, vollständig kopiert.
- In sich stimmig
- Vendor, Device, Revision, Class Code und Subsystem-Paar beschreiben alle dasselbe ausgelieferte Produkt
- Vollständig
- BAR-Größen und Capability-Liste passen zum echten Teil und stammen nicht aus einer Vorlage
- Im Kontext unauffällig
- Die Art Karte, die in eine Maschine dieses Typs und in einen Slot dieses Typs gehört
- Nicht geteilt
- Das Profil läuft nicht gleichzeitig auf einer großen Zahl anderer Karten
- Aktuell im Handel
- Ein Teil, das es noch draußen gibt, und keines, das vor Jahren eingestellt wurde
Achtung
Warum zwei Leute auf einem Donor schlechter dran sind als zwei mit gewöhnlichen Profilen
Ein Donor-Profil ist nur dann ein Fingerabdruck, wenn es heraussticht. Ein Profil, das über viele Karten verteilt ist, sticht sehr leicht heraus. Nicht weil ein einzelnes Feld falsch aussieht, sondern weil genau diese Kombination von Feldern wiederkehrt. Sobald eine Kombination mit etwas in Verbindung gebracht wird, erbt jede Karte, die sie trägt, diese Verbindung. Auch die Karten, die nichts getan haben. Ein gewöhnliches, sauber kopiertes Profil, das es nur einmal gibt, ist ein schlechteres Ziel als ein seltenes Profil, das eine ganze Charge teilt. Das erste ist eines von tausenden echten Geräten. Das zweite ist eine Menge mit bekannten Mitgliedern.
Achtung
Was ein Donor-Profil nicht leistet
Es verändert, wie sich die Identität der Karte auf der PCIe-Ebene liest. Der Rest deiner Angriffsfläche bleibt unberührt. Dazu gehört, wie sich die Software verhält und wie das Eingabegerät den Cursor bewegt. Dazu gehören auch der Anzeigeweg, die Historie des Accounts und das, was ein Mensch sieht, der eine Meldung prüft. Gute Firmware nimmt eine bestimmte Art weg, aufzufallen. Sicherheit ist sie nicht. Sicherheit kann dir hier niemand anbieten, und jeder Verkäufer, der etwas anderes sagt, erzählt dir, was du hören willst.
Fragen, die sich vor dem Kauf eines Profils lohnen
Die Antworten darauf sagen dir mehr als der Name jeder Stufe.
- Ist der Donor ein echtes, ausgeliefertes Teil oder ein von Hand zusammengeschriebener Satz Werte?
- Wie viele andere Karten laufen gerade mit genau diesem Profil?
- Sind BAR-Größen und Capability-Liste vom Donor übernommen oder auf den Vorgabewerten einer Vorlage geblieben?
- Ist das Subsystem-Paar gefüllt oder auf null?
- Passt das Profil zu der Maschine, in der es stecken wird, oder ist es bloß ungewöhnlich?
- Was passiert mit dem Profil, wenn es mit etwas in Verbindung gebracht wird — gibt es einen Weg zu einem neuen Image?
Fragen zu Donoren
Kann ich ein eigenes Donor-Gerät beisteuern?
Frag den Support, bevor du in die eine oder andere Richtung planst. Den Konfigurationsbereich eines Donors auszulesen, braucht die physische Karte und eine Maschine, in der man sie liest. Nützlich ist ein vollständiger, exakter Dump und nicht drei Werte aus einem Angebot.
Muss der Donor zu Hardware passen, die ich wirklich besitze?
Nein, und normalerweise tut er das auch nicht. Er muss ein Teil sein, das in einer Maschine wie deiner niemanden überrascht. Ob du das echte Gerät besitzt, ändert nichts daran, wie sich die Karte liest.
Ist ein seltener Donor besser als ein verbreiteter?
Für sich genommen nicht. Selten und geteilt ist die schlechteste Kombination. Verbreitet und sauber kopiert ist eine vernünftige. Ein Profil, das es nur einmal gibt, ist genau das, wofür die Stufen mit Donor pro Bestellung da sind.
Lässt sich der Konfigurationsbereich ohne neues Flashen ändern?
Nein. Der Shadow Config Space wird in den Bitstream kompiliert, ein anderes Profil ist also ein anderes Image und ein neuer Schreibvorgang. Deshalb ist ein Profilwechsel auch eine Anfrage für ein neues Image und kein Schalter in den Einstellungen.
Heißt ein gutes Donor-Profil, dass mein Setup sicher ist?
Nein. Es betrifft eine einzige Angriffsfläche — die Identität der Karte auf der PCIe-Ebene. Softwareverhalten, Eingabe, Anzeigeweg und Account-Historie bleiben davon unberührt.
Quellen
Was einen Donor plausibel macht, ist unsere eigene Einschätzung. Ebenso das Argument, dass ein geteiltes Profil schlechter ist als ein verbreitetes.
- 01PCI configuration space (overview)
der Aufbau des Headers und die Offsets von Vendor-ID, Device-ID, BARs, Subsystem-IDs und Capability-Liste
en.wikipedia.org
- 02pcileech-fpga (Ulf Frisk)
die öffentliche Gateware-Linie, die die Seite nennt, und in der der Shadow Config Space in den Bitstream kompiliert wird
github.com
Weiterlesen
Kommst du nicht weiter? Ticket auf Discord öffnen
Alle Anleitungen