GoLang untaint URL 变量修复 gosec 警告 G107

分享于2022年09月29日 go gosec 问答
【问题标题】:GoLang untaint URL variable to fix gosec warning G107GoLang untaint URL 变量修复 gosec 警告 G107
【发布时间】:2022-07-29 15:26:26
【问题描述】:

如果我在下面的片段上运行 gosec,我会收到一个污染的 URL 警告: G107 (CWE-88): Potential HTTP request made with variable url (Confidence: MEDIUM, Severity: MEDIUM)

我想我应该使用 'url' 包,但它似乎没有提供比 ParseQuery() 更多的功能来检测这一点,但尽管它给出了一个错误,但 gosec 仍然报告为一个潜在的漏洞。

我如何编写删除警告,***只使用标准库?

func Run() {
    MakeGetRequest("https://www.google.com/hi?a=7; rm /* -rf")
}

func MakeGetRequest(uri string) {
    res, _ := http.Get(uri)
    fmt.Println(res)
}

  • securego.io/docs/rules/g107.html 我认为这与 ; rm /* -rf 无关;它是关于作为字符串传入的 URL,可能从用户提供的输入中设置。我不知道 url.Parse 是怎么解决的;有效的 url 仍然可能是恶意的。 CWE-88 是关于命令注入,但 G107 似乎更多的是关于 url 设置
  • 老实说,我只是附加了 rm 以显示“注入”,如果您 ParseQuery 它抱怨,但这并不能帮助您在没有受污染组件的情况下重新组装 URI。本质上,我想整理 CI 管道中的 gosec 警告,但我不知道如何使这些“安全”,因此检查通过而没有报告。 (我的理念是,如果你不能解决警告,或者它被认为不够重要,那么让它贬低报告的整个目的,意味着人们不会检查它是否有更严重的问题)
  • 您是否尝试在 const 中设置 url?即 const url = " google.com/hi?a=7 ; rm /* -rf" ?
  • 它需要在不同的环境下工作,所以不能是const

【解决方案1】:

根据 G107 中提到的准则,您应该在 const 中提及 url

package main

import (
    "fmt"
    "net/http"
)

const url = "url"

func main() {
    resp, err := http.Get(url)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(resp.Status)
}

为了更好地理解,您可以参考这里: https://securego.io/docs/rules/g107.html

如果您想删除 G107 警告,那么您应该明确排除它。

# Run a specific set of rules
$ gosec -include=G101,G203,G401 ./...

# Run everything except for rule G303
$ gosec -exclude=G303 ./...

# folders and files also can be excluded.

更多了解请参考 gosec 文档: https://github.com/securego/gosec

【讨论】:

  • 我们不能将其设为 const,因为我们的资源服务器的 url 在生产环境和测试环境中是不同的。我想知道是否有办法通过“删除狡猾的分隔符”功能而不是关闭检查来运行 URL。