标题: [安全] URL 抓取存在 DNS rebinding 型 SSRF(私网校验与请求两次独立解析,且解析失败放行)
正文:
问题
backend/package/yuxi/knowledge/utils/url_fetcher.py 的私网地址校验存在 TOCTOU/DNS rebinding 窗口:
# is_private_ip 用 socket.getaddrinfo 解析一次
# 随后 httpx 再独立解析并连接(第二次解析)
except Exception as e:
logger.warning(...)
return False # 解析失败时放行
- 两次独立 DNS 解析:
is_private_ip 解析一次、httpx 连接时再解析一次,两次之间攻击者可让域名解析到不同 IP(DNS rebinding)——检测时是公网 IP 放行,连接时是 127.0.0.1/169.254.169.254(云元数据);
- 解析失败默认放行:
return False 表示"不确定私网就放行",攻击者可构造让校验解析失败、请求解析到内网的域名。
接口虽然限定 get_admin_user 且重定向会重新校验,但 SSRF 面(内网端口扫描、元数据服务、内网服务探测)依然存在。
建议
- 单次解析、校验与连接复用同一 IP:解析出 IP 后校验,再连接到该校验过的 IP(SNI 用原域名),避免第二次解析;
- 解析失败默认拒绝(fail-secure),而不是放行;
- 校验后 IP 同时检查 IPv4/IPv6 与云元数据地址段;
- 补充 DNS rebinding 测试用例。
标题: [安全] URL 抓取存在 DNS rebinding 型 SSRF(私网校验与请求两次独立解析,且解析失败放行)
正文:
问题
backend/package/yuxi/knowledge/utils/url_fetcher.py的私网地址校验存在 TOCTOU/DNS rebinding 窗口:is_private_ip解析一次、httpx连接时再解析一次,两次之间攻击者可让域名解析到不同 IP(DNS rebinding)——检测时是公网 IP 放行,连接时是127.0.0.1/169.254.169.254(云元数据);return False表示"不确定私网就放行",攻击者可构造让校验解析失败、请求解析到内网的域名。接口虽然限定
get_admin_user且重定向会重新校验,但 SSRF 面(内网端口扫描、元数据服务、内网服务探测)依然存在。建议