标签 代码审计 下的文章

OpenCode 未认证远程命令执行漏洞 前言 Opencode 最近也是很火,看着公众号天天都在推,结果一番,翻到了还有未授权命令执行漏洞,于是来分析分析 在github 已经是超过 66k star 了

漏洞描述 OpenCode 是一个开源的人工智能编码代理。在升级到版本 1.0.216 之前,OpenCode 会自动启动未经验证的 HTTP 服务器,允许任何本地进程(或通过允许 CORS 的任何网站)以用户的权限执行任意 shell 命令。这一漏洞已在版本 1.0.216 中得到修复。 环境搭建

git clone https://github.com/sst/opencode.git
cd opencode
git checkout v1.0.215

bun install

bun run dev

服务器默认监听 http://127.0.0.1:4096,无需任何认证即可访问 验证是否搭建成功

GET /global/health HTTP/1.1
Host: 127.0.0.1:4096
Sec-Fetch-Dest: document
sec-ch-ua: "Not(A:Brand";v="99", "Google Chrome";v="133", "Chromium";v="133"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
Upgrade-Insecure-Requests: 1
Sec-Fetch-Mode: navigate
Accept-Language: zh-CN,zh;q=0.9
Accept-Encoding: gzip, deflate, br, zstd
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36
Sec-Fetch-User: ?1
Sec-Fetch-Site: none


漏洞复现 复现步骤 首先创建一个会话 我们不需要传入参数的,但是必须得有下面的 json

记录 id 就可以直接执行命令了,而且这个端点未授权

pty 路由的话利用方法还更多

利用脚本

漏洞分析 session 执行命令

server.ts - HTTP 服务器配置

.use(cors()) 配置了宽松的 CORS 策略,允许任何源访问而且整个应用中没有任何认证中间件导致所有端点都可以未授权访问 /session/:sessionID/shell 端点

SessionPrompt.shell

很直白 1 用户提供的 command 直接放入 args 2 使用 spawn(shell, args) 执行 3命令以 OpenCode 进程的用户权限运行 4输出返回给 /pty 命令执行 相比于 shell,更强大 API 端点列表:

创建 PTY:

WebSocket 交互源码:

如何利用在漏洞复现部分已经给出了 漏洞修复 还未修复,不过如果需要修复也很简单,加认证就好了,当然有人会有疑问,怎么可能有人把opencode部署在公网上,去fofa搜了,你别说,还真有

image.png

都能直接看到别人的项目 参考资料

资源
链接
漏洞公告
源码仓库

免责声明 本漏洞分析报告仅供安全研究和教育目的使用。请勿将此信息用于任何非法活动。

环境搭建 windows 10 jdk 17 mysql 5.7.26 fastcms 0.1.6 下载地址:https://github.com/my-fastcms/fastcms 登录:http://127.0.0.1:8080/fastcms-master.html 账号/密码:admin/1 1 数据库配置 数据库配置文件:fastcms-master/web/src/main/resources/application.yml

SQL配置.png

数据库文件:fastcms-master/doc/sql/fastcms-master.sql

mysql -uroot -p
source D:\java\fastcms-master\doc\sql\fastcms.sql

2 开发环境 搭建环境会遇到Java 9+ 模块系统(JPMS)兼容性问题,在运行配置中添加虚拟机选项(VM options),输入下列参数即可

--add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED

1-开发环境添加虚拟机.png

3 生产环境 存在漏洞的功能在开发环境无法使用,但在生产环境又无法 debug,此节侧重于在 idea debug 打包,找到 fastcms-master/build.bat 文件(windows 环境用 bat,linux 环境用 sh),双击进行打包,打包完成会出现.dist目录

2-打包文件.png

.dist目录中,启动 startup.cmd 文件即可运行程序,但这样无法 debug,记住fastcms-master-server.jar的绝对路径,这是用 idea debug 的关键

3-jar包.png

在 idea 的运行配置中添加 jar 应用程序

4-运行配置.png

需要设置下列四个参数,jar 路径是fastcms-master-server.jar的绝对路径,工作目录则是fastcms-master-server.jar的所在目录,虚拟机选项和程序实参,则贴在图片下面。名称无所谓

