OpenCode:跨站请求可通过升级端点安装任意软件包
Datadog Security Labs(2026年9月24日)详细说明恶意网页如何访问本地 OpenCode 服务器并触发攻击者指定软件包的安装。已在 1.18.22 中修复。
这是什么?
2026年9月24日,Datadog Security Labs(发现者署名为 Christophe Tafani-Dereeper)与 OpenCode 维护者公布了 OpenCode 中一个漏洞的细节。OpenCode 是一款开源 AI 编程代理,可通过 opencode serve 或 opencode web 暴露本地 HTTP 服务器。GitHub 安全公告(GHSA-632h-h47v-g4x4,严重程度 High,CVSS 7.5,未分配 CVE)描述了一种跨站请求:可使服务器安装攻击者指定的软件包,进而在开发者机器上执行代码。
时间线是协调披露的典型范例:2026年8月11日报告,2026年8月24日修复并发布 1.18.22 版本,经过一个月的禁令期后于9月24日公开。
工作原理
两个弱点叠加。其一,服务器的升级端点接受任意 URL 作为安装目标,而不是仅限于版本号。其二,服务器在解析请求体时按 JSON 处理,却没有核对 Content-Type 头是否确为 JSON。网页可以让浏览器发出使用纯文本内容类型的跨站表单提交,从而不触发常规的预检保护,而该请求体仍可以是合法的 JSON。
综合起来,当开发者在本地运行着 OpenCode 服务器时访问某个网页,该网页即可让浏览器请求该服务器从攻击者控制的位置安装软件包。对于通过 npm、pnpm 或 Bun 管理的安装,软件包的生命周期脚本会在安装期间运行。根据公告,即使启用了 HTTP Basic 认证,只要浏览器缓存了凭据,攻击仍可能奏效。通过 curl、Homebrew、Chocolatey 或 Scoop 安装的版本不受这一特定安装途径影响。
为何重要
攻击者无需事先控制机器:只要受害者在本地代理服务器监听期间打开一个网页即可。这与2026年早些时候出现的浏览器可访问的本地 AI 网关属于同一类问题:如果任何网页都能向 “localhost” 发送请求,它就不是安全边界。此外,编程代理通常以开发者的凭据、代码仓库和 shell 权限运行,通过代理自身更新路径执行的代码会继承这些权限。
防御措施
- 升级到 OpenCode 1.18.22 或更高版本。 公告中除升级外未记录其他缓解办法。
- 为
opencode serve和opencode web启用密码认证,除非必要,不要将其暴露到本机之外。 - 确认 OpenCode 的安装方式(例如使用
ls -l "$(command -v opencode)");软件包安装途径涉及 npm、pnpm 和 Bun 安装。 - 将本地代理服务器视为面向互联网的服务: 实施来源(Origin)白名单,在 JSON 端点上拒绝非 JSON 内容类型,并避免提供接受任意安装目标的端点。
- 不使用时关闭本地代理服务器,并避免在同一会话中浏览不可信网站。
状态
| 项目 | 详情 |
|---|---|
| 主要来源 | Datadog Security Labs,2026年9月24日 |
| 公告 | GHSA-632h-h47v-g4x4(High,CVSS 7.5,未分配 CVE) |
| 报告 / 修复 / 公开 | 2026-08-11 / 2026-08-24(1.18.22)/ 2026-09-24 |
| 受影响版本 | OpenCode 1.14.30 起(公告列至 1.18.16;Datadog 列至 1.18.21) |
| 已修复 | 1.18.22 及更高版本 |