1. ホーム
  2. security

gcc -D_FORTIFY_SOURCE=1 と -D_FORTIFY_SOURCE=2 の相違点

2023-08-16 06:44:54

質問

誰か gcc -D_FORTIFY_SOURCE=1-D_FORTIFY_SOURCE=2 ? だろう =2 の方がより安全なのでしょうか?一点一点違いを列挙したリストは見つけられませんでした。

また、私は -D_FORTIFY_SOURCE=2-O2 でなければ、すべての機能が利用できないことになります。また、このサイトでは、リグレッションを詳細に指定したリストが見つかりませんでした。私は、特に -Os でコンパイルすることに興味があります。

これが文書化されている場所についてのどんなヒントでも歓迎します!

どのように解決するのですか?

機能テストマクロのマニュアルページより( man 7 feature_test_macros )

_FORTIFY_SOURCE (glibc 2.3.4 以降)

このマクロを定義すると、様々な文字列やメモリ操作関数を採用する際に、バッファオーバーフローエラーを検出するための軽量なチェックが行われます (例. memcpy , memset , stpcpy , strcpy , strncpy , strcat , strncat , sprintf , snprintf , vsprintf , vsnprintf , gets およびそのワイドキャラクターバリアント)。いくつかの関数では、引数の一貫性がチェックされる。 open が提供されているかどうかをチェックします。 モード 引数が指定された場合、指定されたフラグに O_CREAT . すべての問題が検出されるわけではなく、よくあるケースが検出されるだけです。

もし _FORTIFY_SOURCE が1に設定されている場合、コンパイラ最適化レベル1( gcc -O1 ) 以上で、適合するプログラムの動作を変更すべきでないチェックが実行されます。

とは _FORTIFY_SOURCE を 2 に設定すると、より多くのチェックが行われますが、適合するプログラムによっては失敗するかもしれません。

チェックのいくつかはコンパイル時に実行され (ヘッダーファイルに実装されたマクロロジックによって)、コンパイラの警告につながります。

このマクロを使用するには、コンパイラのサポートが必要で、それには gcc バージョン 4.0 以降で利用可能です。

さらに、記事 FORTIFY_SOURCEでアプリケーションのセキュリティを強化する (2014年3月)にはこうあります。

  • gcc -D_FORTIFY_SOURCE=1 はコンパイル時のみのチェックを追加します(いくつかのヘッダは #include <string.h> )
  • gcc -D_FORTIFY_SOURCE=2 実行時のチェックも追加(バッファオーバーフローを検出するとプログラムを終了させる)。

基本的には _FORTIFY_SOURCE レベル 2 はより安全ですが、ややリスクの高いコンパイル方法です。これを使用する場合は、コンパイルしたコードに対して非常に強力な回帰テストを行い、コンパイラが予期せぬ動作を導入していないことを証明するようにしてください。