安全性: fetch_config config_name 中的路径穿越(CWE-22) - 随机删除目录、破坏仓库、由攻击者控制的克隆
作者: Harmenszoon创建于 2026年8月30日更新于 2026年8月30日
□ 总结
`fetch config' MCP工具的git URL模式 将原始的,未经验证的'config name' 工具参数传递到一个没有封存检查的文件系统路径:
[Python]
src/ skill clienters/mcp/tools/ source tools.py (fetch config tool, MODE 2) (英语).
遗留服务器中的相同模式: src/ skill casters/mcp/ server legacy.py:1289
出处 name temp=f"temp %config name}"# config name=原始 MCP工具参数 repo path = git repo.clone or pul(出自: source name=source name temp,.
src/skill 求援者/服务/git repo.py (clone 或pul, 第71-75行)
repo path = self.cache dir / source name # 没有验证;. / 逃脱缓存 如果强制 更新和 repo path. 存在( ): hopil.rmtree( repo path) # 任意目录 . . . . . . . . git.Repo.clone from(clone url, repo path,.) # 任意目录 WRITE
所设计的“ config name” 如`x/././<relative/path>`> 摆脱了缓存目录。 ** 以这种方式到达的`clone 或 pull' 的每个分支要么具有破坏性,要么由攻击者控制**(均受服务器程序权限的限制):
□ 欢呼
- **CWE-22**(限制目录路径名称不当)
□ 严重性
- **高**-CVSS 9.1 对所发运的Docker/HTTP默认部署至关重要(`Dockerfile.mcp ' 绑定了`0.0.0.0:8765',没有运输认证——然后,任何网络对等点都可以调用该工具,不需要迅速注射);CVSS 8.0 高地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地平地 有关报告中全面列出部署情况。
□ 文件
- `rc/skill cers/ services/git repo.py'-`clone or pull'(根本原因:`cache dir/ source name',没有验证;**2**`shutil.rmtree'站点:`重新'登入的75号线站点;96-98号线对 *任何拉力故障*)
- `src/skill casters/mcp/tools/source tools.py'-`fetch config tool' MODE 2 (`temp- {-config name-}`')
- `src/skill casters/mcp/server legacy.py:1289' - MODE 2,模式相同
- 同级写边加入:'config file = dest path / f'{config name}.json'' (目前以'get config'的基名匹配为入门;固定应覆盖)
□ 影响
所有攻击参数(`config name',`git url',`branch',`token',`rerefresh')都载于**两个已运出服务器的工具图中(快取:`server fastmcp.py:1080-1089';遗产:`server legacy.py:394-441')。 `validate git url'接受平原`http://',所以被克隆的内容源是完全攻击者选择的. PoC被确认的原始人(离线,沙盒,驱动真实的"fetch config tool";在Windows 11和Ubuntu/WSL上核实):
** A. 任意目录写** — 攻击者选择的 git repo( 内容 + 文件名) 克隆到任何不存在/空路径 :
[攻击 A] config name='x/./././victim/.vscode/extensions/evil-1.0.0' (中文(简体) ). [攻击 A] 攻击者文件被植入外部SIDE缓存: True - > ...电话分机.js
**B. 任意目录删除+替换**(`refresh=real' + 现有目标)——`rmtree'摧毁了它,`clone from'重新填充了攻击者的内容:
[攻击B]前:['db.sqlite', . . . . . . .
内容来源: yusufkaraaslan/Skill_Seekers