Skip to content

[code-review] keys.env is os.Setenv'd wholesale into the process env so every bash command (run_command passes os.Environ()) and MCP server inherits ALL plaintext API keys; workspace a2a.yaml values bypass instanceFields tracking and late-merge after the global snapshot, deep-merging into the GLOBAL config for all workspaces; instance-scope zeroing (max_iterations->0) is permanently lost - diffInt suppresses zero, deep-merge keeps the old value, Save strips the global key; double-quoted env values failing strconv.Unquote keep their quotes as the credential #1519

Description

@topcheer

文件行号

internal/config/env.go L189-199(loadKeysEnvInto 后 for name, value := range env { os.Setenv(name, value) }——keys.env 全部条目注入进程环境)+ runtimeEnvLookup L169-175(仅查本地 values map——配置展开不需污染)+ 子进程继承链 internal/tool/run_command.go:886(append(os.Environ(), commandEnvOverrides...))+ L330-335(双引号 Unquote 失败无 fallback 去引号落穿至 L345 返回整串)对照 L336-338(单引号无条件 strip 正确);instance.go L643(globalSnap = deepCopyConfig)→ L646 MigrateA2AYaml → L654-656 MergeInstance(登记 instanceFields)→ L665-667 MergeA2AConfig 在快照后执行且不传 tracked map(a2a_override.go L59-102 无登记)+ L675-721(MigrateA2AYaml 迁移后不删 legacy 文件——每次 load 重新叠加);instance_delta.go L103-113(diffScalar current != "" / diffInt current != 0)+ L243-256(Port/MaxTasks/TaskTimeout 同型)对照 L162-163(diffIM enabled bool 无抑制 false 正常往返——佐证误加)+ L189-205(adapters 只收 !exists 新增);external_files.go L133-143(三处 Save 失败仅 debug.Log 吞掉);context_window.go L741(Contains(m,"glm-") && Contains(m,"v") 子串误配)

问题

案 A(High·安全):keys.env 全量 Setenv 泄入所有子进程

  • 所有 vendor API key/A2A api_key 进程环境 → bash 工具把全部密钥传给任意用户命令(env 一条命令即可导出全部明文);MCP server 默认继承——secret sprawl;注释自认是 "so subsequent lookups work" 但 lookup 走本地 map
    :删除 Setenv 循环;第三方 SDK 依赖(ANTHROPIC_API_KEY 等)按需显式传递。

案 B(Med-High·跨工作区污染):legacy a2a.yaml 双向污染

  • 工作区 a2a.yaml 设 port: 7777 → 不登记 instanceFields → Save() 不剥 a2a 段 → 7777 deep-merge 进全局 ggcode.yaml 所有工作区继承;SaveInstance 的 diffA2A 又把 legacy 值写进 instance 文件(双处重复定义);legacy 文件不删永不收敛
    :MergeA2AConfig 传入 tracked map 登记;迁移成功后删 legacy。

案 C(Med):instance scope 清零/清空改动永久无效

  • max_iterations 曾设 80 → 清零:diffInt 抑制丢弃 + SaveInstance deep-merge 旧值残留 + Save() 因登记剥离全局 → 重载后 80 填回,清零无任何报错;delta 是 map 本不需要零值抑制(im.enabled 对照佐证)
    :去掉 scalar/int/timeout 的零值抑制。

案 D(Med):双引号 Unquote 失败连引号保留成凭据

  • shell rc 中 MY_KEY="a\qb"(Windows 路径/正则)→ 返回带引号整串 → 认证静默失败——单引号分支有正确 strip 双引号没有
    :Unquote 失败 fallback 剥首尾引号取内部原文。

案 E(Med+Low-Med×2+Low)

  • external_files 保存失败吞 err——Save() 假成功重启丢配置;已有 adapter 的 instance 级修改不入 delta(只收新增,还可能漏进全局 im.yaml);glm+任意 'v'(preview)误报 vision——表外新模型被发图 API 拒绝
    :保存失败上抛;adapters 深比较;vision 启发式收紧。

干净项

context_window:窗口查找链/k-m 边界/溢出(不可达)全对。env:${VAR:-default} bash 语义正确(#1515 案 D 相关面核验在位)/无递归死循环。instance:#731/#524/#609/#368/#734/#282 各修复在位。instance_delta:diffVendors map 序比较/diffSlice null 守卫正确。

排除

#1515/#1517 config 族(env.go parseEnvAssignment 引号往返翻案记录/instance.go LoadA2AOverride 调用点引述——本体全文深读为新一轮);#1160/#981 在位。

严重程度

High(安全)+ Med-High + Med×3 + Low-Med×2 + Low


独立复核确认:7/7 全部原文核对+调用链穷尽(run_command.go:886 继承实证/globalSnap 时序/deep-merge 残留链/单双引号对照/bool 无抑制佐证/子串误配限表外名)。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions