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
などで許可されるコンパイラ/リンカーオプションのセーフリストを使用することによって行われます。cgoコードがセーフリストにないオプションを渡そうとすると、goツールはinvalid flag in #cgo CFLAGS
(または#cgo LDFLAGS
、pkg-config --cflags
、pkg-config --ldflags
など)というエラーを報告します。
このセーフリストは、リリース1.8.7、1.9.4、1.10、およびそれ以降のすべてのリリースで新しく追加されました。
どうすればよいですか?
これが発生した場合、オプションが無害であれば、次の2つのことを行う必要があります。
- 環境変数
CGO_CFLAGS_ALLOW
(またはCGO_LDFLAGS_ALLOW
、CGO_CXXFLAGS_ALLOW
など)を、オプションに一致する正規表現に設定します。 - バグを報告するオプションをセーフリストに追加するよう要求します。完全なエラーメッセージと、可能な場合はビルドしているコードの説明を含めるようにしてください。
なぜアンセーフリストを使用しないのですか?
新しいアンセーフオプションがコンパイラに追加されると、既存のすべてのGoリリースがすぐに脆弱になるためです。
なぜコンパイラオプションの完全なリストを取得して、すべてをセーフリストに登録しないのですか?
オプションが数百あり、完全なリストを取得する明確な方法がないためです。多くのコンパイラとリンカーのオプションはターゲットに依存するため、特定のプラットフォームまたは特定の構成でのみ報告されます。ドキュメントは不完全であることが知られています。
このコンテンツはGo Wikiの一部です。