4-jar应用程序配置.png

虚拟机选项

程序实参

启动成功会显示 8080 端口,以及启动时间

5-启动成功.png

代码审计 入口文件:fastcms-master/web/src/main/java/com/fastcms/web/controller/admin/PluginController.java 第一个 if 检查是否为开发环境,如果是开发环境则报错,因此必须是生产环境,生产环境 debug 前面有配置步骤,这里不在叙述,后面两个 if 判断是否有后缀,是否是 jar、zip 文件,最后进入安装环境

审计过程1.png

installPlugin 方法先安装再激活

审计过程2-installPlugin.png

loadPlugin 方法中,loadPluginFromPath 加载插件,resolvePlugins 解决依赖

审计过程3-loadPlugin.png

loadPluginFromPath 是 pf4j 的原生方法,简单看一下,pluginId 不存在代表新插件,新插件载入需要获取插件元数据(pluginDescriptor),获取插件所有类(pluginClassLoader),创建插件实例(pluginWrapper)最后通过 addPlugin 方法载入

审计过程4-加载过程.png

这里就已经实例化并载入了插件,后面需要激活插件,跟进 startPlugin 方法,根据 pluginId 获取插件,再根据插件获取实例化对象,执行 start 方法激活,中间只是判断插件的状态,是激活还是禁止

审计过程5-启动.png

start 方法如下,这是官方 HelloPlugin 插件,是否可以在这里加点代码?

审计过程6-执行start方法.png

漏洞复现 这里为了方便演示,修改官方插件,插件编写方法附在最后 找到fastcms-master/plugins/hello-world-plugin/src/main/java/com/fastcms/hello/HelloPlugin.java文件,添加下列代码

构造1.png

fastcms-master/plugins/hello-world-plugin/目录下打包成 jar 文件

fastcms-master/plugins/hello-world-plugin/target/hello-world-plugin-0.1.6-SNAPSHOT.jar

jar文件路径.png

http://127.0.0.1:8080/fastcms-master.html 登录,账号密码:admin/1

安装插件.png

此时插件管理显示暂无数据,选择打包好的 jar 文件

选择上传.png

上传成功显示插件信息,弹出计算器

上传成功.png

上面是第一次验证的步骤,如果想要重复验证,这时有三种方法 停止项目,找到astcms-master.distplugins,删除 jar,重新启动,再次上传 点击卸载,修改 jar 包名,点击上传 修改 pom.xml 中的artifactIdplugin.id标签,重新打包 jar 演示第二种:点击卸载,会弹出 405 不必理会,刷新一下会移除插件信息,但 jar 包会被保留(在自己编写插件中,若全限定类名不一致,会存在插件信息未移除的情况)

卸载.png

这时上传文件名完全一致的 jar 包会报错,修改 jar 包名后可以上传

重复上传.png

必须的插件结构(推荐在fastcms-master/plugins目录下,完成插件写好后在fastcms-master/plugins/xxx-plugin目录下用mvn clean package打包) xxx-plugin/src/main/java/com/fastcms/xxx/XxxPlugin.java xxx-plugin/plugin.properties xxx-plugin/pom.xml XxxPlugin.java

plugin.properties

pom.xml


环境搭建

windows 10

jdk 17

mysql 5.7.26

fastcms 0.1.6



下载地址:https://github.com/my-fastcms/fastcms

登录:http://127.0.0.1:8080/fastcms-master.html

账号/密码:admin/1

1 数据库配置

数据库配置文件:fastcms-master/web/src/main/resources/application.yml

SQL配置.png

数据库文件:fastcms-master/doc/sql/fastcms-master.sql

mysql -uroot -p
source D:\java\fastcms-master\doc\sql\fastcms.sql

2 开发环境

搭建环境会遇到Java 9+ 模块系统(JPMS)兼容性问题,在运行配置中添加虚拟机选项(VM options),输入下列参数即可

--add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED

1-开发环境添加虚拟机.png



3 生产环境

存在漏洞的功能在开发环境无法使用,但在生产环境又无法 debug,此节侧重于在 idea debug

