
Exploit de PSP para GPUs AMD navi31 (RX 7900) que desactiva las comprobaciones de firma del firmware para que la tarjeta cargue firmware SMU, SDMA, MEC, IMU y RLC sin firmar; no persistente tras un arranque en frío.
Un exploit de PSP (Platform Security Processor) para tarjetas AMD navi31 (serie RX 7900). Probablemente adaptable también a otras familias de productos adyacentes.
Desactiva la comprobación de firmas del firmware del PSP, de modo que la tarjeta cargará firmware de IP sin firmar (SMU, SDMA, MEC, IMU, RLC) que de otro modo rechazaría. Piensa en gestión de energía personalizada, límites de reloj o cualquier otra cosa que resida en el firmware que el fabricante firma y tú no.
No se flashea nada. El parche reside en la memoria del PSP y se aplica durante un arranque en caliente; un ciclo de apagado en frío lo borra y la tarjeta vuelve a estar de fábrica. Ese arranque en caliente es el "Wake and Break": la tarjeta se despierta, la convencemos de que se ponga muy high de inmediato y la coaccionamos para que anule las comprobaciones de firma. :-)
Probado en una tarjeta RX 7900 XTX. Consulta Status.
python3 wakebreak.py 25=/path/to/firmware.bin
Eso coloca el parche, reinicia en caliente la tarjeta y envía tu imagen como firmware
tipo 25. Si imprime accepted, el PSP aceptó una imagen que normalmente habría
rechazado.
¿Necesitas algo para probarlo? ipfw_images.py lista el firmware que tu controlador
carga realmente y escribe un par de prueba — una imagen genuina y una copia con un bit
invertido en su firma, de modo que el firmware en sí es idéntico byte por byte:
python3 ipfw_images.py # what does this card load?
python3 ipfw_images.py 25 # -> /tmp/fw_25_{ok,bad}.bin
python3 wakebreak.py 25=/tmp/fw_25_bad.bin
El firmware de fábrica rechaza fw_25_bad.bin. Con el parche aplicado, se acepta.
Esa es toda la demostración.
python3 -m venv venv
venv/bin/pip install -r requirements.txt
make verify # are the shipped artifacts intact?
make selftest # offline sanity checks, no card touched
Necesitas un host Linux con la tarjeta accesible a través del
controlador AMD de tinygrad (PCIe o su puente
USB). Consulta requirements.txt para ver un parche de tinygrad que tu host necesita.
Existen cuatro compilaciones de firmware navi31 conocidas, y el parche debe coincidir.
El perfil a es el predeterminado y cubre el más común. Si tienes un volcado
de la memoria flash SPI de tu tarjeta, identify.py te lo indicará:
python3 identify.py FLASH.bin
# -> sos-build c: wakebreak.py --sos-build c
De lo contrario, simplemente pruébalos. Equivocarse no tiene consecuencias: el parche comprueba lo que está a punto de modificar, encuentra algo que no reconoce, no escribe nada y la tarjeta arranca con normalidad.
python3 wakebreak.py --sos-build c 25=/tmp/fw_25_bad.bin
Confirmado en la tarjeta probada (RX 7900 XTX, perfil a):
| firmware manipulado, tarjeta de fábrica | rechazado |
| firmware manipulado, parcheado | aceptado |
| tras un ciclo de apagado en frío | rechazado de nuevo — la tarjeta está de fábrica |
NOTA: Los perfiles b, c y d están compilados y verificados sin conexión, pero nunca se han ejecutado en hardware. Si tienes una tarjeta que coincida con el perfil b, c o d, ¡informa si funciona!
El parche en sí son unos cientos de bytes de ensamblador ARM, en hook/*.S. Los
blobs compilados se incluyen con el repositorio, así que no necesitas un compilador cruzado para usar esto.
Si aun así quieres recompilarlos:
make rebuild # needs arm-none-eabi binutils
make rebuild CROSS=/path/to/arm-none-eabi-
La compilación se niega a instalar cualquier cosa cuyo hash no coincida con los bytes que se probaron en una tarjeta, por lo que una cadena de herramientas diferente no puede cambiar silenciosamente lo que se escribe en tu PSP.
wakebreak.py the exploit
identify.py which --sos-build does this card need?
ipfw_images.py build a signed/tampered firmware pair to test with
selftest.py offline checks
hook/ the patch: ARM sources and built blobs
firmware/ two stock AMD firmware images the exploit needs to get in
firmware/ contiene imágenes AMD sin modificar, distribuidas públicamente. Son versiones antiguas, conservadas porque el camino de entrada pasa a través de ellas.
No cubierto aquí a propósito: lee el código. wakebreak.py tiene ~600 líneas comentadas y los comentarios explican el mecanismo, las comprobaciones de seguridad y por qué cada paso está ordenado de la manera en que está. TL;DR: se cargan dos aplicaciones de confianza estándar de AMD, a una de ellas se la convence de ejecutar una cadena que puede escribir en la memoria del PSP, el parche se coloca en la copia residente del bootloader, y luego la tarjeta se reinicia en caliente dentro de él.
MIT, ver LICENSE. Haz lo que quieras con ello.
Se utilizó una asistencia intensiva de LLM en la producción de este trabajo. Eso no significa que el autor no tenga ni idea de lo que realmente está pasando aquí. mucha resistencia y trabajo manual estuvieron involucrados para siquiera llegar a este punto. Puede que no te gusten los artefactos de python generados a lo bruto o lo que sea, pero no podrás discutir el hecho de que tu tarjeta Navi31 ahora, de repente, carga blobs de componentes de firmware sin firmar. Gracias por su atención.