# WeasyPrint HTTP重定向SSRF漏洞
## 概述
WeasyPrint 在 `default_url_fetcher` 中存在服务器端请求伪造(SSRF)防护绕过漏洞,影响版本早于 68.0。
## 影响版本
版本早于 68.0。
## 细节
漏洞源于 `default_url_fetcher` 使用 `urllib` 库处理 URL 获取时,自动跟随 HTTP 重定向但未对重定向后的新目标重新执行安全策略验证。攻击者可利用此机制绕过开发者实现的自定义 `url_fetcher` 所施加的访问限制,访问内部网络资源(如 `localhost` 服务或云平台元数据接口)。
## 影响
即使开发者已通过自定义 `url_fetcher` 试图阻止对敏感内部资源的访问,攻击者仍可通过恶意重定向诱导 WeasyPrint 请求内部服务,导致 SSRF 防护机制失效。
是否为 Web 类漏洞: 未知
判断理由:
| # | POC 描述 | 源链接 | 神龙链接 |
|---|
标题: Server-Side Request Forgery (SSRF) Protection Bypass via HTTP Redirect · Advisory · Kozea/WeasyPrint · GitHub -- 🔗来源链接
标签:x_refsource_CONFIRM
神龙速读:
## 漏洞关键信息
### 漏洞概述
- **类型**: Server-Side Request Forgery (SSRF) Protection Bypass via HTTP Redirect
- **严重性**: High (7.5/10)
- **CVE ID**: CVE-2025-68616
- **受影响版本**: < 67.0
- **修复版本**: None
### 漏洞描述
- **总结**:
- WeasyPrint 的 `default_url_fetcher` 存在一个SSRF保护绕过漏洞,即使开发者实现了自定义的 `url_fetcher` 来阻止对内部网络资源(如localhost服务或云元数据端点)的访问,该漏洞仍允许攻击者访问这些资源。
- 漏洞存在原因是底层的 `urllib` 库会自动跟随HTTP重定向,而不会重新验证新目标地址是否符合开发者的安全策略。
- **详细信息**:
- WeasyPrint允许开发者定义自定义的 `url_fetcher` 函数来验证或清理URL,但底层实现使用了Python标准库 `urllib.request.urlopen`。
- 该库默认会跟随HTTP重定向(如301, 302, 307等状态码),而不会将控制权交还给开发者的验证逻辑,从而绕过安全检查。
- 这种行为会导致时间检查到时间使用 (TOCTOU) 漏洞,攻击者可提供一个通过开发者白名单/黑名单检查的URL,但立即重定向到被阻止的内部资源。
### 证明概念 (PoC)
- **步骤**:
1. `victim.py`: 模拟一个内部服务,端口5000,在`/secret`路径下返回敏感数据。
2. `attacker.py`: 模拟外部重定向服务器,端口1337,将请求重定向到被阻止的hostname(如`localhost`)。
3. `exploit.py`: 模拟带有安全过滤器的应用程序,该过滤器本意是阻止对`localhost`的访问。通过构造`http`请求利用漏洞访问`localhost`。
4. `attack verify`: 检查构建的PDF中的嵌入文件是否包含敏感数据。
### 影响
- **内部网络侦察**: 攻击者可以绕过防火墙或白名单扫描内部服务。
- **云元数据窃取**: 在云环境中,攻击者可重定向请求到元数据服务,窃取实例凭证并提升权限。
- **安全控制绕过**: 使 `url_fetcher` 的安全验证逻辑对复杂攻击无效,给开发者造成虚假的安全感。
标题: Merge remote-tracking branch 'security/filter-redirections' · Kozea/WeasyPrint@b6a14f0 · GitHub -- 🔗来源链接
标签:x_refsource_MISC
神龙速读:
- 提交信息
- 提交ID: b6a14f0
- 提交时间: 10小时前
- 提交者: iZe
- 变更文件
- 2个文件更改, 增加15行, 删除2行
- docs/changelog.rst
- 版本: 68.0
- 发布日期: 2026-01-19
- 安全更新: CVE-2025-68616
- 推荐升级WeasyPrint到最新版本以使用`default_url_fetcher`函数自定义URL获取器, 或使用`default_url_fetcher`函数的`allowed_protocols`参数。
- 安全性:
- 总是使用URL获取器处理HTTP重定向。
- weasyprint/urls.py
- 更改`default_url_fetcher`函数, 添加对HTTP重定向的警告。
- 建议使用新的`URLFetcher`类替代`default_url_fetcher`。
- `default_url_fetcher`将在WeasyPrint 69.0版本中废弃并移除。
- 关于安全原因, 默认的URL获取器不再支持HTTP重定向, 但在`URLFetcher`中支持。具体可查阅文档: https://doc.courtbouillon.org/weasyprint/stable/first_steps.html#url-fetchers
暂无评论