You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:修复Golang中http.NewRequestWithContext的SSRF(CWE-918)漏洞

解决Golang http.NewRequestWithContext 的Veracode SSRF(CWE 918)未修复问题

核心原因分析

  • 正则验证存在盲区:未覆盖URL特殊格式(如含@的用户信息、非标准端口、IP形式Host),扫描器判定验证不充分
  • 白名单验证时机错误:仅验证原始URL字符串,未基于解析后的url.URL对象做检查,导致绕过风险
  • Veracode静态扫描未识别自定义逻辑:扫描依赖明确的、符合其规则的安全检查模式,封装过深的验证会被忽略

可被扫描器识别的修复方案

1. 基于标准URL解析对象做多重验证

不要直接校验原始URL字符串,先通过url.Parse解析为标准对象,逐一验证关键组件:

import (
    "context"
    "errors"
    "net"
    "net/url"
    "net/http"
    "strings"
)

func isURLSafe(rawURL string, allowedHosts []string) bool {
    parsedURL, err := url.Parse(rawURL)
    if err != nil {
        return false
    }

    // 仅允许http/https协议
    if parsedURL.Scheme != "http" && parsedURL.Scheme != "https" {
        return false
    }

    // 提取纯Host(剥离端口)
    host := parsedURL.Host
    if colonIdx := strings.Index(host, ":"); colonIdx != -1 {
        host = host[:colonIdx]
    }

    // 白名单校验
    allowed := false
    for _, allowedHost := range allowedHosts {
        if host == allowedHost {
            allowed = true
            break
        }
    }
    if !allowed {
        return false
    }

    // 额外过滤内部IP段(可选,强化安全)
    if ip := net.ParseIP(host); ip != nil {
        if ip.IsPrivate() || ip.IsLoopback() || ip.IsLinkLocalMulticast() {
            return false
        }
    }

    return true
}

// 调用示例
func fetchData(ctx context.Context, rawURL string) error {
    allowedHosts := []string{"this.isAValidUrl.com"}
    if !isURLSafe(rawURL, allowedHosts) {
        return errors.New("invalid or unsafe URL")
    }

    // 验证通过后再构造请求
    req, err := http.NewRequestWithContext(ctx, "GET", rawURL, nil)
    if err != nil {
        return err
    }
    // 后续请求逻辑...
    return nil
}

2. 适配Veracode扫描规则

  • 确保验证函数直接在http.NewRequestWithContext调用前执行,且返回值直接决定是否执行请求
  • 避免将验证逻辑隐藏在多层封装中,保持安全检查的直观性
  • 若确认是误报,可在Veracode平台标记该问题,并附上验证逻辑的详细说明

3. JWT参数补充校验(可选)

虽然JWT本身不触发SSRF,但如果URL为用户可控,可对token参数做格式校验,避免被用来构造恶意URL:

token := parsedURL.Query().Get("token")
// 简单验证JWT格式(可根据实际规则调整)
if !strings.HasPrefix(token, "eyJhbGciOi") || strings.Count(token, ".") != 2 {
    return false
}

关键注意事项

  • 不要依赖单一验证方式,结合协议检查、白名单、IP段过滤形成多重防护
  • 始终使用标准库url.Parse解析URL,避免手动处理字符串导致的漏洞
  • 若问题持续,可联系Veracode支持团队,提供验证逻辑代码以确认扫描规则适配问题

内容的提问来源于stack exchange,提问作者Kirti Dhiman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 12:03:26