Go Wiki: InvalidFlag
invalid flag in #cgo CFLAGS
本页面描述了诸如 invalid flag in #cgo CFLAGS
之类的构建错误的背景信息,以及您可以采取的措施。
CVE-2018-6574 描述了 go 工具中一个潜在的安全漏洞:运行 go get
会从互联网下载和构建 Go 代码,使用 cgo 的 Go 代码可以指定传递给编译器的选项,因此小心使用 -fplugin
可能会导致 go get
执行任意代码。虽然很难阻止编译器可能被攻击的所有方式,但我们选择阻止明显的方式。
正如 issue 23672 中所述,这是通过使用一个允许在 go get
、go build
及类似命令中使用的编译器/链接器选项的允许列表(safelist)来实现的。当 cgo 代码尝试使用未在允许列表中某个选项时,go 工具将报告错误 invalid flag in #cgo CFLAGS
(或 #cgo LDFLAGS
、pkg-config --cflags
、pkg-config --ldflags
等)。
此允许列表在 1.8.7、1.9.4 和 1.10 版本以及之后的所有版本中都是新添加的。
我该怎么办?
如果您遇到这种情况,并且该选项是无害的,您应该做两件事:
- 设置环境变量
CGO_CFLAGS_ALLOW
(或CGO_LDFLAGS_ALLOW
、CGO_CXXFLAGS_ALLOW
等)为一个匹配该选项的 正则表达式。 - 提交 bug 请求将该选项添加到允许列表中。请务必包含完整的错误消息,如果可能,请描述您正在构建的代码。
为什么不使用不安全列表(unsafe list)?
因为如果向编译器添加了新的不安全选项,所有现有的 Go 版本将立即变得易受攻击。
为什么不获取完整的编译器选项列表并全部添加到允许列表中?
因为有数百个选项,并且没有明确的方法来获取完整的列表。许多编译器和链接器选项是目标相关的,因此只在特定平台或特定配置下报告。文档已知是不完整的。
此内容是 Go Wiki 的一部分。