打包,找到 fastcms-master/build.bat 文件(windows 环境用 bat,linux 环境用 sh),双击进行打包,打包完成会出现.dist目录

2-打包文件.png

.dist目录中,启动 startup.cmd 文件即可运行程序,但这样无法 debug,记住fastcms-master-server.jar的绝对路径,这是用 idea debug 的关键

3-jar包.png

在 idea 的运行配置中添加 jar 应用程序

4-运行配置.png

需要设置下列四个参数,jar 路径是fastcms-master-server.jar的绝对路径,工作目录则是fastcms-master-server.jar的所在目录,虚拟机选项和程序实参,则贴在图片下面。名称无所谓

4-jar应用程序配置.png

虚拟机选项

程序实参

启动成功会显示 8080 端口,以及启动时间

5-启动成功.png



代码审计

入口文件:fastcms-master/web/src/main/java/com/fastcms/web/controller/admin/PluginController.java

第一个 if 检查是否为开发环境,如果是开发环境则报错,因此必须是生产环境,生产环境 debug 前面有配置步骤,这里不在叙述,后面两个 if 判断是否有后缀,是否是 jar、zip 文件,最后进入安装环境

审计过程1.png

installPlugin 方法先安装再激活

审计过程2-installPlugin.png

loadPlugin 方法中,loadPluginFromPath 加载插件,resolvePlugins 解决依赖

审计过程3-loadPlugin.png

loadPluginFromPath 是 pf4j 的原生方法,简单看一下,pluginId 不存在代表新插件,新插件载入需要获取插件元数据(pluginDescriptor),获取插件所有类(pluginClassLoader),创建插件实例(pluginWrapper)最后通过 addPlugin 方法载入

审计过程4-加载过程.png

这里就已经实例化并载入了插件,后面需要激活插件,跟进 startPlugin 方法,根据 pluginId 获取插件,再根据插件获取实例化对象,执行 start 方法激活,中间只是判断插件的状态,是激活还是禁止

审计过程5-启动.png

start 方法如下,这是官方 HelloPlugin 插件,是否可以在这里加点代码?

审计过程6-执行start方法.png



漏洞复现

这里为了方便演示,修改官方插件,插件编写方法附在最后

找到fastcms-master/plugins/hello-world-plugin/src/main/java/com/fastcms/hello/HelloPlugin.java文件,添加下列代码

构造1.png



fastcms-master/plugins/hello-world-plugin/目录下打包成 jar 文件

fastcms-master/plugins/hello-world-plugin/target/hello-world-plugin-0.1.6-SNAPSHOT.jar

jar文件路径.png

http://127.0.0.1:8080/fastcms-master.html 登录,账号密码:admin/1

安装插件.png

此时插件管理显示暂无数据,选择打包好的 jar 文件

选择上传.png

上传成功显示插件信息,弹出计算器

上传成功.png



上面是第一次验证的步骤,如果想要重复验证,这时有三种方法

停止项目,找到astcms-master.distplugins,删除 jar,重新启动,再次上传

点击卸载,修改 jar 包名,点击上传

修改 pom.xml 中的artifactIdplugin.id标签,重新打包 jar

演示第二种:点击卸载,会弹出 405 不必理会,刷新一下会移除插件信息,但 jar 包会被保留(在自己编写插件中,若全限定类名不一致,会存在插件信息未移除的情况)

卸载.png

这时上传文件名完全一致的 jar 包会报错,修改 jar 包名后可以上传

重复上传.png

必须的插件结构(推荐在fastcms-master/plugins目录下,完成插件写好后在fastcms-master/plugins/xxx-plugin目录下用mvn clean package打包)

xxx-plugin/src/main/java/com/fastcms/xxx/XxxPlugin.java

xxx-plugin/plugin.properties

xxx-plugin/pom.xml

XxxPlugin.java

plugin.properties

pom.xml


让代码漏洞挖掘像呼吸一样简单,小白也能当黑客挖洞

DeepAudit - 开源的代码审计智能体平台 ?‍♂️1
DeepAudit - 开源的代码审计智能体平台 ?‍♂️

? 界面预览

