Skip to content

[安全] URL 抓取存在 DNS rebinding 型 SSRF(私网校验与请求两次独立解析,且解析失败放行) #881

Description

@Alex-Fleet

标题: [安全] 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   # 解析失败时放行
  1. 两次独立 DNS 解析is_private_ip 解析一次、httpx 连接时再解析一次,两次之间攻击者可让域名解析到不同 IP(DNS rebinding)——检测时是公网 IP 放行,连接时是 127.0.0.1/169.254.169.254(云元数据);
  2. 解析失败默认放行return False 表示"不确定私网就放行",攻击者可构造让校验解析失败、请求解析到内网的域名。

接口虽然限定 get_admin_user 且重定向会重新校验,但 SSRF 面(内网端口扫描、元数据服务、内网服务探测)依然存在。

建议

  1. 单次解析、校验与连接复用同一 IP:解析出 IP 后校验,再连接到该校验过的 IP(SNI 用原域名),避免第二次解析;
  2. 解析失败默认拒绝(fail-secure),而不是放行;
  3. 校验后 IP 同时检查 IPv4/IPv6 与云元数据地址段;
  4. 补充 DNS rebinding 测试用例。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions