漏洞

把调试器交给模型之前,我们审计了 jshookmcp 的源码、发布链与后门风险

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

暖色调查桌面上,一台受约束的 AI 终端面对密封软件包、源码与依赖证据、受保护的网络和进程边界,以及装有高权限安全工具的柜子。
文章导航

研究依据静态审阅固定源码提交 bb79e43d、npm 0.3.4 发布物、仓库历史、公开安全公告、issue、PR 与社区材料;未执行软件包、依赖、注入路径或第三方扩展。

来源固定 Git 历史 / npm 0.3.4 注册表发布包 / GitHub 安全公告与问题记录 / 公开社区材料 / SOSEC 源码和发布链静态审计

结论:在提交 bb79e43d60ffcd9fa3e330825f6e9efb0006d790 和 npm 0.3.4 的限定范围内,静态审计未发现第一方隐蔽后门。公开能力可以启动进程、写入远程内存、读取浏览器数据、导入远程扩展并探测网络,足以造成主机执行、会话泄露和远程代码加载。服务、浏览器配置、凭据与目标进程需要置于可丢弃的隔离环境。

无文字的调查工作台把固定源码、发布包、网络边界和主机权限作为四条独立证据线索汇集到同一个 jshookmcp 软件包。
图 1。可读源码、npm 发布物和运行时权限分别回答不同问题:源码公开不能证明注册表构建来源,包完整性不能证明行为安全,而诚实的调试器交给错误调用者后仍能危及主机。

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代码位置、受影响版本与立即响应

默认权限扩张路径。固定提交 bb79e43dsrc/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.82026-04-18 08:44尚无 ICMP 与 traceroute 工具d36dce1190c57078e7401a3d8446ddffdbcd33e7
0.2.92026-04-24 09:46本次发现的首个受影响发布物02f91efc96cfa64c1b5cd35399b4894f9f529430
0.3.02026-05-01 15:37存在未授权 resolver-to-sink 路径6183d6abf10636c7c82b8c211e6e8f36ec9f5a0c
0.3.12026-05-16 11:25受影响且被公告列出e95ff56cbb23e9c85e67ee8b11d53337670ac738
0.3.22026-05-27 05:48首个修复发布物5e96623dbbe366a076494e22177b38ef98f811e8
0.3.42026-07-15 16:26当前 latest,保留修复并暴露授权 schema90b95d7fe21d9fde8a1593c9c4a4479ba1d96cea

永久修复需要统一的强制授权层。不可变的服务端允许列表必须同时覆盖目录搜索、自动激活、显式工具与域激活、持久状态恢复以及直接 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 的发布对象。

证据对象本次固定身份确认范围范围外事项
源码 HEADbb79e43d,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 传输。

项目内容包含 shellcodecookiebase64 等高频术语;它们描述项目的分析对象。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 行明确调用 OpenProcessVirtualAllocExWriteProcessMemoryCreateRemoteThread第 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.jsonmodel.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 生成且未充分验证属于公开讨论中的个人陈述;可独立验证的是改动规模、关闭时间和后续拆分。

治理信号公开证据积极含义不能推出
普通 issue13 个外部 issue 全部关闭,中位 8.8 小时维护者通常会响应并收口长尾问题和安全报告都有同样时效
安全修复修复、公告和 npm 版本在约一小时内衔接已有问题可快速发布公告范围、测试文字和版本清单完全准确
外部 PR22 个人类外部 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_INSECUREALLOW_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研究对象

报告涉及的产品、行为者、技术、受影响对象和控制点。

npm 软件包@jshookmcp/jshook

本次审计的注册表软件包;应固定版本与完整性值,不要使用可变的 latest 标签

固定源码提交bb79e43d60ffcd9fa3e330825f6e9efb0006d790

用于第一方源码和运行时边界分析的当前 master 快照

发布提交cde13ed54517cca1a27a90d52a8824789294bcbb

轻量 v0.3.4 标签与成功发布工作流的起始提交

npm SHA-190b95d7fe21d9fde8a1593c9c4a4479ba1d96cea

本次静态审阅的 0.3.4 tarball 注册表摘要

漏洞CVE-2026-49856

私网 ICMP 与 traceroute 授权绕过,0.3.2 起修复

修复提交02111311f7bd0f86a7d7ef8538986594b3a18afa

首次为两条探测路径应用共享授权的源码与发布提交

应用状态~/.jshookmcp/state

能够恢复已激活域和其他运行上下文的默认状态根目录

