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