### ? Agent 审计入口 Agent审计入口 *首页快速进入 Multi-Agent 深度审计*
? 审计流日志

审计流日志
实时查看 Agent 思考与执行过程
?️ 智能仪表盘

仪表盘
一眼掌握项目安全态势
⚡ 即时分析

即时分析
粘贴代码 / 上传文件,秒出结果
?️ 项目管理

项目管理
GitHub/GitLab 导入,多项目协同管理
### ? 专业报告 审计报告 *一键导出 PDF / Markdown / JSON*(图中为快速模式,非Agent模式报告) ? [查看Agent审计完整报告示例](https://lintsinghua.github.io/)

⚡ 项目概述

DeepAudit 是一个基于 Multi-Agent 协作架构的下一代代码安全审计平台。它不仅仅是一个静态扫描工具,而是模拟安全专家的思维模式,通过多个智能体(Orchestrator, Recon, Analysis, Verification)的自主协作,实现对代码的深度理解、漏洞挖掘和 自动化沙箱 PoC 验证

我们致力于解决传统 SAST 工具的三大痛点:

  • 误报率高 — 缺乏语义理解,大量误报消耗人力
  • 业务逻辑盲点 — 无法理解跨文件调用和复杂逻辑
  • 缺乏验证手段 — 不知道漏洞是否真实可利用

用户只需导入项目,DeepAudit 便全自动开始工作:识别技术栈 → 分析潜在风险 → 生成脚本 → 沙箱验证 → 生成报告,最终输出一份专业审计报告。

核心理念: 让 AI 像黑客一样攻击,像专家一样防御。

? 为什么选择 DeepAudit?

| ? 传统审计的痛点 | ? DeepAudit 解决方案 | | :--- | :--- | | **人工审计效率低**
跨不上 CI/CD 代码迭代速度,拖慢发布流程 | **? Multi-Agent 自主审计**
AI 自动编排审计策略,全天候自动化执行 | | **传统工具误报多**
缺乏语义理解,每天花费大量时间清洗噪音 | **? RAG 知识库增强**
结合代码语义与上下文,大幅降低误报率 | | **数据隐私担忧**
担心核心源码泄露给云端 AI,无法满足合规要求 | **? 支持 Ollama 本地部署**
数据不出内网,支持 Llama3/DeepSeek 等本地模型 | | **无法确认真实性**
外包项目漏洞多,不知道哪些漏洞真实可被利用 | **? 沙箱 PoC 验证**
自动生成并执行攻击脚本,确认漏洞真实危害 |

?️ 系统架构

整体架构图

DeepAudit 采用微服务架构,核心由 Multi-Agent 引擎驱动。

DeepAudit 架构图

? 审计工作流

步骤阶段负责 Agent主要动作
1策略规划Orchestrator接收审计任务,分析项目类型,制定审计计划,下发任务给子 Agent
2信息收集Recon Agent扫描项目结构,识别框架/库/API,提取攻击面(Entry Points)
3漏洞挖掘Analysis Agent结合 RAG 知识库与 AST 分析,深度审查代码,发现潜在漏洞
4PoC 验证Verification Agent(关键) 编写 PoC 脚本,在 Docker 沙箱中执行。如失败则自我修正重试
5报告生成Orchestrator汇总所有发现,剔除被验证为误报的漏洞,生成最终报告

? 项目代码结构

DeepAudit/
├── backend/                        # Python FastAPI 后端
│   ├── app/
│   │   ├── agents/                 # Multi-Agent 核心逻辑
│   │   │   ├── orchestrator.py     # 总指挥:任务编排
│   │   │   ├── recon.py            # 侦察兵:资产识别
│   │   │   ├── analysis.py         # 分析师:漏洞挖掘
│   │   │   └── verification.py     # 验证者:沙箱 PoC
│   │   ├── core/                   # 核心配置与沙箱接口
│   │   ├── models/                 # 数据库模型
│   │   └── services/               # RAG, LLM 服务封装
│   └── tests/                      # 单元测试
├── frontend/                       # React + TypeScript 前端
│   ├── src/
│   │   ├── components/             # UI 组件库
│   │   ├── pages/                  # 页面路由
│   │   └── stores/                 # Zustand 状态管理
├── docker/                         # Docker 部署配置
│   ├── sandbox/                    # 安全沙箱镜像构建
│   └── postgres/                   # 数据库初始化
└── docs/                           # 详细文档

