Go Wiki:InvalidFlag

invalid flag in #cgo CFLAGS

此頁面說明類似於 #cgo CFLAGS 中的無效標記 的建置錯誤背景,以及您能採取哪些措施來解決這些錯誤。

CVE-2018-6574 描述了 go 工具中的潛在安全性漏洞:執行 go get 會從網際網路下載並建置 Go 程式碼,使用 cgo 的 Go 程式碼可以指定要傳遞給編譯器的選項,因此謹慎使用 -fplugin 可能會導致 go get 執行任意程式碼。雖然很難封鎖編譯器可能受到攻擊的每種可能方式,但我們已選擇封鎖明顯的方式。

問題 23672 中所述,這會使用在 go getgo build 和相關工具中允許的編譯器/連結器選項的安全清單來完成。當 cgo 程式碼嘗試使用傳遞不在安全清單中的選項時,go 工具會報告錯誤 #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. 提交錯誤,要求將選項新增至安全清單。務必包含完整的錯誤訊息,以及您正在建置的程式碼說明(如果可能)。

為何不使用不安全清單?

因為如果編譯器新增了一些新的不安全選項,所有現有的 Go 版本都會立即變得容易受到攻擊。

為什麼不取得編譯器選項的完整清單,並將它們全部列入安全清單?

因為有數百個選項,而且沒有明確的方法可以取得完整的清單。許多編譯器和連結器選項都依賴於目標,因此只會在特定平台或特定組態中報告。文件已知不完整。


此內容是 Go Wiki 的一部分。