
PoCs y evidencia de dos hallazgos en el driver de GPU Linux de NVIDIA cerrados por el proveedor como comportamiento esperado/intencionado: telemetría de procesos GPU entre UIDs mediante NVML, y una falla de MMU no privilegiada Xid 31 en el motor de copia a través de una condición de carrera en el desmontaje de acceso entre pares.
Código de prueba de concepto y evidencia en bruto para dos hallazgos en el controlador de GPU Linux de NVIDIA, ambos reportados a través del VDP de NVIDIA y ambos cerrados por NVIDIA como comportamiento intencionado/esperado. Publicado para que el comportamiento quede documentado y sea reproducible; ninguno tiene CVE y ninguno será corregido.
| # | Hallazgo | Clase | Resultado del proveedor | Directorio |
|---|
| 1 | Telemetría de procesos GPU entre UIDs mediante NVML | Divulgación de información (CWE-200 / CWE-862) | "comportamiento esperado"; divulgación pública autorizada por escrito el 2026-08-20 | 01-nvml-cross-uid-telemetry/ |
| 2 | Fallo de MMU del motor de copia Xid 31 sin privilegios mediante condición de carrera en teardown P2P | Fallo de GPU, sin privilegios y determinista | "comportamiento intencionado y, como tal, no es un error", cerrado el 2026-08-04 | 02-xid31-p2p-teardown-race/ |
Probado con el controlador 595.71.05-open, A100-SXM4-80GB x4 (NV4 full mesh, sin NVSwitch, MIG desactivado), Ubuntu 24.04 / kernel 6.8.0, CUDA toolkit 12.9. El hallazgo 1 también se reprodujo en 565.57.01-open.
El hallazgo 1 es una exposición real entre UIDs. El hallazgo 2 es un fallo de impacto no probado. No son igualmente sólidos y no se presentan como tales.
El hallazgo 2 demuestra que un usuario sin privilegios puede provocar de forma determinista un fallo en un par de GPU NVLink
(5/5, atribuido por PID, frente a 4/4 controles negativos limpios). No demuestra que el
fallo sobreviva al proceso que lo desencadena. Esa medición nunca se tomó — el arnés reiniciaba la
GPU de forma refleja antes de sondear, y el nodo fue desaprovisionado antes de que pudiera repetirse. Dos
evidencias independientes sugieren que el fallo se autolimpia: el catálogo de Xid de NVIDIA clasifica
el Xid 31 con acción inmediata RESTART_APP, y el propio campo Recovery Action de la GPU leía None
antes del reinicio. Hasta que alguien ejecute el canario posterior al kill en
02-xid31-p2p-teardown-race/, trate esto como un fallo con
radio de explosión no probado, no como una denegación de servicio.
Si tiene un par NVLink de sobra, ese único experimento es lo más valioso que cualquiera puede aportar aquí. Toma unos minutos.
git clone https://github.com/abhinavagarwal07/nvidia-gpu-security-poc
cd nvidia-gpu-security-poc
./capture_env.sh # registra los permisos de dispositivos de tu host, controlador, topología, opciones de /proc
# Hallazgo 1 — necesita un segundo usuario ejecutando cualquier carga de trabajo CUDA
(cd 01-nvml-cross-uid-telemetry/poc && make && ./nvml_harvest)
# Hallazgo 2 — necesita dos GPUs conectadas por NVLink. Provoca un fallo en un par de GPUs. No lo ejecute en hardware compartido.
(cd 02-xid31-p2p-teardown-race/poc && ./build.sh && \
CUDA_VISIBLE_DEVICES=0,1 ./p2p_teardown_race_verbose --a 0 --p 1)
La salida de capture_env.sh es lo que debe adjuntar si reporta una diferencia con nuestros resultados — registra
ls -l /dev/nvidia*, las entradas de modo de dispositivo en /proc/driver/nvidia/params, las opciones de montaje de /proc
(un montaje hidepid= cambia lo que produce el hallazgo 1), topología, controlador y versiones de pynvml.
El hallazgo 2 provoca deliberadamente un fallo en un par de GPUs. Produce entradas Xid 31 en el registro del kernel y puede
requerir nvidia-smi --gpu-reset para limpiarse — y en sistemas NVLink/NVSwitch de generación Ampere
NVIDIA documenta que la recuperación en el caso de enlace troncal fatal es una operación a nivel de tejido, no
de una sola GPU. Ejecútelo solo en hardware que posea o para el que tenga autorización escrita para interrumpir, sin
co-inquilinos. Todas las pruebas originales se realizaron en un nodo de un solo inquilino, controlado por el investigador, bajo
una concesión de clúster autorizada.
El hallazgo 1 es de solo lectura y pasivo. Lee telemetría que el controlador ya expone a todos los usuarios locales; no escribe nada ni inyecta nada.
results/ en cada directorio contiene los JSON de veredicto por ejecución puntuados por máquina originales, líneas
dmesg de Xid capturadas, controles positivos y negativos, la auditoría de privilegios del observador y capturas
de entorno del nodo de prueba. Los UUID de GPU, números de serie de hardware e IPs de nodos están redactados; nada más
ha sido alterado.
Publicaciones de Full Disclosure para ambos hallazgos, incluyendo correspondencia con el proveedor y cronogramas de divulgación: https://abhinavagarwal07.github.io
Código PoC y documentación: consulte LICENSE.