77

gcc -D_FORTIFY_SOURCE=1誰かが と の違いを指摘できますか-D_FORTIFY_SOURCE=2? =2より安全だと思いますか?ポイントごとの違いをリストしたリストを見つけることができませんでした。

-D_FORTIFY_SOURCE=2と一緒に使用する必要があることも読みました-O2。そうしないと、すべての機能が利用できるわけではありません。また、ここでは、回帰を詳細に指定するリストが見つかりませんでした。-Osターゲットはフラッシュメモリがそれほど多くないデバイスであるため、コンパイルすることに特に興味があります。

これがどこに文書化されているかについてのヒントは大歓迎です!

4

2 に答える 2

67

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

_FORTIFY_SOURCE(glibc 2.3.4 以降)

このマクロを定義すると、さまざまな文字列およびメモリ操作関数 (たとえば、、 、 、 、 、 、 、 memcpymemsetstpcpyおよびstrcpyそれらstrncpystrcatワイドstrncat文字sprintfバリアントsnprintf)を使用するときに、いくつかの軽量チェックが実行され、いくつかのバッファ オーバーフロー エラーが検出されます。一部の関数では、引数の一貫性がチェックされます。たとえば、指定されたフラグに が含まれている場合、モード引数で指定されたチェックが行われます。すべての問題が検出されるわけではなく、いくつかの一般的なケースのみが検出されます。vsprintfvsnprintfgetsopenO_CREAT

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

2に_FORTIFY_SOURCE設定すると、さらにチェックが追加されますが、一部の準拠プログラムは失敗する可能性があります。

一部のチェックはコンパイル時に (ヘッダー ファイルに実装されたマクロ ロジックを介して) 実行でき、コンパイラの警告が発生します。他のチェックは実行時に行われ、チェックが失敗すると実行時エラーが発生します。

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

さらに、FORTIFY_SOURCE を使用してアプリケーションのセキュリティを強化するという記事(2014 年 3 月) には、次のように記載されています。

  • gcc -D_FORTIFY_SOURCE=1コンパイル時にのみチェックを追加します (一部のヘッダーは必要です#include <string.h>)
  • gcc -D_FORTIFY_SOURCE=2実行時のチェックも追加します (検出されたバッファ オーバーフローによりプログラムが終了します)。

基本的に、_FORTIFY_SOURCEレベル 2 の方が安全ですが、コンパイル方法が少し危険です。それを使用する場合は、コンパイルされたコードに対して非常に強力な回帰テストを行って、コンパイラが予期しない動作を導入していないことを確認してください。

于 2013-05-17T07:55:44.330 に答える