# mcp-data-vis 服务端请求伪造 (SSRF) 漏洞总结 ## 漏洞概述 * **漏洞类型**:服务端请求伪造 (SSRF) * **CWE ID**:CWE-918 * **受影响组件**:`src/servers/web-scraper/server.js` * **根本原因**:代码虽然尝试通过 `validateUrl()` 函数过滤本地地址(如 localhost, 127.*, 192.168.*, 16.*),但验证逻辑不完整,未能全面拒绝所有私有、链路本地或敏感地址空间(如 172.16.0.0/12, 169.254.0.0/16, IPv6 回环地址等)。攻击者可利用此缺陷让服务器向任意内部或外部资源发送请求。 ## 影响范围 * **受影响版本**:1.0.0 及包含相同请求到 sink 流代码的版本。 * **安全影响**: * **机密性**:高(如果内部 HTTP 服务、管理界面或元数据端点可达)。 * **完整性**:中(取决于可达的内部 API 是否暴露状态更改操作)。 * **可用性**:中(通过请求滥用或与敏感内部服务交互)。 ## 修复方案 1. **替换主机名前缀过滤**:使用规范化的 IP 解析和健壮的私有地址分类。 2. **增强验证逻辑**:对 `axios()` 调用前的每个出站请求路径执行相同的验证。 3. **回归测试**:添加覆盖 RFC1918、172.16.0.0/12、169.254.0.0/16、IPv6 回环和重定向绕过尝试的测试。 4. **发布补丁**:发布包含明确修复版本的安全公告。 ## 概念验证 (PoC) 代码 **PoC 传输方式**:JSON-RPC `tools/call` 到 MCP 服务器 **代表性请求**: ```json {"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"scrape_page","arguments":{"url":"http://172.16.0.1"}}} ``` **替代受影响工具**: ```json {"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"api_request","arguments":{"url":"http://169.254.0.1"}}} ```