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 getgo build 及类似命令中使用的编译器/链接器选项的允许列表(safelist)来实现的。当 cgo 代码尝试使用未在允许列表中某个选项时,go 工具将报告错误 invalid flag in #cgo CFLAGS(或 #cgo LDFLAGSpkg-config --cflagspkg-config --ldflags 等)。

此允许列表在 1.8.7、1.9.4 和 1.10 版本以及之后的所有版本中都是新添加的。

我该怎么办?

如果您遇到这种情况,并且该选项是无害的,您应该做两件事:

  1. 设置环境变量 CGO_CFLAGS_ALLOW(或 CGO_LDFLAGS_ALLOWCGO_CXXFLAGS_ALLOW 等)为一个匹配该选项的 正则表达式
  2. 提交 bug 请求将该选项添加到允许列表中。请务必包含完整的错误消息,如果可能,请描述您正在构建的代码。

为什么不使用不安全列表(unsafe list)?

因为如果向编译器添加了新的不安全选项,所有现有的 Go 版本将立即变得易受攻击。

为什么不获取完整的编译器选项列表并全部添加到允许列表中?

因为有数百个选项,并且没有明确的方法来获取完整的列表。许多编译器和链接器选项是目标相关的,因此只在特定平台或特定配置下报告。文档已知是不完整的。


此内容是 Go Wiki 的一部分。