SkillLeak,通过 MCP 技能窃取浏览器凭证

SkillLeak:一种通过 MCP 技能提供的浏览器凭证解密器

TL博士

@szc-ft/mcp-szcd-client 是一个发布到 npm 的模型上下文协议 (MCP) 客户端,它可以自动配置 AI 编码助手——开发者安装的那种粘合剂包,以便 IDE 代理可以与组件库服务通信。它有一个漫长而看似普通的发布历史(71版本)以及一个良性的安装步骤。其安装后步骤不会涉及任何凭据。

证书阅读行为存在于更深一层,它包含在一个名为“证书阅读行为”的 MCP 技能中。 local-browser-test当这项技能…… connect() 例行运行时,它会调用 _decryptCredentials() — 解密 本地 Chrome/Edge 配置文件中保存的每个密码 (所有站点,而非浏览器测试所针对的单个应用程序)使用 Windows 数据保护 API (DPAPI) 和 AES-256-GCM 加密。解密后的数据集以明文形式写入。 ~/.szcd-mcp/deps/decrypted-creds.json 并返回到技能的 MCP 工具结果中,该结果会流向软件包的默认远程 MCP 服务器。 mcp.szcd-mcp.top.

这是一个值得命名的供应链模式: 敏感功能不在安装钩子中 (大多数扫描员和审阅员都会查看的地方),但它是一种 MCP 技能,只有当操作员将工具指向自己正在运行的浏览器时才会执行。我们称之为 技能泄露MEW分类 @szc-ft/mcp-szcd-client (版本) 0.38.00.39.0)被视为恶意行为。

定期票据—— MCP技能:一个包含指令和辅助脚本的独立包,MCP 服务器将其作为可调用功能暴露给 AI 代理。代理像调用工具一样调用它;脚本在开发者的机器上运行。

攻击解剖

该包装呈现出截然不同的两面。

评论者首先看到的面孔 是安装路径。清单文件声明了 postinstall: node scripts/postinstall.js而这个脚本的功能正如README文件中所描述的那样:它连接…… MCP 集成到 IDE 中并安装同级软件包, @szc-ft/sketch-mcp-server它始终无法获取凭据代码。扫描器在安装阶段就停止了。 hooks ——历史上信号最强的地方——显示的是一个干净、普通的开发者工具。事实上,该软件包在之前的审查中已被评估为安全。

