web-dev-qa-db-ja.com

-fno-stack-protectorの使用とは何ですか?

Cでアプリケーションを作成しましたが、コンパイル時に-fno-stack-protectorコマンドの目的を理解しようとしています。私の特定のアプリケーションでは、このコマンドを使用しても、バッファオーバーフローに対する保護の観点からも、違いはありません。

-fstack-protectorおよび-fno-stack-protectorコマンドがそれぞれスタックスマッシングプロテクターを有効または無効にすることをオンラインで読みましたが、アプリケーションを自分でコンパイルする場合、事前にどのようにプロテクターを有効にできますか?コマンドの使用は、アプリケーションが実行されているシステムに依存する可能性がありますか?

24
touvlo2000

標準/ストックGCCでは、スタックプロテクターはデフォルトでオフになっています。ただし、一部のLinuxディストリビューションでは、GCCにパッチを適用してデフォルトでオンにします。私の意見では、これはかなり有害です。Makefileが特にスタックプロテクターを無効にしない限り、標準ユーザー空間ライブラリにリンクされていないものをコンパイルする機能を破壊するからです。このハックのあるディストリビューションがGCCに追加のハックを追加してカーネルがビルドされていることを検出し、それを無効にすることを除いて、Linuxカーネルビルドを壊すことさえあります。

16
R..

_-fstack-protector_でコンパイルする場合、コードがチェックを設定してから実際にチェックしているかどうかで、スタックに割り当てられるスペースが少し増え、関数の出入りにオーバーヘッドが少し増えます関数内でスタックを上書きしました。

それはあなたのアプリケーションに違いをもたらします。有効にすると、スタックオーバーフロー攻撃を迅速に回避します。コードに関数呼び出しがない場合にのみ、プログラムに影響を与えません(そして、通常main()を記述します。これはスタートアップコードによって呼び出される関数であるため、プログラム)。ただし、使用できる攻撃はスタックオーバーフロー攻撃だけではないため、万能薬ではありません。しかし、限られたコストで有用な保護です。

保護はシステム自体に依存しません。使用しているコンパイラのバージョンによって異なりますが、それだけです。

12

スタックプロテクターは、コンパイラとplaced intoプログラムによって生成されるコードです。プログラムによって呼び出されるのは、外部プログラムまたはシステムコールではありません。

2
Paul Richter

mayこれをオフにしたい理由は3つあります。

  • これが重要になる可能性のある共有ライブラリを構築しており、他の関数はスタックについて仮定しています。
  • パフォーマンスが心配です。
  • 脆弱なソフトウェアを構築します。これは、Protostarをビルドして、他の方法では脆弱でないエクスプロイトをデモンストレーションしたい場合のように、Capture The Flag(CTF)などで頻繁に発生します。
1
Evan Carroll

デフォルトのコンパイラ設定に一致するオプションが役立つ可能性がある時間は次のとおりです。

  • あなたが微調整したい複雑な構成を持つかもしれないビルドシステムを使用しているとき。メークファイルの迷路の中でfstack-protector(たとえば)を使用することを選択している場所を把握する代わりに、オプションのリストの最後に簡単に追加される追加オプションを簡単に渡すことができます。 GCCがオプションのセットでfstack-protectorfno-stack-protectorの両方を検出した場合、コマンドラインの最後の1つが有効になります。

  • この種のものが便利な場合(-fstack-protectorには当てはまらないようですが)は、「サブオプション」を有効にするオプションがある場合です。たとえば、-O2を設定すると、多数の-fxxx最適化オプションが有効になります。ほとんどの場合、-O2を使用したいが、GCCの厳密なエイリアス最適化は望ましくありません。そのため、-fno-strict-aliasingを指定して、その特定のオプションをデフォルト設定に戻すことができます。 (注:このケースは上記のケースと実際に同等です)

1
Michael Burr