Kilo-Org kilocode (CVE-2026-8766)
前言
参考披露的报告复现
受影响产品:Kilo-Org kilocode,一个开源的 AI 代码助手 CLI 工具
受影响版本:≤ 7.0.47
漏洞载体:
KILO_CONFIG_CONTENT环境变量中的{file:}模板替换功能根本原因:不完整的修复——在从旧命名空间
OPENCODE_迁移到KILO_时,遗留的模板替换功能未被禁用,导致控制环境变量的攻击者可读取任意本地文件
漏洞复现
环境搭建
1 | cd kilocode-7.0.47 |
源码结构
kilocode 采用典型的 monorepo 结构,由多个包组成,核心 CLI 功能位于 packages/opencode
1 | kilocode-7.0.47/ |
核心代码集中在 packages/ 目录下
1 | packages/ |
进入 opencode 目录中
1 | packages/opencode/ |
动态调试
我们用 VSCode 来完成调试,这也是最顺手的工具
在项目根目录下创建 .vscode/launch.json 文件,配置如下:
1 | { |
按照漏洞详情及已公开的 POC,故意构造一个错误设置为环境变量
1 | bun install |
运行上面命令后打开链接开始动态调式

Ctrl + P 搜索 config.ts

找到调用 load() 函数的地方

打上断点发现确实走到了这里

1 | // 检查是否通过环境变量 KILO_CONFIG_CONTENT 传入了自定义配置 |
合并时调用了 load() 函数,进去看看

1 | async function load(text: string, options: { path: string } | { dir: string; source: string }) { |
因为最后只返回 data 变量,所以我们直接给 const data 处打上断点
确实走到了这里,里面又调用了一个方法 parseText

进去看看,其中 text 是我们的值,然后又调用了 substitute 把我们的值带入了进去

打上断点后进去看看
1 | // 定义异步函数 substitute,用于替换配置文本中的 {env:...} 和 {file:...} 模板 |
慢慢打断点,在右边可以看到我们传入的值所找到的匹配结果

在 out += JSON 处打断点可以看到初始值就有一个 "a"

在最后的 out += text 处打断点可以看到我们已经拿到文件内容了,最后会返回

回到 parseText() 函数中打个断点查看返回的数据

1 | export async function parseText( |
最后文件内容传给了 problemLine,然后直接 return 返回了

利用链
1 | # 1. 回到正确的执行目录 |

POC
1 | $env:KILO_CONFIG_CONTENT='{"a"{file:C:\Windows\win.ini}":"x"}' |
