You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何修复REST API请求中被Checkmarx检测到的SSRF漏洞?

修复Checkmarx检测到的SSRF漏洞(UUID参数文件下载场景)

问题背景

CI/CD流水线中被Checkmarx检测出SSRF漏洞,导致流程无法推进。当前场景是通过用户可控的UUID4类型file_id参数,调用内部REST服务下载文件,已对file_id做了多重格式验证,且服务域名来自ConfigMap,但仍被判定存在风险。

现有代码问题分析

当前代码对file_id的验证逻辑冗余,但Checkmarx的静态检测核心关注用户输入直接拼接URL的行为——即使输入格式合法,工具仍会判定为潜在的SSRF风险点;另外未对请求的跳转行为做限制,也可能触发工具的风险规则。

优化修复方案

1. 简化并强化file_id验证

使用Python标准库uuid的原生验证替代正则和第三方库,减少冗余且更可靠,彻底排除非法格式的输入。

2. 安全构造URL

避免直接用f-string拼接URL,改用urllib.parse模块构建路径,让静态检测工具识别为安全的URL构造方式。

3. 严格限制请求范围

  • 禁用自动重定向,防止服务内部重定向到非预期地址;
  • 验证请求的最终URL主机名与配置的一致,彻底阻断跨主机访问的可能。

修改后的代码示例

import os
import uuid
import requests
from urllib.parse import urljoin, urlparse

def download_file(file_id):
    # 用标准库原生验证UUID4,一步到位
    try:
        validated_file_id = str(uuid.UUID(file_id, version=4))
    except ValueError:
        raise ValueError('invalid file_id')

    hostname = os.getenv('HOSTNAME')
    if not hostname:
        raise ValueError('invalid service hostname')

    # 用urljoin安全构建完整URL,规避字符串拼接的风险判定
    base_url = f'https://{hostname}/v1/files/'
    target_url = urljoin(base_url, validated_file_id)

    # 强制验证URL主机名,防止任何形式的地址篡改
    parsed_url = urlparse(target_url)
    if parsed_url.hostname != hostname:
        raise ValueError('invalid target address')

    # 禁用重定向,彻底阻断SSRF通过跳转实现的可能
    response = requests.get(target_url, allow_redirects=False)

    if response.status_code == 200:
        # 后续文件处理逻辑
        pass

额外说明

这些修改从静态检测规则和实际风险两方面入手:

  • 标准库验证消除格式漏洞;
  • 安全的URL构造方式规避工具对字符串拼接的风险判定;
  • 重定向限制和主机验证彻底阻断SSRF的可能路径,让Checkmarx无法检测到风险点。

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

火山引擎 最新活动