首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在ASP.NET中纠正VeraCode CWE ID 918 - (SSRF)

无法在ASP.NET中纠正VeraCode CWE ID 918 - (SSRF)
EN

Stack Overflow用户
提问于 2019-09-13 02:15:20
回答 2查看 4.8K关注 0票数 6

长话短说,不管我怎么尝试,VeraCode都会继续将我的8行代码标记为CWE918的缺陷。这是旧代码,所以我不确定为什么它突然被标记了。

下面是一个带有粗体标记行的违规方法示例

代码语言:javascript
复制
  public virtual async Task<HttpResponseMessage> Put(string controller = "", Dictionary<string, object> parameters = null, object body = null)
        {
            if (string.IsNullOrWhiteSpace(ApiBaseUrl)) return null;
            HttpResponseMessage response = null;

            using (var client = GetHttpClient())
            {
                client.BaseAddress = new Uri(ApiBaseUrl);

                if (!string.IsNullOrEmpty(Token)) client.DefaultRequestHeaders.Add("Token-Key", Token);
                if (!string.IsNullOrEmpty(DeviceId)) client.DefaultRequestHeaders.Add("DeviceId", DeviceId);

                var url = GenerateUrl(controller, parameters);

                var requestBody = GeneratedHttpContent(body);
                if (requestBody == null) requestBody = new StringContent("");

                **response = await client.PutAsync(url, requestBody);**

                await LogError(response);
                return response;
            }
        }

下面是我提出的使用扩展方法来验证URL的修复方法

代码语言:javascript
复制
var url = GenerateUrl(controller, parameters);

                var requestBody = GeneratedHttpContent(body);
                if (requestBody == null) requestBody = new StringContent("");

                **if (url.IsValidUrl())
                {
                    response = await client.PutAsync(url, requestBody);
                }
                else
                {
                    response = new HttpResponseMessage(HttpStatusCode.BadRequest);
                }**

                await LogError(response);
                return response;

下面是具有VeraCode属性的扩展方法

代码语言:javascript
复制
        [RedirectUrlCleanser]
        public static bool IsValidUrl(this string source)
        {
            return Uri.TryCreate(source, UriKind.RelativeOrAbsolute, out Uri uriResult) && Uri.IsWellFormedUriString(source, UriKind.RelativeOrAbsolute);
        }

我可以让VeraCode根据属性自动缓解,但我们的客户端将执行自己的扫描,并且肯定不会启用该设置。

任何关于我如何解决这个问题的想法都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-22 01:00:11

该漏洞的真正来源是您的GenerateUrl方法内部,不幸的是没有显示出来,但这里是Veracode抱怨的大致情况。

对于CWE ID 918,除非您有静态URL,否则很难让Veracode识别您的修复。您需要验证成为请求URL一部分的所有输入。下面是我在Veracode站点上找到的内容:https://community.veracode.com/s/question/0D52T00004i1UiSSAU/how-to-fix-cwe-918-veracode-flaw-on-webrequest-getresponce-method

完整的解决方案仅适用于具有单个或少量可能的输入值(白名单)的情况:

代码语言:javascript
复制
public WebResponse ProxyImage(string image_host, string image_path)
{
    string validated_image_host = AllowedHosts.Host1;
    if (image_host.Equals(AllowedHosts.Host2))
        validated_image_host = AllowedHosts.Host2;

    string validated_image = AllowedImages.Image1;
    if (image_path.Equals(AllowedImages.Image2))
        validated_image = AllowedImages.Image2;

    string url = $"http://{validated_image_host}.example.com/{validated_image}";

    return WebRequest.Create(url).GetResponse();
}

如果可能的有效值集对于这种验证来说太大,那么您需要通过使用正则表达式实现输入的动态验证来修复该缺陷。不幸的是,Veracode没有足够的智能来识别这种修复,所以仍然需要“通过设计来缓解”。

代码语言:javascript
复制
public WebResponse ProxyImage(string image_host, string image_path)
{
    var image_host_regex = new System.Text.RegularExpressions.Regex("^[a-z]{1,10}$");
    if (!image_host_regex.Match(image_host).Success)
        throw new ArgumentException("Invalid image_host");

    var image_path_regex = new System.Text.RegularExpressions.Regex("^/[a-z]{1,10}/[a-z]{1,255}.png$");
    if (!image_path_regex.Match(image_path).Success)
        throw new ArgumentException("Invalid image_host");

    string url = $"http://{image_host}.example.com/{image_path}";
    return WebRequest.Create(url).GetResponse();
}
票数 2
EN

Stack Overflow用户

发布于 2020-06-19 21:18:20

解决这个问题的另一种方法(这是一种黑客行为)是将查询字符串参数附加到HttpClient的baseAddress中,这样veracode就不会将其视为缺陷。

下面是解决方案的样子

代码语言:javascript
复制
public async Task<Data> GetData(string input)
{
    try
    {
        var httpClient = new HttpClient();

        //Appended the parameter in base address to
        //to fix veracode flaw issue
        httpClient.BaseAddress = new Uri($"https://someurl.com/somefunction/{input}");

        //passing empty string in GetStringAsync to make sure
        //veracode doesn't treat it like modifying url 
        var content = await httpClient.GetStringAsync("");

        return JsonConvert.DeserializeObject<Data>(content);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57912436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档