重要的面孔 只有通过捆绑技能才能达到。链条:

  • 开发人员运行 本地浏览器测试 针对他们通过远程调试端口启动的 Chrome/Edge 实例,可以使用此技能。这是该技能的官方使用方法。
  • 这项技能的 connect() (lib/browser-engine.js调用 _decryptCredentials() 第 246 行。
  • _decryptCredentials() 电话 decryptAllPasswords({ filter: '%' })。 该 '%' 过滤器是将测试便利性转化为收获的细节:它匹配的是每个存储的来源,而不是正在测试的单个站点。
  • lib/decrypt-passwords.js 读取浏览器的 os_crypt 加密密钥,运行 PowerShell … ProtectedData::Unprotect (DPAPI)恢复 AES 密钥,然后使用 AES-256-GCM 对每个已保存的凭据进行解密。
  • 完整的解密数据集被写入 ~/.szcd-mcp/deps/decrypted-creds.json 以明文形式返回,作为该技能的返回值。 MCP 工具 结果。
  • 该结果会通过MCP通道传回软件包的默认服务器。 mcp.szcd-mcp.top — 与 README 和 README 中记录的主机相同 scripts/lib/common.js.

简要说明一下步骤 4 的原理。在 Windows 系统中,Chrome 和 Edge 浏览器不会以明文形式存储已保存的密码:每个凭据都使用 AES-256-GCM 密钥进行加密,而该密钥本身又通过 DPAPI 进行密封,从而将其绑定到当前用户帐户。因此,恢复密码需要两个步骤——首先,使用 AES-256-GCM 密钥加密密码,然后使用 DPAPI 密钥加密密码,最后使用 DPAPI 密钥加密密码,从而将密码恢复到当前用户帐户。 受保护数据::取消保护 为了恢复 AES 密钥(之所以能够成功,是因为代码以登录用户的身份运行,这正是开发者终端所提供的上下文),然后对从浏览器读取的每个已存储 blob 进行 GCM 解密。 os_crypt受保护的存储。这种存储方式简单易懂,离线运行且静默无声:无需输入主密码,无需浏览器交互,在结果转发之前无需网络往返。它与许多常见的窃取信息工具使用的原始技术相同——这里的新颖之处仅在于其封装方式。

解密器并非偶然。它被捆绑了三次——在 standard-技能/, opencode-extension/qwen-extension/ — 每个受支持的 AI 助手表面一个副本,因此该功能可以随开发者连接的任何助手一起转移。

与合法的浏览器测试自动程序相比,login 这就是全部真相。一个真正的测试助手会解密凭据。 一种 应用程序是练习cis该例程在进程内使用数据,从不持久化或转发。它会解密所有数据,以明文形式写入磁盘,然后通过网络边界将其返回给远程服务器。

时间线和触发条件 

要了解暴露情况,需要关注两种行为。

触发机制是选择加入,而不是自动的。 安装该软件包不会读取任何凭据。解密仅在开发人员主动调用时才会运行。 本地浏览器测试 针对以远程调试模式启动的浏览器,该技能会造成影响。与……相比,这大大缩小了受影响的范围。 安装后 每次都会触发的有效载荷 npm安装.

包装很精致,不是一次性的。 该出版商已发行71个版本,并维持着更广泛的发行范围。 @szc-ft 组件库 MCP 套件。凭证解密器存在于两个标记版本(0.38.0 和 0.39.0)中,具有相同的指纹,并且从同一位置调用。 browser-engine.js:246 入口点。截至撰写本文时,该软件包仍然在 npm 上可用。

这种组合——知名发布商、无害的安装步骤以及仅在特定选择加入流程下触发的功能——正是自动分类器预测其“安全”以及先前审核结果一致的原因。只有手动阅读该技能的辅助脚本才能解决此问题。

妥协指标

类型 指示符
小包装 @szc-ft/mcp-szcd-client (npm) — 版本 0.38.0, 0.39.0
网络 默认远程 MCP 服务器 mcp.szcd-mcp.top (README.md, scripts/lib/common.js:18)
文件(已删除) ~/.szcd-mcp/deps/decrypted-creds.json — 明文解密凭证
文件(有效载荷) .../local-browser-test/lib/decrypt-passwords.js — DPAPI ProtectedData::Unprotect + AES-256-GCM(捆绑在 standard-skill/, opencode-extension/, qwen-extension/)
行为 browser-engine.js:246 _decryptCredentials()decryptAllPasswords({ filter: '%' }) (全站范围)
行为 读取 Chrome/Edge os_crypt 密钥;需要使用以下命令启动浏览器: --remote-debugging-port
安装钩子 postinstall: node scripts/postinstall.js - 良性 (IDE MCP 配置 + 同级软件包安装);未到达解密器

捍卫者审计 MCP工具 应该治疗 技能 目录也包含在作用域内,而不仅仅是清单和安装脚本。

归因与观察行为

我们描述的是行为,而不是动机。

该软件包已发布在具有连贯多包特性的 npm 帐户下。 @szc-ft MCP 套件及其悠久的版本历史记录。没有专门的隐蔽命令与控制通道:解密后的凭据通过软件包自身文档中记录的 MCP 服务器返回。 mcp.szcd-mcp.top而不是发送到匿名投放点。安装步骤本身并无害处。

将此行为从“激进的便利功能”归类为恶意行为的关键在于其可观察的范围和目标组合:例程解密 所有 保存浏览器凭据,而不是测试将要执行的单个应用程序凭据cis例如,将它们以明文形式持久化到磁盘,并通过 MCP 通道将它们从主机传输出去。浏览器测试自动login 以这种方式运行的功能实际上与凭证窃取没有区别——而这正是防御者必须考虑的影响。

我们注意到,触发机制是用户选择加入,且发布者已确定;以上记录中均已包含这两个事实。但对于运行该技能的开发者而言,这两个事实都不会改变可观察到的结果:开发者浏览器配置文件中所有网站的已保存密码都会离开其计算机。

SkillLeak 是一起单一包裹事件,但它所使用的交付方式才是关键。

该行业的供应链反应机制旨在实现安装时的快速执行: 预安装/安装后 hooks依赖关系混乱信标,带有有效载荷的拼写错误域名抢注 index.js. MCP改变了几何形状MCP 包可以包含一个完全干净的清单和安装步骤,同时将其后续行为封装在内部。 技能 ——这是人工智能代理稍后根据开发者的指示,利用开发者自身资源调用的一个软件包。该功能随助手集成一同引入,并处于休眠状态,直到看似正常的流程(例如“运行浏览器测试”)将其激活。

对于采用 MCP 工具的团队:

  • 审计技能,而不仅仅是清单。 将包裹审查范围扩大到 技能/, *-扩大/以及等效目录。最敏感的代码可能永远不会出现在安装钩子中。
  • 注意范围膨胀。 一项声称用途狭窄(测试一个应用程序)但实际功能却很广泛的功能(筛选: '%' (针对所有存储的来源)是一个危险信号,与意图无关。
  • 将 MCP 工具结果视为出口通道。 技能返回的数据会离开主机,发送到客户端配置的 MCP 服务器。像管理任何出站连接一样,对这些目标进行清点。
  • 重新审核“受信任”MCP软件包的版本更新。 知名发行商和悠久的发行历史并不能代替阅读每个版本附带的代码——正如本案例推翻了之前的安全评估所表明的那样。

具体来说,在开发者运行该技能之前,只需进行三项低成本的检查即可发现此软件包。首先,扫描技能目录的内容,查找对本地凭据存储的访问权限——即对以下内容的引用: os_crypt, 受保护数据/DPAPI,或浏览器的 Login 时间 文件——无论存在哪个安装钩子,都会标记该功能。其次,对任何接受通配符选择器的解密/读取例程进行范围检查(筛选: '%' (以及等效项)而不是绑定标识符可以捕获测试到收割过程中的膨胀。第三,比较软件包可以访问的主机集合(这里, mcp.szcd-mcp.top根据文档所述,将 MCP 结果通道与目标位置进行匹配,即可将其转换为可审计的出口点。这些操作均无需运行代码。

通过 DPAPI 进行凭证解密 os_crypt 这是一种老旧技术;通过仅在用户选择加入工作流程下才会触发的 AI 代理技能来实现该功能,才是新的封装方式。随着 MCP 工具的普及,预计这种“功能集成于技能之中”的模式将会越来越常见,因此需要相应地调整审查范围。 

sca-tools-软件-成分分析工具
确定软件风险的优先级、进行补救并加以保护
注册免费账号。
不需要信用卡。

保护您的软件开发和交付

使用 Xygeni 产品套件