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 的一部分。