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などの実行中に許可されるコンパイラ/リンカオプションのセーフリストを使用することで行われます。cgoコードがセーフリストにないオプションを渡そうとすると、goツールはinvalid flag in #cgo CFLAGS(または#cgo LDFLAGSpkg-config --cflagspkg-config --ldflagsなど)というエラーを報告します。

このセーフリストは、リリース1.8.7、1.9.4、1.10、およびそれ以降のすべてのリリースで新しく追加されました。

どうすればいいですか?

もしこれがあなたに起こり、そのオプションが無害である場合、2つのことを行うべきです。

  1. 環境変数CGO_CFLAGS_ALLOW(またはCGO_LDFLAGS_ALLOWCGO_CXXFLAGS_ALLOWなど)を、そのオプションに一致する正規表現に設定します。
  2. そのオプションをセーフリストに追加するよう要求するバグを報告してください。完全なエラーメッセージと、可能であればビルドしているコードの説明を含めるようにしてください。

なぜアンセーフリストを使わないのですか?

なぜなら、新しいアンセーフなオプションがコンパイラに追加された場合、既存のすべてのGoリリースがすぐに脆弱になるからです。

なぜコンパイラオプションの完全なリストを取得し、それらすべてをセーフリストに追加しないのですか?

なぜなら、何百ものオプションがあり、完全なリストを取得する明確な方法がないからです。多くのコンパイラおよびリンカオプションはターゲットに依存するため、特定のプラットフォームまたは特定の構成でのみ報告されます。ドキュメントは不完全であることが知られています。


このコンテンツはGo Wikiの一部です。