Profils de donneur et espace de configuration fantôme
Ce qu'est une identité de donneur au niveau des registres : vendor ID et device ID, subsystem ID, tailles de BAR et liste des capabilities. Et pourquoi un donneur plausible vaut mieux qu'un donneur générique.
Réponse courte
Un profil de donneur, c'est l'identité d'un vrai périphérique PCIe. Votre carte l'écrit dans l'espace de configuration fantôme et la présente à l'hôte. Il contient le vendor ID, le device ID, les subsystem ID, la disposition des BAR et la liste des capabilities. Un donneur plausible se lit comme du matériel ordinaire. Un donneur générique, ou partagé par de nombreuses cartes, est un motif que n'importe qui peut repérer en énumérant les périphériques.
Sur cette page10
- L'espace de configuration est la première chose que l'on demande
- L'espace de configuration fantôme, et pourquoi il est inscriptible
- Les champs, et ce que chacun apprend à un observateur
- Pourquoi le plausible bat l'exotique
- Ce qui rend un donneur plausible
- Pourquoi deux personnes sur un même donneur, c'est pire que chacune sur un donneur ordinaire
- Ce qu'un profil de donneur ne fait pas
- Questions à poser avant d'acheter un profil
- Questions sur les donneurs
- Sources
L'espace de configuration est la première chose que l'on demande
Tout périphérique PCIe porte un petit bloc de registres appelé espace de configuration. L'hôte le lit pendant l'énumération pour répondre à trois questions. Qui êtes-vous, à quelle classe de périphérique appartenez-vous, et combien d'espace d'adressage réclamez-vous. Windows se sert des réponses pour choisir un pilote. N'importe quoi d'autre tournant sur cette machine peut lire les mêmes registres. C'est le firmware de votre carte qui fournit ces réponses. L'espace de configuration est donc l'identité publique de la carte, que vous en ayez choisi le contenu délibérément ou non.
L'espace de configuration fantôme, et pourquoi il est inscriptible
Dans un design FPGA d'origine, le bloc matériel PCIe répond aux lectures de configuration avec des valeurs figées à la synthèse. Un firmware DMA place devant lui une surcouche inscriptible de 4 Ko en mémoire bloc — l'espace de configuration fantôme, ou shadow configuration space — et répond depuis celle-ci. Dans la lignée publique pcileech-fpga, elle vit dans un fichier de coefficients compilé dans le bitstream. L'identité de la carte est donc de la donnée, pas du silicium. C'est exactement pour cela qu'un firmware peut être recompilé autour d'un autre donneur sans changer de matériel.
Les champs, et ce que chacun apprend à un observateur
Les offsets partent du début de l'espace de configuration du périphérique. C'est la dernière colonne qui compte : elle dit non pas à quoi sert le champ, mais ce qu'apprend celui qui le lit.
| Offset | Champ | Ce qu'il contient | Ce qu'il apprend à un observateur |
|---|---|---|---|
| 0x00 | Vendor ID | Un code 16 bits attribué au fabricant par le PCI-SIG | Quelle entreprise a soi-disant fabriqué ceci. Une valeur non attribuée, ou un fabricant de FPGA connu sur une carte qui se présente comme une carte réseau, est une contradiction immédiate |
| 0x02 | Device ID | Un code 16 bits que le fabricant attribue à un produit précis | Exactement quel produit la carte prétend être. Associé au vendor ID, il désigne un composant réel qui existe ou qui n'existe pas |
| 0x08 | Revision ID | Révision du silicium de ce composant | Si cette révision a déjà été commercialisée avec ce device ID. Une révision qu'aucun produit n'a portée est une incohérence à elle seule |
| 0x09-0x0B | Class code | Classe de base, sous-classe et interface de programmation | De quelle catégorie de périphérique il s'agit. Un class code en désaccord avec le device ID est l'une des vérifications les moins coûteuses à mener |
| 0x10-0x27 | BAR0 à BAR5 | Base address registers : combien de régions le périphérique réclame, de quelle taille, en mémoire ou en I/O, prefetchable ou non | L'empreinte mémoire que demanderait le composant réel. Un donneur dont le BAR0 fait 4 Ko et un firmware qui demande autre chose ne correspondent plus au composant revendiqué |
| 0x2C | Subsystem Vendor ID | Qui a fabriqué la carte sur laquelle la puce est posée | Si la carte est un modèle de référence ou une version OEM précise. Souvent identique au vendor ID sur le matériel du fabricant lui-même |
| 0x2E | Subsystem ID | Quelle variante de carte chez cet intégrateur | Le champ le moins souvent recopié dans les mauvais firmwares. Une vraie puce avec une paire subsystem vide ou incohérente est un signal fort à elle seule |
| 0x34 | Capabilities pointer | Offset de la première entrée de la liste chaînée des capabilities | Que le périphérique a des capabilities tout court. Un pointeur vers le vide est une malformation que l'on ne trouve pas sur du matériel normal |
| 0x40+ | Capability list | Liste chaînée : gestion de l'alimentation, MSI ou MSI-X, la capability PCI Express elle-même, entrées propres au fabricant | Quelles fonctions le composant prend en charge. La liste du vrai périphérique contient un ensemble précis dans un ordre précis, et une liste écourtée ou réordonnée ne correspond pas |
| 0x100+ | Extended capabilities | L'espace étendu PCIe : advanced error reporting, sous-états d'alimentation L1, numéro de série du périphérique | Une seconde surface, plus grande, que presque personne ne remplit. Le silence là où le composant réel déclare des entrées est déjà une différence |
| Ext cap 0x0003 | Device Serial Number | Un numéro de série 64 bits en lecture seule qui identifie de façon unique un périphérique physique | Une seule valeur qui prend l'empreinte de la carte. Si deux cartes rapportent la même, elles portent de façon prouvable le même profil |
Aucune de ces lignes n'est à elle seule une méthode de détection. Ce sont les champs qu'un observateur peut lire sans le moindre effort. Un profil ne vaut que ce que vaut son champ le moins cohérent.
Pourquoi le plausible bat l'exotique
Les gens qui cherchent un firmware demandent souvent le donneur le plus rare possible, en se disant que personne ne l'aura jamais vu. Le raisonnement est à l'envers. Un périphérique que personne n'a vu est intéressant, et intéressant est exactement le contraire de ce que vous voulez. L'objectif est un composant qui ne détonnerait pas dans votre machine à vous. Une carte d'acquisition convient à une machine qui streame. Une carte réseau convient à une machine avec un second réseau. Du stockage convient à une machine avec un slot libre. Un donneur est plausible quand celui qui parcourt la liste des périphériques n'a aucune raison d'y regarder à deux fois.
Ce qui rend un donneur plausible
Cinq points, à peu près dans l'ordre de la fréquence à laquelle on les rate. Les cinq découlent du fait que le donneur est un composant réel, recopié en entier.
- Cohérent en interne
- Vendor, device, révision, class code et paire subsystem décrivent tous le même produit commercialisé
- Complet
- Les tailles de BAR et la liste des capabilities correspondent au composant réel, pas aux valeurs par défaut d'un modèle
- Ordinaire dans son contexte
- Le genre de carte qui a sa place dans une machine de ce type, dans un slot de ce type
- Non partagé
- Le profil ne tourne pas en même temps sur un grand nombre d'autres cartes
- Toujours commercialisé
- Un composant qui existe encore sur le terrain, plutôt qu'un modèle retiré il y a des années
Attention
Pourquoi deux personnes sur un même donneur, c'est pire que chacune sur un donneur ordinaire
Un profil de donneur ne devient une empreinte que s'il se détache du lot. Un profil partagé par de nombreuses cartes se détache très facilement. Non pas parce qu'un champ a l'air faux, mais parce que la combinaison exacte des champs revient. Dès qu'une combinaison est reliée à quelque chose, toutes les cartes qui la portent héritent de ce lien. Y compris celles qui n'ont rien fait. Un profil ordinaire, bien recopié et unique, est une cible moins facile qu'un profil rare partagé par un lot. Le premier est l'un des milliers de périphériques réels. Le second est un ensemble dont on connaît les membres.
Attention
Ce qu'un profil de donneur ne fait pas
Il change la façon dont l'identité de la carte se lit au niveau PCIe. Le reste de votre exposition n'y touche pas. Cela couvre le comportement du logiciel et la manière dont le périphérique d'entrée déplace le curseur. Cela couvre aussi le chemin d'affichage, l'historique du compte lui-même et ce que voit un humain qui examine un signalement. La qualité du firmware supprime une façon précise de se faire remarquer. Ce n'est pas de la sécurité. Personne ne peut vous vendre de la sécurité ici, et tout vendeur qui affirme le contraire vous dit ce que vous voulez entendre.
Questions à poser avant d'acheter un profil
Les réponses à ces questions vous en apprennent plus que n'importe quel nom de niveau.
- Le donneur est-il un composant réellement commercialisé, ou un jeu de valeurs éditées à la main ?
- Combien d'autres cartes font tourner ce même profil en ce moment ?
- Les tailles de BAR et la liste des capabilities sont-elles recopiées du donneur, ou laissées aux valeurs par défaut d'un modèle ?
- La paire subsystem est-elle renseignée, ou mise à zéro ?
- Le profil convient-il à la machine dans laquelle il va se trouver, ou est-il seulement inhabituel ?
- Qu'arrive-t-il au profil s'il finit par être associé à quelque chose — existe-t-il un chemin de recompilation ?
Questions sur les donneurs
Puis-je fournir mon propre périphérique donneur ?
Demandez au support avant de partir d'un côté ou de l'autre. Lire l'espace de configuration d'un donneur suppose d'avoir la carte physique et une machine pour l'y lire. Ce qui est utile, c'est un relevé complet et exact, pas trois valeurs prises dans une annonce.
Le donneur doit-il correspondre à du matériel que je possède vraiment ?
Non, et ce n'est généralement pas le cas. Il doit s'agir d'un composant qui ne surprendrait personne dans une machine comme la vôtre. Posséder le vrai périphérique ne change rien à la façon dont la carte se lit.
Un donneur rare vaut-il mieux qu'un donneur courant ?
Pas en soi. Rare et partagé est la pire combinaison. Courant et bien recopié en est une raisonnable. L'exemplaire unique est précisément ce que les niveaux à donneur dédié existent pour fournir.
L'espace de configuration peut-il changer sans reflasher ?
Non. L'espace fantôme est compilé dans le bitstream, donc un autre profil veut dire une autre image et un nouveau flash. C'est aussi pourquoi un changement de profil est une demande de recompilation, pas un interrupteur dans des réglages.
Un bon profil de donneur veut-il dire que ma configuration est sûre ?
Non. Il traite un seul vecteur d'exposition : l'identité de la carte au niveau PCIe. Le comportement du logiciel, l'entrée, le chemin d'affichage et l'historique du compte n'y sont pas touchés.
Sources
Ce qui rend un donneur plausible relève de notre propre jugement. L'argument selon lequel un profil partagé vaut moins qu'un profil courant aussi.
- 01PCI configuration space (overview)
la structure de l'en-tête et les offsets du vendor ID, du device ID, des BAR, des subsystem ID et de la liste des capabilities
en.wikipedia.org
- 02pcileech-fpga (Ulf Frisk)
la lignée de gateware publique citée sur la page, où l'espace de configuration fantôme est compilé dans le bitstream
github.com
À lire ensuite
Toujours bloqué ? Ouvrir un ticket sur Discord
Tous les guides