? 快速开始 (Docker)

1. 启动项目

复制一份 backend/env.examplebackend/.env,并按需配置 LLM API Key。
然后执行以下命令一键启动:

# 1. 准备配置文件
cp backend/env.example backend/.env

# 2. 构建沙箱镜像 (首次运行必须)
cd docker/sandbox && chmod +x build.sh && ./build.sh && cd ../..

# 3. 启动服务
docker compose up -d
? 启动成功! 访问 http://localhost:3000 开始体验。

? 源码启动指南

适合开发者进行二次开发调试。

环境要求

  • Python 3.10+
  • Node.js 18+
  • PostgreSQL 14+
  • Docker (用于沙箱)

1. 后端启动

cd backend
# 激活虚拟环境 (推荐 uv/poetry)
source .venv/bin/activate 

# 安装依赖
pip install -r requirements.txt

# 启动 API 服务
uvicorn app.main:app --reload

2. 前端启动

cd frontend
npm install
npm run dev

3. 沙箱环境

开发模式下,仍需通过 Docker 启动沙箱服务。

cd docker/sandbox
./build.sh

? Multi-Agent 智能审计

支持的漏洞类型

漏洞类型描述
sql_injectionSQL 注入
xss跨站脚本攻击
command_injection命令注入
path_traversal路径遍历
ssrf服务端请求伪造
xxeXML 外部实体注入
漏洞类型描述
insecure_deserialization不安全反序列化
hardcoded_secret硬编码密钥
weak_crypto弱加密算法
authentication_bypass认证绕过
authorization_bypass授权绕过
idor不安全直接对象引用
? 详细文档请查看 Agent 审计指南

? 支持的 LLM 平台

? 国际平台

OpenAI GPT-4o / GPT-4
Claude 3.5 Sonnet / Opus
Google Gemini Pro
DeepSeek V3

?? 国内平台

通义千问 Qwen
智谱 GLM-4
Moonshot Kimi
文心一言 · MiniMax · 豆包

? 本地部署

Ollama
Llama3 · Qwen2.5 · CodeLlama
DeepSeek-Coder · Codestral
代码不出内网

? 支持 API 中转站,解决网络访问问题 | 详细配置 → LLM 平台支持

? 功能矩阵

功能说明模式
? Agent 深度审计Multi-Agent 协作,自主编排审计策略Agent
? RAG 知识增强代码语义理解,CWE/CVE 知识库检索Agent
? 沙箱 PoC 验证Docker 隔离执行,验证漏洞有效性Agent
?️ 项目管理GitHub/GitLab 导入,ZIP 上传,10+ 语言支持通用
即时分析代码片段秒级分析,粘贴即用通用
? 五维检测Bug · 安全 · 性能 · 风格 · 可维护性通用
? What-Why-How精准定位 + 原因解释 + 修复建议通用
? 审计规则内置 OWASP Top 10,支持自定义规则集通用
? 提示词模板可视化管理,支持中英文双语通用
? 报告导出PDF / Markdown / JSON 一键导出通用
⚙️ 运行时配置浏览器配置 LLM,无需重启服务通用

? 发展路线图

我们正在持续演进,未来将支持更多语言和更强大的 Agent 能力。

  • [x] v1.0: 基础静态分析,集成 Semgrep
  • [x] v2.0: 引入 RAG 知识库,支持 Docker 安全沙箱
  • [x] v3.0: Multi-Agent 协作架构 (Current)
  • [ ] 支持更多漏洞验证 PoC 模板
  • [ ] 支持更多语言
  • [ ] 自动修复 (Auto-Fix): Agent 直接提交 PR 修复漏洞
  • [ ] 增量PR审计: 持续跟踪 PR 变更,智能分析漏洞,并集成CI/CD流程
  • [ ] 优化RAG: 支持自定义知识库
  • [ ] 优化Agent: 支持自定义Agent