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の一部です。