漏洞
把调试器交给模型之前,我们审计了 jshookmcp 的源码、发布链与后门风险
在固定源码提交 bb79e43d 与 npm 0.3.4 发布包中,SOSEC 未发现第一方隐蔽后门;默认 search 配置能够抵达主机进程执行、内存注入、浏览器凭据访问、远程扩展与共享网络状态,发布链同时缺少源码溯源证明,因此部署时必须按高权限双用途基础设施隔离服务、浏览器、凭据和目标进程。

文章导航
结论:在提交 bb79e43d60ffcd9fa3e330825f6e9efb0006d790 和 npm 0.3.4 的限定范围内,静态审计未发现第一方隐蔽后门。公开能力可以启动进程、写入远程内存、读取浏览器数据、导入远程扩展并探测网络,足以造成主机执行、会话泄露和远程代码加载。服务、浏览器配置、凭据与目标进程需要置于可丢弃的隔离环境。
1审计结论与部署边界
jshookmcp 把浏览器调试、JavaScript 运行时分析、进程管理、网络诊断、协议解析和扩展加载统一成 MCP 工具。项目公开描述的目录超过 600 项工具、横跨 34 个域,使模型可以从解释代码推进到操作正在运行的主机。它的安全性取决于调用主体、授权路径、状态隔离,以及安装包与已审计源码之间的可验证对应关系。
本报告以两个直接快照作为四类证据的身份锚:仓库默认分支提交 bb79e43d,提交日期为 2026 年 7 月 21 日;以及 npm 在 2026 年 7 月 15 日发布的 @jshookmcp/[email protected]。后门排查覆盖第一方生产源码、发布包文件清单、生命周期脚本、动态加载点、网络出口、持久化、凭据访问、操作系统启动项和二进制载荷,并另行审阅历史与部署边界。结论只对这些固定对象及本报告列明的方法负责,不替未来提交、远程模型文件、运行时安装的扩展或被替换的 npm 包背书。
1.1后门排查结论与部署风险
静态审计未发现第一方代码暗中回传遥测、抓取密码数据库、安装开机启动项、自更新、连接隐蔽命令服务器,或下载后执行未声明载荷。npm 根包中也未包含 .node、.wasm、.exe、.dll、.so 或捆绑浏览器可执行文件。这些结果排除了本次范围内的若干常见后门形态。产品公开提供的远程调试与注入能力仍可在授权不足时被提示注入、误调用、被盗会话或恶意扩展转化为入侵通道。
因此本报告把“恶意意图”和“可造成的结果”分开处理。前者需要代码、发布者行为、基础设施或运行证据支持,目前没有这样的证据;后者可以直接从调用路径证明,而且范围很大。对部署者而言,是否应隔离运行取决于可达能力,不取决于维护者是否怀有恶意。
1.2代码位置、受影响版本与立即响应
默认权限扩张路径。固定提交 bb79e43d 在 src/index.ts 第 106 至 115 行选择默认 profile;MCPServer.search.ts 第 95 至 120 行让搜索结果默认可以自动激活,同文件第 174 至 270 行实现域与工具激活,随后 MCPServer.search.handlers.call.ts 第 127 至 179 行加载并执行原本未激活的目标。真正改变状态的分支是“激活域后调用工具”。search 用于节省模式上下文,没有形成不可突破的允许列表。
本次审计确认的已公开漏洞是 GHSA-c5r6-m4mr-8q5j / CVE-2026-49856。在公告快照 d309c395 中,MCP 的 call_tool 经路由器和网络清单抵达 handleNetworkTraceroute() 第 114 至 143 行或 handleNetworkIcmpProbe() 第 232 至 260 行;两条路径都让 resolveHostname() 接收模型控制的主机名,并把结果直接交给原生探测器。引入提交 b5e3b00f 把该路径带入 0.2.9;修复提交 02111311 在两项处理器进入原生 sink 前加入 parseNetworkAuthorization 与共享目标授权。按源码与 npm 发布物复核,机制影响范围是 >=0.2.9 <0.3.2,0.3.2 起修复;当前 0.3.4 包含修复。GitHub 公告只列出 0.3.1,比可复现的机制范围更窄。
漏洞允许未获得网络授权的调用者对内网地址发起 traceroute 或 ICMP 探测,形成可用于内网测绘的 SSRF 类行为。它不读取云元数据或内部 HTTP 响应体,不向内部服务写数据,也没有直接证明代码执行;可观察结果是可达性、近似延迟、路由跳数和 ICMP 错误类别。实际可达还要求 network 域已激活、调用者能够使用工具、平台存在可工作的 ICMP provider。Windows 通常无需管理员权限即可提供 ICMP;Linux 与 macOS 的原始 ICMP 一般需要 root 或 CAP_NET_RAW。截至审计截止日,没有公开证据表明该漏洞已被利用。
修复默认拒绝未授权目标,但有两个边界必须写清:项目测试明确允许 127.0.0.1,所以公告中“回环地址被阻断”的字面描述与实现不一致;全局环境变量 ALLOW_LOCAL_SSRF=true 仍可关闭这层防护。0.3.2 和 0.3.3 已有默认拒绝逻辑,但授权字段直到提交 bd05892d 并随 0.3.4 发布后才出现在工具模式中。公告叙述提到一条完整 call_tool 回归测试,仓库实际签入的是直接 handler 测试;它验证了缺失和修复的 handler 策略,却没有证明每个网络工具都经同一公开分派路径执行授权。项目还需要一项目录级不变量测试,枚举所有网络 sink 并证明私网拒绝不能被新工具绕开。
| 对象 | 结论 | 部署动作 |
|---|---|---|
| jshookmcp 0.2.9 至 0.3.1 | 网络探测路径缺少中央授权,受 CVE-2026-49856 机制影响。 | 永久升级到 0.3.4;至少不得低于 0.3.2。 |
| jshookmcp 0.3.2 至 0.3.3 | 默认拒绝逻辑已存在,但客户端工具模式没有暴露所需授权字段。 | 升级到 0.3.4,避免依赖不可表达的例外流程。 |
| jshookmcp 0.3.4 | 上述漏洞已修复,但主机注入、浏览器数据和扩展加载等高权限面仍然存在。 | 放入独立虚拟机或容器;使用专用浏览器配置;禁用远程扩展;不要设置 ALLOW_LOCAL_SSRF=true。 |
| npm 版本 | 发布时间 UTC | 复核后的机制状态 | registry SHA-1 |
|---|---|---|---|
0.2.8 | 2026-04-18 08:44 | 尚无 ICMP 与 traceroute 工具 | d36dce1190c57078e7401a3d8446ddffdbcd33e7 |
0.2.9 | 2026-04-24 09:46 | 本次发现的首个受影响发布物 | 02f91efc96cfa64c1b5cd35399b4894f9f529430 |
0.3.0 | 2026-05-01 15:37 | 存在未授权 resolver-to-sink 路径 | 6183d6abf10636c7c82b8c211e6e8f36ec9f5a0c |
0.3.1 | 2026-05-16 11:25 | 受影响且被公告列出 | e95ff56cbb23e9c85e67ee8b11d53337670ac738 |
0.3.2 | 2026-05-27 05:48 | 首个修复发布物 | 5e96623dbbe366a076494e22177b38ef98f811e8 |
0.3.4 | 2026-07-15 16:26 | 当前 latest,保留修复并暴露授权 schema | 90b95d7fe21d9fde8a1593c9c4a4479ba1d96cea |
永久修复需要统一的强制授权层。不可变的服务端允许列表必须同时覆盖目录搜索、自动激活、显式工具与域激活、持久状态恢复以及直接 call_tool;即使客户端知道完整工具名,策略之外的调用也必须在进入 handler 前失败。恢复状态时应重新授权每个域,昨日激活结果不得直接沿用为今日权限。参数 schema、超时与日志用于请求格式和运行完整性,调用主体、目标与效果仍需单独授权。
若不能立即升级,临时措施是停止暴露网络工具、只使用本机 stdio 传输、在操作系统防火墙上阻断私网和元数据地址,并用不含生产凭据的账户运行。这些措施只能缩小暴露面;同一进程仍保留其他高权限工具,工具模式筛选也未形成安全授权边界。已经在共享主机上运行过旧版本的组织应复查 MCP 客户端日志、出站 ICMP 与 traceroute、异常内网枚举和 ~/.jshookmcp 状态;工具安装记录只能说明软件出现过,漏洞利用仍需结合调用、网络和状态证据确认。
2审计对象、方法与证据边界
源码审计从 MCP 入口沿实际分派路径追到系统调用,并用可疑字符串搜索补充路径审阅。范围包括默认 profile、工具激活、进程启动、注入器、浏览器 CDP、旧版与新版扩展系统、HTTP 传输、状态持久化、嵌入模型下载、npm 生命周期脚本和依赖锁定。对每条敏感路径,审计同时确认危险能力的可达性,并检查授权、确认、作用域隔离、完整性校验和生命周期清理。
本次采用静态方法,未把 jshookmcp 接入带真实凭据的浏览器或生产进程。审计未执行内存注入、安装第三方扩展,公开论坛中的杀毒告警也未作为恶意样本证据。Windows 本地防护曾拒绝读取仓库中的独立 PowerShell 注入辅助脚本,因此该脚本改用固定 Git 对象审阅。这一现象说明安全产品会把注入能力识别为高风险能力;软件意图仍需源码和固定样本证据判断。
2.1固定对象和可复核指纹
仓库快照固定为 bb79e43d60ffcd9fa3e330825f6e9efb0006d790。npm 0.3.4 对应标签对象指向 cde13ed54517cca1a27a90d52a8824789294bcbb,发布包包含 223 个文件,解包后为 3,413,305 字节。包的 SHA-1 是 90b95d7fe21d9fde8a1593c9c4a4479ba1d96cea,SHA-512 完整性值是 sha512-pKaXfOhYXxU0tYcj9+vyH2cRSgIrrYhloYjYIJrG9dzzak3pCuW/fCRKM2SxvfC8v74fP4tcLlqeUQyySBYm6w==。这些值固定了本次审计对象。源码溯源仍需 npm provenance 或发布签名支持。
需要分开的其实是四个对象。源码对象是 7 月 21 日的 bb79e43d;发布源码是 7 月 15 日轻量标签 v0.3.4 指向的 cde13ed;安装对象是注册表 tarball;部署对象则还包括解析后的依赖、环境变量、扩展、浏览器、操作系统权限和持久状态。固定 HEAD 比标签新 14 次提交,其中包括嵌入后端替换和资源控制变化,但 package.json 仍标记 0.3.4。这个快照尚未发布为 0.3.5,普通 npx @latest 用户获取的是标记为 0.3.4 的发布对象。
| 证据对象 | 本次固定身份 | 确认范围 | 范围外事项 |
|---|---|---|---|
| 源码 HEAD | bb79e43d,2026-07-21 | 当前第一方实现与祖先历史 | npm 用户获得了逐字节相同构建或依赖图 |
| 发布标签 | v0.3.4,cde13ed | 成功发布工作流选择的源码提交 | 未签名轻量标签到 tarball 的密码学溯源 |
| npm tarball | @jshookmcp/[email protected] 与注册表 integrity | 根包文件、manifest 和已发布 bundle | 传递原生二进制、运行时下载和后来扩展安全 |
| 实际部署 | 账户、传输、profile、状态、浏览器、网络与扩展 | 真实权限与可达后果 | 仅凭源码审计推断现场配置和利用状态 |
2.2后门排查的证据边界
在 1,341 个生产或发布相关文本文件中,没有发现第一方隐藏遥测端点、凭据数据库解密器、操作系统自启动写入、自更新器、隐蔽 C2 地址或编码下载器。仓库里可疑的二进制样式文件属于测试夹具,npm 根包没有第一方原生载荷。网络连接点能够由已声明功能解释,包括浏览器调试、远程扩展、Webhook、模型下载和用户选择的 HTTP 传输。
项目内容包含 shellcode、cookie 和 base64 等高频术语;它们描述项目的分析对象。tarball 没有嵌套归档,只有 dist/index.mjs 带可执行位。Lefthook 只修改当前 checkout 的仓库级 Git hook;Sentry、Mixpanel 和 Google Analytics 名称来自目标分析签名,"Telemetry Alert" 是本地告警名称。这些负向控制用于区分分析功能、开发工具与后门迹象。
阴性结论有三项限制。第一,依赖安装脚本会在本机编译或获取原生依赖,根包审计没有覆盖每个依赖及其分发基础设施。第二,运行时可下载模型和扩展,最终执行对象可能位于发布包之外。第三,工具已经具备高权限动作,被攻陷的上游、恶意插件或不可信 MCP 客户端可以直接利用这些能力。本报告的结论限定为在固定范围内未发现第一方隐蔽后门;运行安全仍由依赖、部署配置、调用主体和隔离措施共同决定。
3search profile 的实际权限路径
项目默认使用 search profile。界面只暴露少量搜索、域激活和调用工具,容易让部署者把未显示工具理解为不可用。源码中,search 负责模式缩减和发现,未提供最小权限边界。auto_activate 默认开启,调用处理器可以根据工具名称加载尚未激活的目标域,域激活路径也没有独立的 profile 授权判断。
这一差异是整篇报告最重要的部署事实。安全评估不能停在 tools/list 的第一屏,而必须问 call_tool 能否抵达隐藏域、谁可以激活域、激活结果是否跨会话保存。jshookmcp 会把已激活域写入 ~/.jshookmcp/state 并在之后恢复,所以一次会话做出的能力扩张可能改变后续会话。把工具藏在搜索之后可以降低上下文成本,却没有建立新的信任边界。
| 控制点 | 当前作用 | 仍需授权的事项 | 最低验收 |
|---|---|---|---|
| 目录搜索 | 缩减发给模型的 schema | 搜索结果是否属于主体允许列表 | 策略外工具不得出现在结果或被自动激活 |
| 域与工具激活 | 改变进程内可用能力 | 主体是否有权改变该状态 | 显式激活和自动激活都经同一不可变策略 |
直接 call_tool | 校验参数后加载并执行目标 | 精确工具名、目标对象和预期效果 | 精确名称调用同样受策略拒绝 |
| 状态恢复 | 恢复昨日激活的域 | 今日主体和策略是否仍允许 | 逐域重新授权,不符合者丢弃 |
| schema、超时、日志 | 保证类型与运行完整性 | 谁能对什么目标造成什么效果 | 参数通过后仍独立授权主体、目标和效果 |
3.1从模型调用到主机进程
ProcessManager.impl.ts 第 378 至 395 行用参数数组创建进程,避开 shell 字符串带来的元字符解释,这降低了 shell 元字符注入,却仍允许启动调用者指定的二进制;detached 与 unref() 还可能让子进程脱离服务生命周期。注入策略第 446 至 460 行默认选择 balanced,第 320 至 367 行主要检查参数形态、目标进程与技术匹配,并不要求人在危险操作前确认;调用者还可以请求 disabled 模式关闭这层验证。
工具构造器第 93 至 104 行把未明确声明的注解字段默认成 false,若破坏性工具没有显式设置 destructiveHint,客户端不能据此得到可靠风险提示。MCP 协议允许 LLM 选择工具;注解只承担客户端交互提示,服务端授权需要独立实现。提示注入、上下文误解或被劫持客户端都可能给出语法合法的请求,真正控制必须位于模型之外,包括独立账户、操作系统沙箱、目标进程白名单和生产凭据隔离。
3.2内存注入的公开实现
Windows 注入器第 53 至 152 行明确调用 OpenProcess、VirtualAllocEx、WriteProcessMemory 和 CreateRemoteThread;第 288 至 376 行把 shellcode 写入远程进程后执行。Unix 路径第 466 至 565 行则通过 GDB 或 LLDB 注入。独立 PowerShell 辅助脚本在第 20 至 21 行写着安全停用提示;TypeScript 注入器仍保留完整的活动注入路径,部署判断应以这条实现为准。
这些代码与项目公开定位一致,调用路径和用途均可见。一次成功调用可以在目标进程内执行所选代码。任何能够让 jshookmcp 接触生产进程的环境,都应按远程调试器和注入框架管理。服务账户不应拥有调试生产服务、写其他用户进程或加载任意动态库的权限。
3.3安全沙箱只覆盖局部功能
项目的一项维护功能运行在 QuickJS 隔离中。主进程执行、浏览器 CDP、原生注入、旧版插件导入和现代扩展工作流均位于这条边界之外。部署威胁模型应按各执行路径分别划界;局部 QuickJS 隔离不覆盖整个 MCP 服务。
4浏览器连接意味着会话机密也在范围内
浏览器工具的 schema 第 42 至 71 行允许读取当前页面的全部 cookie,其中包括网页 JavaScript 通常无法读取的 HttpOnly cookie;handler 第 194 至 217 行把原始结果返回调用者。它还可以读取 localStorage、sessionStorage 和 IndexedDB。通用脱敏层只保护部分日志与 sandbox 输出,不会自动清洗 cookie 和 storage 这类显式工具返回值。工具没有实现 Chrome “Login Data” 数据库解密器,所以本报告没有把它描述成系统密码窃取器;但对已登录网页而言,会话 cookie 往往已经足以代表账户。
自动连接模式会寻找普通 Chrome 配置和 DevToolsActivePort。如果用户在日常浏览器上启用了远程调试,jshookmcp 可能接触到并非为安全测试准备的真实会话。BrowserModeManager 第 126 至 149 行给服务启动的 Chrome 加入 --no-sandbox 与 --disable-setuid-sandbox。这些参数在某些容器环境中常见,却取消了浏览器自身的一层隔离;容器场景应由容器自身提供等效隔离;宿主机直接运行会失去这层保护。
4.1专用浏览器配置是凭据边界
部署时应创建不含个人账户、企业单点登录、钱包、密码管理器和生产管理后台会话的专用配置目录。该浏览器只访问待测目标,测试结束后销毁整个配置。仅清理历史记录不够,因为 cookie、IndexedDB、服务工作线程缓存和扩展状态可能分散在多个存储中。若必须连接现有浏览器,应先把该动作视为凭据访问并取得明确的人类授权。
4.2能力描述要按最坏可达结果写
浏览器工具名称可能强调“页面数据”或“调试”,但安全边界应按实际返回值定义。包含 HttpOnly cookie 的响应应视同敏感凭据;截图、DOM 和存储数据可能包含个人信息;执行页面脚本可能触发带登录态的业务操作。网关和审计日志应记录工具名、目标 origin、授权主体和结果分类,同时避免把 cookie 值本身再次写入低保护日志。
4.3提示注入会把网页变成间接操作者
当模型同时读取不可信网页内容并拥有浏览器、进程或扩展工具时,网页中的指令可能影响下一步工具选择。这类提示注入会跨越网页内容与高危工具之间的信任边界,静态后门扫描覆盖不到运行时决策。应把读取内容的模型与执行高危动作的模型或审批环节分开,并对 cookie 导出、进程注入、任意命令和扩展安装设置服务端拒绝策略。
5扩展系统把信任边界推到仓库之外
旧版插件注册表接受 HTTP(S)、file://、绝对路径和项目相对路径。PluginRegistry 第 281 至 309 行下载并缓存远程来源,没有固定摘要、签名或模块下载字节上限;第 180 至 213 行随后以动态 import 把它带入 MCP 主进程并调用导出。插件域虽然标为 full tier,但 search profile 可以在运行时激活域,因此 profile 标签本身不会阻止不可信插件获得主进程权限。
插件激活还会启动默认端口 18789 的 Webhook/C2 风格服务。WebhookServer 第 115 至 170 行没有把监听固定到回环地址,HMAC 验证是可选项,请求体没有严格上限,生命周期清理也不可靠。这里的 “C2” 是项目功能命名和控制通道形态,不表示发现恶意指挥基础设施。风险来自额外监听面、认证可选和主进程执行三者组合。
5.1现代插件有摘要门,但边界仍有缺口
现代扩展实现对插件提供摘要校验,严格模式只在 NODE_ENV=production 时默认开启。工作流导入不经过同一摘要门。远程安装器可以克隆注册表指定的仓库和 revision,安装依赖时使用 --ignore-scripts,但随后会执行包的构建步骤并动态导入结果。插件目录中的 .env 还会合并进主进程环境。
--ignore-scripts 降低了安装阶段自动脚本风险,却没有把扩展变成数据文件:构建命令和 import 本身就是代码执行。摘要如果来自同一可变远程注册表,只能检测传输差异,不能独立证明发布者身份。插件与 workflow 都应在 import 之前校验精确字节、固定提交、组织独立持有的摘要与发布者签名。更稳妥的模式是离线取得扩展,由组织自行审阅构建,再把只读产物带入隔离环境。
5.2权限 API 尚未形成强制控制
ExtensionManager 第 499 至 533 行中的 hasPermission() 当前总是返回 true。这意味着清单里看起来存在的权限声明不能被当作运行时强制控制。卸载扩展也不能撤回已经执行的 ESM 顶层副作用、已注册回调、已修改环境变量或已打开的外部资源。可靠隔离需要独立进程承载扩展,并在卸载时终止该进程;长期运行的 Node.js 进程无法撤销已经执行的代码。
5.3上线前的最低扩展策略
生产构建应直接移除旧扩展注册表,或重新设计为远程内容永远不能进入主进程。生产与企业环境还应默认禁止远程 URL、file:// 和用户可写目录中的插件;关闭未使用的 Webhook 服务;若必须启用,则固定到回环或专用管理网卡、强制 HMAC、限制请求体并置于反向代理速率限制之后。允许列表应绑定内容摘要、签名和固定提交,仓库名称只作为来源标识。所有扩展都应视为与 jshookmcp 服务账户同权限的本地代码。
6HTTP 会话的共享状态边界
项目默认使用 stdio,这是较安全的起点,因为它不自动创建网络监听面。选择 HTTP 后,默认地址是 127.0.0.1:3000;若绑定非回环地址,代码要求令牌并以恒定时间方式比较,除非显式设置 MCP_ALLOW_INSECURE=1。服务已有默认 10 MiB 请求体上限、速率和代理控制,这是有价值的防误配措施;但传输本身没有 TLS,没有 Origin 的请求仍被接受,配置 token 后也会把 Origin 条件视为充分。令牌不能修复更深层的共享状态问题。
HTTP 层为会话创建 UUID、重写 JSON-RPC ID 并路由响应,可以降低普通响应混淆;浏览器目标选择也有部分 session 粒度。域 activation map、extension registry、事件状态、内存会话、缓存和通知仍是进程级共享对象,通知会广播。session ID 负责响应路由,没有划分安全租户。一个客户端激活插件、改变域状态或触发进程级副作用,可能影响同一服务中的其他客户端。该架构适合单一信任域内的工具复用;互不信任的用户需要独立实例。
6.1网络暴露的正确单位是实例
需要远程访问时,应为每个用户或任务启动独立实例和独立操作系统身份,由具备 TLS、强认证、速率限制和请求大小限制的网关代理。实例退出时销毁状态目录、浏览器配置和临时文件。不要把一个 HTTP 进程当作多租户控制平面,也不要设置 MCP_ALLOW_INSECURE=1 来绕过绑定检查。
6.2本机监听仍需防范同机攻击者
回环绑定阻止外部网络直接访问,却不能隔离同一主机上的其他用户、被攻陷的浏览器、恶意开发工具或容器逃逸后的进程。若服务携带可读浏览器会话和调试权限,本机任意客户端获得调用能力就足以造成严重影响。Windows 命名管道、Unix 域套接字权限或只由父进程持有的 stdio 通道,更适合表达本机单主体信任。
6.3状态目录也属于安全边界
~/.jshookmcp 保存激活域、缓存和其他运行状态。ServerRuntimeState 第 294 至 319 行恢复状态时,应让每个域重新通过当前不可变允许列表,不再允许的能力必须丢弃。该目录应由专用账户独占,不能在用户之间复用,也不应被打包进通用开发环境镜像。调查异常调用时需要保留它作为证据;正常任务结束时则应连同实例一起销毁。
事故调查至少要固定进程启动时间、有效 transport 与 profile、恢复域集合、状态目录、活动扩展及其摘要、浏览器目标、监听套接字、子进程树和操作系统身份。若这些字段没有被记录,事后只能知道“调用过工具”,无法判断能力何时扩张、作用在哪个目标,也无法区分本次会话与遗留状态。
7发布链的可复核证据与溯源缺口
npm 0.3.4 的发布时间与 GitHub Actions 运行 29432085723 和标签提交一致;checkout、包验证、packed-install smoke test 与 publish 均成功。问题在于包没有 npm provenance,元数据没有 gitHead,标签是未签名轻量标签,项目没有 GitHub Release、SBOM 或独立校验和。npm 的 ECDSA 注册表签名只能绑定包名、版本和 integrity,不能证明仓库来源或代码安全。工作流使用长期 NPM_TOKEN,没有 OIDC id-token。外部审计者可以做内容比对,却不能从注册表获得一条可验证声明,证明 tarball 必然由该公开工作流从该提交构建。
仓库共有 22 个 npm 版本、14 个标签,只有 0.1.5 和 0.3.1 是 annotated tag,且没有正式 Release;没有对应标签的版本包括 0.1.2、0.1.3、0.1.4、0.1.6、0.1.9、0.2.5、0.2.8 和 0.2.9。发布工作流第 9 至 62 行接受任意 v* 标签和手动 dispatch,第三方 Action 使用可变标签而非提交摘要,也没有断言标签版本、package.json 和待发布包三者一致。另一个 pull_request_target 质量门以 PR 写权限运行第三方 anti-slop Action,增加了与正常包发布不同的仓库供应链机会。这里没有发现账号被盗或包被替换;缺口是无法独立证明没有发生替换。
| 发布属性 | 已观察证据 | 缺口 | 部署含义 |
|---|---|---|---|
| 标签与源码 | v0.3.4 指向成功工作流 SHA | 轻量、未签名,HEAD 又前进 14 次提交 | 分别固定发布提交与审计 HEAD,不混称同一对象 |
| 注册表工件 | integrity、223 文件、3,413,305 字节 | 无 provenance、gitHead、SBOM 和独立校验和 | 内部留存 tarball 与摘要,不能只记版本号 |
| 工作流 | checkout、验证、安装 smoke test、publish 成功 | 长期 token、可变 Action、可手动触发、无版本等式断言 | Action 固定 SHA,改用 trusted publishing 并加入标签版本断言 |
| 依赖锁 | 发布标签锁 895 个记录,当前 HEAD 842 个,均带 integrity,未见 Git/VCS 或直接 URL 依赖 | 消费者不获得 pnpm lock 与 overrides | 同一根版本在不同日期可解析出不同传递依赖 |
| 构建输入 | Node 22、ubuntu-latest、Action 标签与 semver 范围 | 输入可漂移,未做第二次干净构建哈希比对 | 记录构建镜像、工具链和依赖图,晋级已审阅镜像 |
7.1安装脚本公开存在,风险来自依赖执行
发布版 scripts/postinstall.cjs 第 10 至 79 行依次处理 Better SQLite、Isolated VM 与 Koffi,可能调用 node-gyp 或 npm rebuild,失败被视为非致命。脚本可读,审计未见读取根包凭据、下载浏览器或执行编码第二阶段。原生依赖的生命周期代码仍会在安装机运行,安装过程因此包含代码执行面。
发布 tarball 经过文件 allowlist,只有 dist/index.mjs 带可执行位,归一化时间戳提高了打包确定性;本次没有完成第二次独立干净构建并匹配 tarball 哈希。发布标签的 pnpm lock 有 895 个记录、当前 HEAD 有 842 个,记录都有 integrity 且未见 Git/VCS 或直接 URL 依赖;普通 npm 消费者拿不到该 lock 和 overrides,会重新解析 semver。高敏感环境应在无凭据构建器中安装,固定内部 lock、注册表、原生二进制摘要和构建镜像,记录最终依赖图,再把已审阅镜像晋级到运行环境。部署策略应禁止每次启动从公共范围重新安装。
7.2嵌入模型缺少固定身份
0.3.4 通过 Transformers 路径加载 Xenova/bge-micro-v2,没有固定 revision 或摘要。当前 HEAD 的直接下载实现第 166 至 208 行从 Hugging Face 的 resolve/main 获取 tokenizer.json 和 model.safetensors,跟随重定向,却不校验预期 SHA、签名、revision 或总字节上限;15 秒中止计时器在收到响应头后就被清除。没有证据表明模型已被篡改,但可变远程对象会带来搜索结果投毒、资源耗尽和解析器暴露风险。
模型通常不被当作“可执行依赖”,但它会决定工具检索结果,因而能影响模型下一步调用哪些高权限工具。部署者应镜像并固定模型提交与摘要,限制下载大小,在离线构建阶段取得文件,运行阶段禁止服务任意访问模型托管站点。
7.3两个依赖公告需要按可达性处理
0.3.4 的可选 Transformers 依赖解析到 Sharp 0.34.5,版本落入 GHSA-f88m-g3jw-g9cj 的受影响范围,修复版本为 0.35.0;本次没有证明 jshookmcp 把不可信图像送入相应路径,所以它是版本暴露,不是已证实可利用漏洞。锁文件中的 protobufjs 8.6.4 则低于 GHSA-j3f2-48v5-ccww 的修复版本 8.6.6,protobuf handler 第 411 至 422 行接受 proto 文本或路径并调用 parse/load,无限循环型拒绝服务路径具有更明确的可达性。另一个文本格式原型变异公告也覆盖锁定版本,但审计没有发现产品导入对应扩展;新鲜 semver 解析可能已选择修复版,批准锁仍保留 8.6.4。当前 HEAD 已移除旧 Transformers/Sharp 链,但维护者应把该变化和依赖修复发布成新版本,不能继续让未发布 HEAD 与 npm 共用 0.3.4 身份。
8历史、问题响应与社区信号
截至固定日期,仓库有 1,605 次提交,其中维护者 vmoranv 完成 1,592 次,约占 99.19%,Dependabot 完成 13 次;合并提交为 26 次。GitHub 页面显示约 1,813 个 star、444 个 fork 和 4 个 watcher。三个已合并外部 PR 的作者没有出现在 shortlog,可能由 squash 或重建提交造成,不能仅据作者统计否定其贡献。高活跃度和可见度有助于发现问题,但核心维护高度集中,发布密钥、审查判断和项目连续性都存在明显单人依赖。
13 个外部、非 PR 的 issue 全部关闭,关闭耗时中位数约 8.8 小时;有维护者留言的 11 个 issue 首次回应中位数约 3.3 小时。分布比中位数更重要:#44 约三分钟获得回应、三小时内关闭,#10 通过 PR #11 修复;五个 issue 超过七天,#77 约 24 天。安全修复提交后约 20 分钟发布仓库公告,npm 0.3.2 在约一小时内发布,显示已知漏洞处置很快,但不能据此推断每个问题都快速。
74 个 PR 中,24 个合并、46 个关闭、4 个开放且均为 Dependabot;来源可分为 Dependabot 32 个、维护者 20 个、外部人类 22 个。外部 PR 关闭中位数约 4.4 小时,只有 3 个合并,而且来自同一贡献者。PR #26 一次增加 18,831 行、涉及 75 个文件,约三分钟后关闭,后来拆成五个较小后续。维护者称其由 AI 生成且未充分验证属于公开讨论中的个人陈述;可独立验证的是改动规模、关闭时间和后续拆分。
| 治理信号 | 公开证据 | 积极含义 | 不能推出 |
|---|---|---|---|
| 普通 issue | 13 个外部 issue 全部关闭,中位 8.8 小时 | 维护者通常会响应并收口 | 长尾问题和安全报告都有同样时效 |
| 安全修复 | 修复、公告和 npm 版本在约一小时内衔接 | 已有问题可快速发布 | 公告范围、测试文字和版本清单完全准确 |
| 外部 PR | 22 个人类外部 PR,3 个合并 | 项目主动控制大改动风险 | 自动门不会阻碍可信安全贡献 |
| 声誉目录 | Agent Reputation 4.0/5、Protodex “Clean” | 项目有可见度与第三方关注 | 前者主要反映 GitHub 热度,后者未公开扫描方法 |
| 社区运行报告 | 出现高 CPU 无头浏览器与杀毒拦截讨论 | 用户会公开反馈运行问题 | 没有固定版本、哈希和日志就不能判定根因或恶意 |
8.1安全政策缺少有效报告入口
仓库的 SECURITY.md 仍是模板,列出并不存在的 5.1、5.0 和 4.0 支持分支,也没有真实的私密报告渠道、响应时限、加密密钥或披露流程。对一个能读取会话凭据并进行进程注入的项目,这不是文档小问题。研究者可能被迫公开提交 issue,维护者也缺少统一的确认、修复和协调发布机制。
8.2杀毒告警的证据缺口
4 月 23 日的公开帖子记录了火绒告警。帖子未提供样本哈希、规则名、检测路径、隔离对象、版本或可复现步骤,因此只能作为待核验线索。项目包含内存注入、shellcode 和调试能力,安全产品产生高风险或启发式告警并不意外;恶意归因仍需固定样本和行为证据。
8.3治理速度与结构性控制
PR 模板设置了 honeypot,质量门工作流会对硬信号自动关闭、对软信号只警告,但 CONTRIBUTING.md 仍落后于这种 hard/soft 划分。这种自动治理有助于处理低信任大改动,也可能让外部安全研究者不清楚如何提交高风险修复。Agent Reputation 的 4.0/5 主要来自 GitHub 热度,不是原生安全评分;Protodex 的 “Clean” 没有公开扫描方法,不同目录报告的工具总数还会随抓取提交变化,均不能承担信任结论。
社区另有高 CPU 无头浏览器进程报告,维护者在 3 月 20 至 21 日回应,0.2.2 随后发布,后来历史中也出现资源控制提交。这些记录显示维护者响应并持续改进;公开证据尚未覆盖每一条孤儿进程和 detached 子进程路径。签名发布、双人审查、最小权限和有效安全政策仍需单独建设。项目的单一维护者结构也集中了账号接管、密钥泄漏、疲劳与误判的风险。
9把它当作高权限基础设施部署
适当的参考架构是一任务一实例:在无生产凭据的短生命周期虚拟机中运行固定版本,使用专用浏览器配置,通过 stdio 与单一 MCP 客户端连接;默认禁用进程注入、任意命令、远程插件和 HTTP 监听,只在明确任务窗口内临时开放必要能力。容器或虚拟机不能重新授予 ptrace、raw socket、宿主设备、host networking、宿主浏览器目录或个人 home。参考材料只读挂载,写入只允许受限 scratch;模型应预装并固定摘要,或直接关闭向量搜索。网络层仅允许待测目标和固定模型镜像,阻断云元数据、私网横向访问和通用互联网出口。
组织还应给高危工具增加服务端策略,MCP 注解仅承担客户端提示。进程 ID、可执行路径、浏览器 origin、网络目标、DNS 解析结果和插件摘要都应进入允许列表;cookie 导出、kill、内存注入、shellcode、workflow load、raw packet/ICMP、Webhook forwarding、远程扩展安装和任意子进程必须获得独立人类批准。批准界面应显示精确 PID、路径、URL、摘要和目标。日志记录包与依赖摘要、有效配置、状态快照 ID、激活来源、脱敏参数、起止时间、结果类别、写入文件、监听器、子进程、扩展摘要和批准人,并送出服务信任区;完整 cookie、令牌和页面机密不得写入日志。
| 部署面 | 最低安全配置 | 必须留存的证据 | 停止上线条件 |
|---|---|---|---|
| 构建 | 固定 tarball、内部 lock、工具链和原生摘要,晋级已审阅镜像 | 源码提交、包 integrity、依赖图、构建镜像与第二次构建哈希 | 无法解释的字节或依赖漂移 |
| 主机 | 短生命周期非管理员实例,无宿主 ptrace、raw device 和个人 home | 操作系统身份、能力集、挂载、子进程树 | 实例可调试宿主进程或读取个人凭据目录 |
| 传输 | 优先 stdio;远程时每主体一实例,TLS 网关与强认证 | 监听地址、token 配置、proxy/Origin 策略、session 映射 | 通配、未认证监听器或共享不互信主体 |
| 浏览器 | 专用无秘密配置,用后销毁 | 目标 origin、配置目录、批准记录和导出类别 | 连接个人或生产浏览器 |
| 扩展 | 默认关闭远程扩展,固定提交、摘要、签名并隔离进程 | 精确字节、仓库提交、构建日志、权限与端口 | 可变远程来源、恒真权限或 18789 未受控监听 |
| 网络 | 仅允许待测目标与固定内部镜像,记录 DNS 结果 | 目标、解析地址、ICMP/traceroute、模型和注册表出口 | 异常私网、回环、模型或 registry 目的地 |
监控与检测。至少为 full-tier 域激活、启动时恢复策略外域、端口 18789、新远程模块或 workflow、插件根目录或 .env 变化、disabled injection validation、连接非实验浏览器、异常 PID、私网或回环探测、MCP_ALLOW_INSECURE、ALLOW_LOCAL_SSRF 和未批准模型或注册表出口建立规则。只记录工具名会漏掉最关键的状态变化和目标变化。
事件响应。发现异常时先停止新调用,不要立即重装。保留进程、~/.jshookmcp、npm cache、精确 tarball、依赖树、扩展 cache 与仓库、浏览器配置、监听套接字、子进程树、网络日志,以及触发调用的客户端对话。随后在干净环境撤销浏览器会话、API token、开发凭据和扩展密钥;重装不能撤销已经导出的 cookie、已启动的 detached 进程或外部系统中的令牌。
恢复标准。从已审阅工件建立新镜像,轮换所有关联 token 与凭据,确认没有残余进程或监听器,丢弃激活状态,只恢复案件必需数据。先用受限出口、无秘密的 canary 运行,再由独立人员以禁用工具的精确名称验证搜索、激活、状态恢复和直接 call_tool 全部失败。
9.1给维护者的修复顺序
| 优先级 | 改进 | 完成标准 |
|---|---|---|
| P0 | 把目录搜索、自动激活、显式工具与域激活、状态恢复和直接 call_tool 置于同一强制授权层;为注入、命令、凭据和扩展动作默认拒绝。 |
精确工具名在每个入口都失败,恢复状态重新授权,跨会话测试证明能力不会扩大其他主体权限。 |
| P0 | 隔离插件和工作流,删除恒真权限检查,远程来源必须固定提交与摘要。 | 扩展在独立低权限进程中运行,卸载通过终止进程撤销全部副作用。 |
| P1 | 发布 npm provenance、签名标签、SBOM 和校验和,Action 固定到提交摘要。 | 注册表证明可验证地绑定源码提交、工作流、包版本和 tarball 摘要。 |
| P1 | 固定嵌入模型 revision 与 SHA,设置下载字节上限,并升级 protobufjs 和 Sharp。 | 运行阶段不获取可变模型,依赖锁不再落入相关公告范围。 |
| P1 | 重写 SECURITY.md,明确受支持版本、私密入口、响应目标与协调披露流程。 | 研究者无需公开漏洞细节即可获得可验证的接收与跟踪渠道。 |
| P1 | 增加第二名发布维护者或指定安全审阅者,审批受保护发布、公告范围、扩展信任变化和高风险 sink 策略。 | 发布密钥与高风险边界不再由单一账户和单一判断控制。 |
| P1 | 更正 CVE 公告的受影响范围与 loopback 文字,记录 0.3.2 默认拒绝和 0.3.4 授权 schema 的差别,并加入网络目录级公开分派测试。 | 公告、测试、源码和版本清单对同一边界给出一致答案。 |
| P1 | 把 HEAD 中移除旧 Transformers/Sharp 链及依赖修复发布为新版本,不再与 npm 0.3.4 共用身份。 | 新标签、manifest、provenance 和注册表包绑定同一可复核源码。 |
联合验收证据。受限构建只有同时满足以下条件才算完成:策略外精确工具名在搜索、自动与显式激活、状态恢复和直接调用中均失败;不会打开第二监听器;模型、模块和 workflow 没有固定 revision、摘要与签名就无法下载或导入;进程无法读取个人浏览器和凭据目录;扩展卸载可通过终止隔离进程撤销副作用;独立操作员能从签名标签重建并匹配注册表工件。
9.2最终判断
本报告的判断固定于源码提交 bb79e43d 与 npm 0.3.4 发布包。新的 npm 包或源码提交、依赖解析变化、嵌入模型或扩展来源变化、HTTP 多租户部署、生产浏览器连接,以及允许列表或持久状态逻辑调整,都应触发重新审计。
综合源码、发布物、漏洞历史和运行边界,jshookmcp 应归类为高权限双用途基础设施。审计范围内未发现第一方隐蔽后门;默认配置仍能把模型调用推进到进程执行、内存注入、会话数据访问、远程扩展和共享网络状态。
它适合在可丢弃、低权限、目标范围明确的研究环境中使用。个人工作站、共享常驻服务、生产网络、自动批准工具调用的代理,以及保存高价值会话的浏览器,都需要先完成本文列出的隔离、供应链固定和授权改造。
研究记录
10证据、对象与来源
下面保留本文实际使用的标识、时间和原始材料,便于继续调查。
10.1研究对象
报告涉及的产品、行为者、技术、受影响对象和控制点。
本次审计的注册表软件包;应固定版本与完整性值,不要使用可变的 latest 标签
用于第一方源码和运行时边界分析的当前 master 快照
轻量 v0.3.4 标签与成功发布工作流的起始提交
本次静态审阅的 0.3.4 tarball 注册表摘要
私网 ICMP 与 traceroute 授权绕过,0.3.2 起修复
首次为两条探测路径应用共享授权的源码与发布提交
能够恢复已激活域和其他运行上下文的默认状态根目录
激活旧版扩展注册表域时启动的第二监听器默认端口
10.2事件时间
- 仓库创建
GitHub 记录仓库创建,第一笔源码提交随后在 2 月 23 日出现。
- ICMP 与 traceroute 引入
提交 b5e3b00f 加入两项网络工具,但没有既有的私网目标授权路径。
- 首个受影响 npm 发布物
0.2.9 是本次审阅中首个包含漏洞探测机制的发布版本。
- 私网探测修复
提交 02111311、标签 v0.3.2、npm 0.3.2 与仓库公告共同关闭默认私网绕过。
- GitHub 审核公告发布
全局记录分配 CVE-2026-49856、CVSS 4.3 与 CWE-918,但只列出 0.3.1 受影响。
- 细粒度探测授权公开
提交 bd05892d 加入随后随 0.3.4 发布的公开授权模式。
- npm 0.3.4 发布
最新注册表软件包由成功的标签工作流发布,并保留网络防护。
- SOSEC 审计截止
本报告固定源码、npm 发布物、发布历史、公开公告、issue、社区说法与高权限调用路径。
10.3来源与材料
- vmoranv/jshookmcp 仓库https://github.com/vmoranv/jshookmcp
- 固定源码提交 bb79e43dhttps://github.com/vmoranv/jshookmcp/commit/bb79e43d60ffcd9fa3e330825f6e9efb0006d790
- v0.3.4 发布提交 cde13ed5https://github.com/vmoranv/jshookmcp/commit/cde13ed54517cca1a27a90d52a8824789294bcbb
- npm 软件包 @jshookmcp/jshookhttps://www.npmjs.com/package/@jshookmcp/jshook
- npm 0.3.4 注册表 tarballhttps://registry.npmjs.org/@jshookmcp/jshook/-/jshook-0.3.4.tgz
- GitHub Actions v0.3.4 发布运行https://github.com/vmoranv/jshookmcp/actions/runs/29432085723
- 固定提交的软件包清单https://github.com/vmoranv/jshookmcp/blob/bb79e43d60ffcd9fa3e330825f6e9efb0006d790/package.json
- 已发布 postinstall 源码https://github.com/vmoranv/jshookmcp/blob/cde13ed54517cca1a27a90d52a8824789294bcbb/scripts/postinstall.cjs
- GitHub 公告 GHSA-c5r6-m4mr-8q5j / CVE-2026-49856https://github.com/advisories/GHSA-c5r6-m4mr-8q5j
- 仓库安全公告https://github.com/vmoranv/jshookmcp/security/advisories/GHSA-c5r6-m4mr-8q5j
- 私网探测修复提交https://github.com/vmoranv/jshookmcp/commit/02111311f7bd0f86a7d7ef8538986594b3a18afa
- Sharp/libvips 公告 GHSA-f88m-g3jw-g9cjhttps://github.com/advisories/GHSA-f88m-g3jw-g9cj
- protobufjs 拒绝服务公告 GHSA-j3f2-48v5-ccwwhttps://github.com/advisories/GHSA-j3f2-48v5-ccww
- npm provenance 文档https://docs.npmjs.com/generating-provenance-statements/
- npm trusted publishing 文档https://docs.npmjs.com/trusted-publishers/
- Model Context Protocol 安全最佳实践https://modelcontextprotocol.io/docs/tutorials/security/security_best_practices
- Model Context Protocol 信任模型与安全政策https://github.com/modelcontextprotocol/modelcontextprotocol/security
- MCP 工具注解风险语义https://blog.modelcontextprotocol.io/posts/2026-03-16-tool-annotations/
- jshookmcp issue #10https://github.com/vmoranv/jshookmcp/issues/10
- jshookmcp PR #11https://github.com/vmoranv/jshookmcp/pull/11
- jshookmcp issue #44https://github.com/vmoranv/jshookmcp/issues/44
- jshookmcp issue #77https://github.com/vmoranv/jshookmcp/issues/77
- LINUX DO 杀毒软件报告讨论https://linux.do/t/topic/2037967
- LINUX DO 进程与 CPU 讨论https://linux.do/t/topic/1789318
- 维护者关于大规模 AI 生成 PR 的讨论https://linux.do/t/topic/2052535?tl=en