67

作業中のプロジェクトをコンパイルするときに警告を有効にし-Wstack-protectorました(商用マルチプラットフォームC ++ゲームエンジン、Mac OS X10.6とGCC4.2でコンパイル)。-fstack-protectorこのフラグは、有効になっている場合でもスタックスマッシングから保護されない関数について警告します。GCCは、プロジェクトのビルド時にいくつかの警告を発します。

関数を保護しない:少なくとも8バイトの長さの
バッファーがないローカル変数を保護しない:可変長バッファー

最初の警告として、関数で使用するときにバッファが持つ必要のある最小サイズを調整できることがわかりました。この関数をスタックスマッシングから保護するには、次の--param ssp-buffer-size=Xように使用できます。Xはデフォルトで8であり、次のようになります。 1と低い。

2番目の警告では、の使用を停止しない限り、その発生を抑制することはできません-Wstack-protector

  1. いつ-fstack-protector使用する必要がありますか?(たとえば、開発中は常に、またはバグを追跡するときなど)
  2. いつ-fstack-protector-all使用する必要がありますか?
  3. 何を-Wstack-protector言っているの?バッファの最小サイズを減らすことを提案していますか?
  4. もしそうなら、サイズを1にすることのデメリットはありますか?
  5. -Wstack-protector警告のないビルドが必要な場合は、常に有効にしたい種類のフラグではないようです。これは正しいですか?
4

2 に答える 2

74

スタック保護は強化戦略であり、デバッグ戦略ではありません。ゲームがネットワーク対応であるか、制御されていないソースからのデータがある場合は、オンにします。制御されていない場所からのデータがない場合は、オンにしないでください。

バグがあり、攻撃者が制御できる何かに基づいてバッファを変更した場合、攻撃者はリターン アドレスまたはスタックの同様の部分を上書きして、あなたのコードではなく自分のコードを実行させることができます。スタック保護は、これが発生したことを検出すると、プログラムを中止します。ユーザーは満足しませんが、ハッキングされることもありません。これは、ゲーム内で不正行為を行うハッキングではなく、誰かがコードの脆弱性を利用して、ユーザーに感染する可能性のあるエクスプロイトを作成するハッキングです。

デバッグ指向のソリューションについては、マッドフラップなどを見てください。

具体的な質問について:

  1. 制御されていないソースからデータを取得する場合は、スタック プロテクターを使用します。これに対する答えはおそらくイエスです。だからそれを使用してください。管理されていないソースからのデータを持っていなくても、最終的には、またはすでにデータを取得していて、そのことに気付いていない可能性があります。
  2. パフォーマンスの低下と引き換えに追加の保護が必要な場合は、すべてのバッファーのスタック保護を使用できます。gcc4.4.2 マニュアルから:

    -fstack-プロテクター

    スタック破壊攻撃などのバッファ オーバーフローをチェックする追加のコードを発行します。これは、脆弱なオブジェクトを持つ関数にガード変数を追加することによって行われます。これには、alloca を呼び出す関数と、8 バイトを超えるバッファーを持つ関数が含まれます。ガードは、関数に入るときに初期化され、関数が終了するときにチェックされます。ガード チェックが失敗すると、エラー メッセージが出力され、プログラムが終了します。

    -fstack-protector-all

    -fstack-protector と同様ですが、すべての機能が保護されています。

  3. 警告は、スタック保護が保護できないバッファーを示します。

  4. 必ずしも最小バッファー サイズを減らすことを提案しているわけではありません。0/1 のサイズでは、stack-protector-all と同じです。バッファが保護されるようにコードを再設計することにした場合は、それを指摘しているだけです。
  5. いいえ、これらの警告は問題を表すものではなく、情報を指摘するだけです。それらを定期的に使用しないでください。
于 2010-11-25T19:46:23.657 に答える
1

実際、通常のビルドの警告を気にする必要はありません。それは実際には情報メッセージです。スタック上の可変サイズのバッファに固有のセキュリティ上の懸念があることは明らかだと思います。サイズの計算を間違えると、大きな穴が開いてしまいます。

于 2009-10-27T10:15:29.047 に答える