CVE-2025-39901 in Linux
Resumen
por VulDB • 2026-06-02
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
i40e: eliminar el acceso de lectura a los archivos de debugfs
Los archivos de debugfs 'command' y 'netdev_ops' constituyen una interfaz de depuración heredada, soportada por el controlador i40e desde sus inicios mediante el commit 02e9c290814c ("i40e: debugfs interface").
Ambos archivos de debugfs proporcionan un controlador de lectura que es en su mayoría inútil y que está implementado con una lógica cuestionable. Ambos utilizan un búfer estático de 256 bytes que se inicializa con una cadena vacía. En el caso del archivo 'command', este búfer no se utiliza literalmente en ningún momento y simplemente desperdicia espacio. En el caso del archivo 'netdev_ops', el último comando escrito se guarda aquí.
Al leer, el contenido de los archivos se presenta como el nombre del dispositivo seguido de dos puntos y luego el contenido de sus respectivos búferes estáticos. Para 'command', esto será siempre "<dispositivo>: ". Para 'netdev_ops', esto será "<dispositivo>: <último comando escrito>". Pero tenga en cuenta que el búfer es compartido entre todos los dispositivos operados por este módulo. En el mejor de los casos, es información en su mayoría sin sentido, y en el peor de los casos, podría ser accedido simultáneamente ya que no parece existir ningún mecanismo de bloqueo.
Además, hemos recibido recientemente múltiples informes sobre ambas funciones de lectura respecto al uso de snprintf y la posible desbordación de búfer que podría resultar en la lectura de memoria del kernel arbitraria. Para el archivo 'command', esto es definitivamente imposible, ya que el búfer estático siempre es cero y nunca se escribe en él. Para el archivo 'netdev_ops', parece que sí es posible; si el usuario elabora cuidadosamente la entrada del comando, esta se copiará en el búfer, que podría ser lo suficientemente grande como para causar que snprintf realice una truncación, lo que luego provoca que copy_to_user lea más allá de la longitud del búfer asignado por kzalloc.
Una solución mínima sería reemplazar snprintf() por scnprintf(), lo que limitaría el valor devuelto al número de bytes escritos, previniendo una desbordación. Una solución más compleja consistiría en eliminar los búferes estáticos en su mayoría inútiles, ahorrando 512 bytes y modificando las funciones de lectura para dejar de necesitarlos como entrada.
En su lugar, simplemente eliminaremos por completo el acceso de lectura a estos archivos. Estas son interfaces de depuración expuestas como parte de debugfs, y no creo que eliminar el acceso de lectura rompa ningún script, ya que la salida proporcionada es bastante inútil. Puede encontrar el nombre de netdev a través de otras interfaces más estándar, y la interfaz 'netdev_ops' puede resultar fácilmente en datos basura si se emiten escrituras simultáneas a múltiples dispositivos a la vez.
Para eliminar correctamente i40e_dbg_netdev_ops_buf, necesitamos refactorizar su función de escritura para evitar el uso del búfer estático. En su lugar, utilice la misma lógica que i40e_dbg_command_write, con un búfer asignado. Actualice el código para usar esto en lugar del búfer estático y asegúrese de liberar el búfer al salir. Esto corrige las escrituras simultáneas a 'netdev_ops' en múltiples dispositivos y nos permite eliminar el búfer estático ahora inutilizado junto con la eliminación del acceso de lectura.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.