旧版 Webhook 端口18789

激活旧版扩展注册表域时启动的第二监听器默认端口

10.2事件时间

  1. 仓库创建

    GitHub 记录仓库创建,第一笔源码提交随后在 2 月 23 日出现。

  2. ICMP 与 traceroute 引入

    提交 b5e3b00f 加入两项网络工具,但没有既有的私网目标授权路径。

  3. 首个受影响 npm 发布物

    0.2.9 是本次审阅中首个包含漏洞探测机制的发布版本。

  4. 私网探测修复

    提交 02111311、标签 v0.3.2、npm 0.3.2 与仓库公告共同关闭默认私网绕过。

  5. GitHub 审核公告发布

    全局记录分配 CVE-2026-49856、CVSS 4.3 与 CWE-918,但只列出 0.3.1 受影响。

  6. 细粒度探测授权公开

    提交 bd05892d 加入随后随 0.3.4 发布的公开授权模式。

  7. npm 0.3.4 发布

    最新注册表软件包由成功的标签工作流发布,并保留网络防护。

  8. SOSEC 审计截止

    本报告固定源码、npm 发布物、发布历史、公开公告、issue、社区说法与高权限调用路径。

10.3来源与材料

  1. vmoranv/jshookmcp 仓库https://github.com/vmoranv/jshookmcp
  2. 固定源码提交 bb79e43dhttps://github.com/vmoranv/jshookmcp/commit/bb79e43d60ffcd9fa3e330825f6e9efb0006d790
  3. v0.3.4 发布提交 cde13ed5https://github.com/vmoranv/jshookmcp/commit/cde13ed54517cca1a27a90d52a8824789294bcbb
  4. npm 软件包 @jshookmcp/jshookhttps://www.npmjs.com/package/@jshookmcp/jshook
  5. npm 0.3.4 注册表 tarballhttps://registry.npmjs.org/@jshookmcp/jshook/-/jshook-0.3.4.tgz
  6. GitHub Actions v0.3.4 发布运行https://github.com/vmoranv/jshookmcp/actions/runs/29432085723
  7. 固定提交的软件包清单https://github.com/vmoranv/jshookmcp/blob/bb79e43d60ffcd9fa3e330825f6e9efb0006d790/package.json
  8. 已发布 postinstall 源码https://github.com/vmoranv/jshookmcp/blob/cde13ed54517cca1a27a90d52a8824789294bcbb/scripts/postinstall.cjs
  9. GitHub 公告 GHSA-c5r6-m4mr-8q5j / CVE-2026-49856https://github.com/advisories/GHSA-c5r6-m4mr-8q5j
  10. 仓库安全公告https://github.com/vmoranv/jshookmcp/security/advisories/GHSA-c5r6-m4mr-8q5j
  11. 私网探测修复提交https://github.com/vmoranv/jshookmcp/commit/02111311f7bd0f86a7d7ef8538986594b3a18afa
  12. Sharp/libvips 公告 GHSA-f88m-g3jw-g9cjhttps://github.com/advisories/GHSA-f88m-g3jw-g9cj
  13. protobufjs 拒绝服务公告 GHSA-j3f2-48v5-ccwwhttps://github.com/advisories/GHSA-j3f2-48v5-ccww
  14. npm provenance 文档https://docs.npmjs.com/generating-provenance-statements/
  15. npm trusted publishing 文档https://docs.npmjs.com/trusted-publishers/
  16. Model Context Protocol 安全最佳实践https://modelcontextprotocol.io/docs/tutorials/security/security_best_practices
  17. Model Context Protocol 信任模型与安全政策https://github.com/modelcontextprotocol/modelcontextprotocol/security
  18. MCP 工具注解风险语义https://blog.modelcontextprotocol.io/posts/2026-03-16-tool-annotations/
  19. jshookmcp issue #10https://github.com/vmoranv/jshookmcp/issues/10
  20. jshookmcp PR #11https://github.com/vmoranv/jshookmcp/pull/11
  21. jshookmcp issue #44https://github.com/vmoranv/jshookmcp/issues/44
  22. jshookmcp issue #77https://github.com/vmoranv/jshookmcp/issues/77
  23. LINUX DO 杀毒软件报告讨论https://linux.do/t/topic/2037967
  24. LINUX DO 进程与 CPU 讨论https://linux.do/t/topic/1789318
  25. 维护者关于大规模 AI 生成 PR 的讨论https://linux.do/t/topic/2052535?tl=en