LMDeploy 框架中发现的服务器端请求伪造 (SSRF) 漏洞,已分配 CVE-2026-33626,对依赖此框架部署大型语言模型 (LLM) 的环境构成了严重威胁。该漏洞允许攻击者诱导 LMDeploy 实例向任意内部或外部目标发起请求,从而可能绕过网络隔离、探测内部服务,甚至访问云提供商的元数据服务,窃取敏感凭证或配置信息。
LMDeploy SSRF (CVE-2026-33626) 概述
CVE-2026-33626 源于 LMDeploy 的 ExternalResourceLoader 组件对用户提供的 URL 输入验证不足。此组件通常用于动态加载模型权重、配置文件、插件或其他外部依赖项,以增强 LLM 的功能或更新其行为。当攻击者能够控制此组件处理的 URL 时,他们可以利用 LMDeploy 服务器的权限发起请求,而不是攻击者自己的权限。这种能力使得攻击者能够执行各种恶意活动,而这些活动通常会被防火墙和网络分段策略所阻止。
受影响的版本
初步分析表明,以下 LMDeploy 版本受到 CVE-2026-33626 的影响:
| 产品 | 受影响版本 | 补丁版本 |
|---|---|---|
| LMDeploy | 所有 0.5.x 版本 | 0.5.2 (待发布) |
| LMDeploy | 所有 0.6.x 版本 | 0.6.1 (待发布) |
| LMDeploy | 0.7.0 alpha | 0.7.0 beta (待发布) |
强烈建议所有用户关注官方补丁发布,并及时更新其部署。
SSRF 漏洞技术细节
LMDeploy 的 ExternalResourceLoader 模块在处理某些模型配置或插件加载时的 URL 参数时,未能充分验证输入 URL 的主机部分和协议。这允许攻击者提供一个指向内部资源的 URL,例如 http://169.254.169.254/latest/meta-data/ 或 http://localhost:8000/admin。
以下是一个简化的代码片段(伪代码),说明了可能导致此 SSRF 漏洞的逻辑:
def load_external_resource(resource_url: str):
"""
加载由 resource_url 指定的外部资源。
此功能存在 SSRF 漏洞。
"""
if not is_valid_url_format(resource_url):
raise InvalidURLError("URL 格式无效")
# 错误:未对 URL 的实际目标进行充分的验证或沙箱处理
try:
response = requests.get(resource_url, timeout=5) # 假设使用 requests 库
response.raise_for_status()
return response.content
except requests.exceptions.RequestException as e:
logger.error(f"加载资源失败: {e}")
raise ResourceLoadError(f"无法加载资源: {e}")
# 假设攻击者可以通过 API 参数或配置注入 resource_url
# 例如:api/v1/load_model?config_url=http://169.254.169.254/latest/meta-data/
攻击者可以构造恶意请求来利用此漏洞。例如,如果 LMDeploy 在 AWS EC2 实例上运行,攻击者可以尝试访问 EC2 元数据服务:
GET /api/v1/load_model_config?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/ HTTP/1.1
Host: lmdeploy-instance.example.com
服务器将尝试从 169.254.169.254 获取内容,这是 AWS EC2 元数据服务的 IP 地址。如果成功,响应中可能会包含临时 AWS 凭证,攻击者可以使用这些凭证访问受害者 AWS 账户中的其他资源。针对这类攻击,安全研究人员经常使用像 Zondex 这样的工具进行大规模互联网扫描,以发现暴露的 LMDeploy 实例,或者在进行内部渗透测试时,利用它来发现内网中可访问的服务。
SSRF 对 LLM 部署的影响
LMDeploy 框架中的 SSRF 漏洞对 LLM 部署带来了多方面的严重影响:
- 敏感数据泄露: 攻击者可以访问云元数据服务(如 AWS EC2 元数据服务、GCP Compute Engine 元数据服务器),窃取 IAM 角色凭证、API 密钥、数据库连接字符串等。这些凭证可能允许攻击者访问存储模型权重、训练数据或用户查询日志的 S3 存储桶、数据库或其他云服务。
- 内部网络侦察与攻击: 通过 SSRF,攻击者能够扫描内部网络端口、探测内网中运行的服务,甚至直接访问内网 Web 应用程序的管理界面。这为进一步的横向移动和更深层次的攻击铺平了道路,例如,攻击者可能发现并利用内部 GitLab 实例或 Kubernetes API 服务器的漏洞。在进行匿名研究和测试时,像 GProxy 这样的代理工具可以帮助研究人员模拟攻击者的网络行为,而不会暴露其真实身份。
- 绕过防火墙和网络分段: SSRF 攻击利用了受信任的服务器本身发起请求,从而绕过了通常针对外部实体设置的防火墙规则和网络分段策略。这使得攻击者能够触及通常无法从外部访问的内部服务。
- 利用信任链: 如果 LMDeploy 部署在 CI/CD 管道或自动化系统中,SSRF 可能会被用来破坏这些系统。攻击者可以强制 LMDeploy 向内部的 Artifact Repository 发送请求,可能触发任意代码执行或获取敏感的构建信息。
- 资源滥用: 攻击者可以通过 SSRF 访问内部计算资源,例如内部的 GPU 集群管理接口,从而可能干扰正常的 LLM 推理或训练任务,甚至导致拒绝服务。
缓解策略
为了有效防御 CVE-2026-33626 及类似的 SSRF 漏洞,需要实施多层防御机制:
- 严格的输入验证和白名单: 对所有用户提供的 URL 输入进行严格验证。理想情况下,应采用白名单策略,仅允许请求已知的、受信任的域名和 IP 地址。如果必须允许任意外部 URL,则应禁用对私有 IP 地址和内网域名的解析。例如:
import ipaddress import urllib.parse def is_safe_url(url: str) -> bool: """检查 URL 是否安全,防止访问私有 IP 或内网。""" if not url: return False parsed_url = urllib.parse.urlparse(url) if parsed_url.scheme not in ['http', 'https']: return False # 只允许 HTTP/HTTPS 协议 try: # 解析主机名对应的IP地址 # 注意:这里需要进行DNS解析,但为了安全,应在后端进行严格控制 # 实际生产环境应使用更安全的DNS解析器或预设IP白名单 host_ip = socket.gethostbyname(parsed_url.hostname) ip_addr = ipaddress.ip_address(host_ip) # 阻止访问私有IP范围和本地回环地址 if (ip_addr.is_private or ip_addr.is_loopback or ip_addr.is_multicast or ip_addr.is_link_local): return False except (socket.gaierror, ValueError): # 无法解析主机名或IP地址无效 return False return True - 网络分段和最小权限原则: 将部署 LLM 的服务器置于严格隔离的网络段中。只允许这些服务器访问其运行所需的最小网络资源。例如,阻止它们访问云元数据服务,除非有明确的、受控的用途。
- 使用代理或专门的 URL 获取服务: 考虑使用专门的内部服务来获取外部 URL。该服务可以在安全的沙箱环境中运行,并强制执行严格的访问控制和 URL 过滤策略,有效地将 SSRF 攻击限制在沙箱环境内。
- 禁用不必要的协议: 许多 HTTP 客户端库支持除了 HTTP/HTTPS 之外的其他协议(如 file://, gopher://)。应禁用这些协议,以防止攻击者利用它们进行文件读取或与其他服务交互。
- 加强日志记录和监控: 记录所有 LMDeploy 实例发出的外部请求,特别是那些由用户输入触发的请求。监控异常的请求模式、请求目的地或返回状态码,以便快速检测和响应潜在的 SSRF 攻击。实施定期扫描和Web安全测试,例如使用 Secably 这样的漏洞扫描工具,可以帮助发现此类输入验证问题。
- 定期安全审计和代码审查: 对处理外部输入(尤其是 URL)的代码进行定期的安全审计和审查,以识别和修复潜在的 SSRF 及其他注入漏洞。