SuperAPI AI 工具集

ssrf-prevention

安全与审计

查看项目

更新于 10-15 10:40

技能介绍

SSRF Prevention 是一套用于防止服务端请求伪造(SSRF)的防护指南与实现方案,面向 API、Webhook、URL 预览器、导入器以及“按 URL 抓取”类功能。其核心目标是阻止攻击者利用服务器作为代理,访问内部网络、云元数据端点、数据库、管理面板和私有服务。资料指出 SSRF 属于 OWASP A10,常由 URL 预览、Webhook 测试器、图片导入器、PDF 生成器和“抓取此 URL”集成等快速开发功能引入。

核心规则 绝不直接抓取用户提供的 URL。始终校验目标、安全解析 DNS、阻断私有网络,并强制执行出站白名单。

SSRF 可能暴露的目标

  • 169.254.169.254:AWS/GCP/Azure 实例元数据凭据。
  • 127.0.0.1 / localhost:本地管理面板、调试服务器、Redis、Docker API。
  • 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16:内部网络和私有服务。
  • IPv6 回环/链路本地:::1、fe80::/10、IPv4 映射绕过。
  • 内部 DNS 名称:db.internal、admin.local、Kubernetes 服务名。
  • 重定向链:合法的公网 URL 重定向到内部端点。

易受攻击的模式 资料给出反面示例:URL 预览器直接 fetch(req.body.url) 并返回标题;Webhook 测试器直接 fetch(user.webhookUrl)。正面示例则使用 safeFetchUserUrl,并限制 allowedProtocols 为 https:、allowedHosts 为白名单域名、maxRedirects 为 0、timeoutMs 为 3000。

企业控制模型 采用分层控制,不依赖单一检查:正向白名单(仅批准的主机名或域名)、协议限制(仅 HTTPS,禁止 file:、gopher:、ftp:、dict:)、DNS 解析检查(解析主机名并阻断私有/保留 IP)、重定向校验(每个重定向目标都需通过相同检查)、超时与大小限制(防止资源耗尽)、出站防火墙(网络层拒绝元数据/内部网段)、审计日志(记录每次被阻断的 SSRF 尝试,含用户 ID 和 URL)。

需阻断的 IP 段 资料列出需阻断的私有、回环、链路本地、组播、保留及云元数据网段,包括:0.0.0.0/8、10.0.0.0/8、100.64.0.0/10、127.0.0.0/8、169.254.0.0/16、172.16.0.0/12、192.0.0.0/24、192.0.2.0/24、192.168.0.0/16、198.18.0.0/15、198.51.100.0/24、203.0.113.0/24、224.0.0.0/4、240.0.0.0/4、::/128、::1/128、::ffff:0:0/96、fc00::/7、fe80::/10、ff00::/8。特殊云元数据端点包括:169.254.169.254、metadata.google.internal、metadata.azure.com、100.100.100.200。

各语言实现示例 资料提供 Node.js 安全抓取封装:使用 node:dns/promises 和 ipaddr.js,定义 ALLOWED_HOSTS,通过 isBlockedIp 判断 unspecified、broadcast、multicast、linkLocal、loopback、private、reserved、uniqueLocal 等范围,assertSafeDestination 校验协议、白名单主机、DNS 解析结果,safeFetchUserUrl 使用 redirect: 'manual'、3 秒超时、拒绝 3xx 重定向、限制响应大小 1,000,000 字节。 Cloudflare Workers 模式:Workers 无法从用户代码执行原始 DNS 查询,因此优先使用严格主机名白名单和 Cloudflare 层出站控制;validateOutboundUrl 校验 HTTPS、白名单主机、拒绝 URL 凭据,safeOutboundFetch 使用 redirect: 'manual' 和 AbortSignal.timeout(3000)。 Python 模式:使用 ipaddress、socket、requests、urllib.parse,is_blocked_ip 检查 private、loopback、link_local、multicast、reserved、unspecified,assert_safe_url 校验 scheme、白名单主机、getaddrinfo 解析结果,safe_fetch 设置 timeout=3、allow_redirects=False、限制 content-length。 Laravel 模式:assertSafeUrl 使用 parse_url 校验 https、白名单主机、gethostbynamel 解析并用 FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE 过滤,Http::timeout(3)->withoutRedirecting()->get()。

DNS 重绑定防御 DNS 重绑定指主机名在校验时解析为公网 IP,实际请求时解析为私有 IP。所需防御:请求前自行解析主机名;使用自定义 HTTP agent 连接到已验证 IP 同时保留 Host 头(Node.js 高级场景);禁用重定向或重新校验每个重定向目标;优先使用严格白名单的合作伙伴主机名而非任意用户 URL;在网络层增加对私有和元数据 IP 段的出站阻断。

重定向规则 重定向是常见绕过方式。反面示例为 await fetch(url)(默认跟随重定向);正面示例为 await fetch(url, { redirect: 'manual' })。若必须跟随重定向,需在跟随前用相同 SSRF 检查校验每个 Location URL。

出站防火墙要求 仅靠应用检查不够,生产系统还应在网络层阻断到内部网段的出站流量。最低出站策略:默认拒绝所有出站流量;仅允许所需第三方 API;显式拒绝云元数据 IP;拒绝 RFC1918 私有网络;记录被拒绝的出站尝试。

审计清单 资料列出检查项:无原始 fetch(userUrl)、requests.get(user_url) 或 Http::get($userUrl);出站请求使用安全封装;强制仅 HTTPS;尽可能使用正向主机名白名单;阻断私有、回环、链路本地、保留和元数据 IP;禁用重定向或重新校验每个重定向目标;超时设为 3 秒或更短;限制响应大小;拒绝 URL 凭据(https://user:pass@host);考虑 DNS 重绑定;出站防火墙阻断元数据和私有 IP 段;记录被阻断尝试,含用户 ID、URL、解析 IP 和请求 ID。

PDPA 2024 后果 资料指出 SSRF 可能暴露云凭据、环境变量、内部管理面板和个人数据存储。根据 PDPA 2024,未能阻断明显的内部和元数据目标并非细微漏洞,而是未按 Seksyen 5(1) 和 5(2) 实施合理安全措施,最高可处 RM1,000,000 罚款或 3 年监禁。