Go Wiki:InvalidFlag
invalid flag in #cgo CFLAGS
此頁面說明類似於 #cgo CFLAGS 中的無效標記
的建置錯誤背景,以及您能採取哪些措施來解決這些錯誤。
CVE-2018-6574 描述了 go 工具中的潛在安全性漏洞:執行 go get
會從網際網路下載並建置 Go 程式碼,使用 cgo 的 Go 程式碼可以指定要傳遞給編譯器的選項,因此謹慎使用 -fplugin
可能會導致 go get
執行任意程式碼。雖然很難封鎖編譯器可能受到攻擊的每種可能方式,但我們已選擇封鎖明顯的方式。
如 問題 23672 中所述,這會使用在 go get
、go build
和相關工具中允許的編譯器/連結器選項的安全清單來完成。當 cgo 程式碼嘗試使用傳遞不在安全清單中的選項時,go 工具會報告錯誤 #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
等)設定為符合選項的 正規表示法。 - 提交錯誤,要求將選項新增至安全清單。務必包含完整的錯誤訊息,以及您正在建置的程式碼說明(如果可能)。
為何不使用不安全清單?
因為如果編譯器新增了一些新的不安全選項,所有現有的 Go 版本都會立即變得容易受到攻擊。
為什麼不取得編譯器選項的完整清單,並將它們全部列入安全清單?
因為有數百個選項,而且沒有明確的方法可以取得完整的清單。許多編譯器和連結器選項都依賴於目標,因此只會在特定平台或特定組態中報告。文件已知不完整。
此內容是 Go Wiki 的一部分。