Perfiles de donante y espacio de configuración en sombra
Qué es una identidad de donante a nivel de registros: vendor ID y device ID, subsystem ID, tamaños de BAR y lista de capabilities. Y por qué un donante verosímil gana a uno genérico.
Respuesta corta
Un perfil de donante es la identidad de un dispositivo PCIe real. Tu tarjeta la escribe en el espacio de configuración en sombra y se la enseña al host. Contiene el vendor ID, el device ID, los subsystem ID, la distribución de los BAR y la lista de capabilities. Un donante verosímil se lee como hardware normal. Uno genérico, o uno compartido por muchas tarjetas, es un patrón que cualquiera puede enumerar.
En esta página10
- El espacio de configuración es lo primero que pregunta cualquier cosa
- El espacio en sombra y por qué se puede escribir
- Los campos, y qué le cuenta cada uno a quien mira
- Por qué verosímil gana a exótico
- Qué hace verosímil a un donante
- Por qué dos personas con un mismo donante están peor que cada una con uno corriente
- Qué no hace un perfil de donante
- Preguntas que vale la pena hacer antes de comprar un perfil
- Preguntas sobre donantes
- Fuentes
El espacio de configuración es lo primero que pregunta cualquier cosa
Todo dispositivo PCIe lleva un pequeño bloque de registros llamado espacio de configuración. El host lo lee durante la enumeración para responder a tres preguntas: quién eres, qué clase de dispositivo eres y cuánto espacio de direcciones quieres. Windows usa las respuestas para elegir un driver. Cualquier otra cosa que se ejecute en esa máquina puede leer esos mismos registros. Quien da esas respuestas es el firmware de tu tarjeta. Así que el espacio de configuración es la identidad pública de la tarjeta, hayas elegido su contenido a propósito o no.
El espacio en sombra y por qué se puede escribir
En un diseño de FPGA de serie, el bloque hardware de PCIe responde a las lecturas de configuración con valores fijados en la síntesis. El firmware DMA coloca delante una capa escribible de 4 KB en la RAM de bloque —el espacio de configuración en sombra— y responde desde ahí. En el linaje público de pcileech-fpga eso vive en un archivo de coeficientes que se compila dentro del bitstream. Así que la identidad de la tarjeta son datos, no silicio. Justo por eso se puede recompilar el firmware alrededor de otro donante sin cambiar de hardware.
Los campos, y qué le cuenta cada uno a quien mira
Los offsets se cuentan desde el inicio del espacio de configuración del dispositivo. La columna que importa es la última: no dice para qué sirve el campo, sino qué aprende alguien al leerlo.
| Offset | Campo | Qué contiene | Qué le dice a quien mira |
|---|---|---|---|
| 0x00 | Vendor ID | Un código de 16 bits que PCI-SIG asigna al fabricante | Qué empresa fabricó supuestamente esto. Un valor sin asignar, o un fabricante de FPGA conocido en una placa que dice ser una NIC, es una contradicción inmediata |
| 0x02 | Device ID | Un código de 16 bits que el fabricante asigna a un producto concreto | Exactamente qué producto dice ser. Junto al vendor ID identifica una pieza real que existe o que no existe |
| 0x08 | Revision ID | La revisión de silicio de esa pieza | Si esa revisión llegó a venderse alguna vez con este device ID. Una revisión que no usó ningún producto ya es una incoherencia por sí sola |
| 0x09-0x0B | Class code | Clase base, subclase e interfaz de programación | Qué categoría de dispositivo es. Un class code que no cuadra con el device ID es una de las comprobaciones más baratas que se pueden hacer |
| 0x10-0x27 | BAR0 a BAR5 | Registros de dirección base: cuántas regiones quiere el dispositivo, de qué tamaño, de memoria o de E/S, prefetchable o no | La huella de memoria que pediría la pieza real. Un donante cuyo BAR0 es de 4 KB y un firmware que pide otra cosa ya no encaja con la pieza que dice ser |
| 0x2C | Subsystem Vendor ID | Quién fabricó la placa en la que va el chip | Si la tarjeta es una pieza de referencia o el montaje de un OEM concreto. En hardware de primera marca suele ser idéntico al vendor ID |
| 0x2E | Subsystem ID | Qué variante de placa de ese integrador es | El campo peor copiado en los firmwares malos. Un chip real con el par de subsystem en blanco o sin sentido es una señal fuerte por sí sola |
| 0x34 | Capabilities pointer | El offset de la primera entrada de la lista enlazada de capabilities | Que el dispositivo tiene capabilities. Un puntero que no apunta a nada está mal formado de una manera en la que el hardware normal no lo está |
| 0x40+ | Lista de capabilities | Lista enlazada: gestión de energía, MSI o MSI-X, la propia capability de PCI Express, entradas específicas del fabricante | Qué funciones soporta la pieza. La lista del dispositivo real tiene un conjunto concreto en un orden concreto, y una lista corta o reordenada no coincide |
| 0x100+ | Capabilities extendidas | Espacio extendido de PCIe: notificación avanzada de errores, subestados de energía L1, número de serie del dispositivo | Una segunda superficie, más grande, que casi nadie rellena. El silencio donde la pieza real informa de entradas ya es una diferencia |
| Ext cap 0x0003 | Device Serial Number | Un número de serie de 64 bits, de solo lectura, que identifica de forma única un dispositivo físico | Un único valor que deja huella de la placa. Si dos tarjetas informan del mismo, son demostrablemente el mismo perfil |
Ninguna de estas filas es por sí sola un método de detección. Son los campos que cualquiera puede leer gratis. Un perfil vale lo que valga su campo menos coherente.
Por qué verosímil gana a exótico
Quien compra firmware pide a menudo el donante más raro posible, con la idea de que nadie lo habrá visto nunca. Ese razonamiento va del revés. Un dispositivo que nadie ha visto es interesante, y lo interesante es justo lo contrario de lo que quieres. El objetivo es una pieza que no llamaría la atención en tu máquina concreta. Una capturadora encaja en una máquina que hace streaming. Una NIC encaja en una máquina con una segunda red. Un dispositivo de almacenamiento encaja en una máquina con un slot libre. Un donante es verosímil cuando quien lee la lista de dispositivos no tiene ningún motivo para mirar dos veces.
Qué hace verosímil a un donante
Cinco cosas, más o menos en el orden en que se hacen mal. Las cinco salen de que el donante sea una pieza real, copiada entera.
- Coherente por dentro
- Vendor, device, revisión, class code y par de subsystem describen todos el mismo producto que llegó a venderse
- Completo
- Los tamaños de los BAR y la lista de capabilities coinciden con la pieza real, no con los valores por defecto de una plantilla
- Normal en su contexto
- El tipo de tarjeta que encaja en una máquina así, en un slot así
- No compartido
- El perfil no está funcionando además en un montón de tarjetas más
- Todavía a la venta
- Una pieza que sigue existiendo en el mercado, no una retirada hace años
Aviso
Por qué dos personas con un mismo donante están peor que cada una con uno corriente
Un perfil de donante solo es una huella si destaca. Un perfil compartido por muchas tarjetas destaca con mucha facilidad. No porque ningún campo suelto parezca mal, sino porque la combinación exacta de campos se repite. En cuanto una combinación queda asociada a algo, todas las tarjetas que la llevan heredan esa asociación. También las que no han hecho nada. Un perfil corriente, bien copiado y único es peor objetivo que un perfil raro compartido por un lote. El primero es uno entre miles de dispositivos reales. El segundo es un conjunto con miembros conocidos.
Aviso
Qué no hace un perfil de donante
Cambia cómo se lee la identidad de la tarjeta en la capa PCIe. El resto de tu exposición queda intacto. Eso incluye cómo se comporta el software y cómo mueve el cursor el dispositivo de entrada. También la salida de vídeo, el historial de la propia cuenta y lo que ve una persona revisando un reporte. La calidad del firmware elimina una forma concreta de llamar la atención. No es seguridad. Aquí nadie te puede ofrecer seguridad, y cualquier vendedor que diga lo contrario te está diciendo lo que quieres oír.
Preguntas que vale la pena hacer antes de comprar un perfil
Las respuestas a esto dicen más que cualquier nombre de nivel.
- ¿El donante es una pieza real que llegó a venderse, o un conjunto de valores editados a mano?
- ¿Cuántas tarjetas más están usando ahora mismo este mismo perfil?
- ¿Los tamaños de los BAR y la lista de capabilities están copiados del donante, o se han quedado en los valores por defecto de la plantilla?
- ¿El par de subsystem está relleno, o a cero?
- ¿El perfil encaja con la máquina en la que va a ir, o simplemente es raro?
- ¿Qué pasa con el perfil si queda asociado a algo? ¿Hay una vía de recompilación?
Preguntas sobre donantes
¿Puedo aportar yo mi propio dispositivo donante?
Pregunta a soporte antes de dar por hecha una respuesta u otra. Leer el espacio de configuración de un donante exige la tarjeta física y una máquina en la que leerla. Lo que sirve es un volcado completo y exacto, no tres valores sacados de un anuncio.
¿El donante tiene que coincidir con hardware que yo tenga de verdad?
No, y normalmente no coincide. Tiene que ser una pieza que no sorprendería en una máquina como la tuya. Tener el dispositivo real no cambia nada en cómo se lee la tarjeta.
¿Un donante raro es mejor que uno común?
Por sí solo, no. Raro y compartido es la peor combinación. Común y bien copiado es una combinación razonable. Un perfil único es justo lo que vienen a dar los niveles con donante por pedido.
¿Se puede cambiar el espacio de configuración sin volver a flashear?
No. El espacio en sombra va compilado dentro del bitstream, así que otro perfil es otra imagen y un flasheo nuevo. Por eso mismo cambiar de perfil es una petición de recompilación, no un ajuste que se activa.
¿Un buen perfil de donante significa que mi montaje es seguro?
No. Cubre un vector de exposición: la identidad de la tarjeta en la capa PCIe. El comportamiento del software, el dispositivo de entrada, la salida de vídeo y el historial de la cuenta quedan fuera.
Fuentes
Qué hace verosímil a un donante es criterio nuestro. También lo es el argumento de que un perfil compartido es peor que uno corriente.
- 01PCI configuration space (overview)
la estructura de la cabecera y los offsets del vendor ID, el device ID, los BAR, los subsystem ID y la lista de capabilities
en.wikipedia.org
- 02pcileech-fpga (Ulf Frisk)
el linaje de gateware público que nombra la página, donde el espacio de configuración en sombra se compila dentro del bitstream
github.com
Sigue leyendo
¿Sigues atascado? Abre un ticket en Discord
Todas las guías