26

複雑な C++ コードがあります。これは、 FastCGI C++ クラス ライブラリを使用した FastCGI プログラムです。

非常に長いURLを要求すると、次のようになります。

*** stack smashing detected ***: ./tileserve terminated
Erreur de segmentation

実際のアプリケーションでは、私はそれほど長い URL を使用したことがないので問題にはなりませんが、これは、誰かが私のサーバーを終了できることを意味します... 私はそれが好きではありません。

この問題が発生する場所を見つけるツールはありますか? どうやって使うの?

編集:解決済み

私はこれをしていました:

int len;
char uri[200];

len = strlen(request.params[std::string("REQUEST_URI")].c_str());
printf("%d\n", len);

if (len > 200) return 1;

strcpy(uri, request.params[std::string("REQUEST_URI")].c_str());

テスト200には高すぎたようです。len実際には で失敗し194ます。

だから代わりに私はこれをしました:

if (len > 190) return 1;

さて、大丈夫です。

4

2 に答える 2

25

Webサイトを読むと、これがCライブラリの単純なC++ラッパーであることがわかります。

Cライブラリの一般的な問題は、バッファオーバーランです。

#include <cstring>
#include <cstdio>

int main(int argc, char* argv[]) {
  char buffer[16]; // ought to be sufficient

  strcpy(buffer, argv[1]);
  printf("%s", buffer);
}

このプログラムを試してください:

> ./test "a"
a
> ./test "abcdefghijklmnoprqstuvwxyz"
???

バッファには16文字しか含めることができないため、残りの文字はその終わりを超えて書き込まれます。これはスタックスマッシングであり、未定義の動作です。

ランタイムライブラリまたはOSの実装の多くは、状況によってはこの状況を検出してプログラムを終了する場合があります。

何か間違ったことをしているのかライブラリが間違っているのか。

問題を特定するには、Valgrindを使用するか、デバッガーでプログラムを実行します。または、システムで許可されている場合は、プログラムが強制終了されたときにメモリダンプが発生する可能性があります。このメモリダンプはデバッガで表示することもできます。

于 2012-04-10T11:43:16.737 に答える
2

valgrindのようなものを使用するか、コンパイラーに静的分析があり、バッファーをオーバーランしている可能性のある場所を見つけることができます。

また、strcpyのようなエラーが発生しやすい関数の使用についてコードを監査し、strncpyのような安全な関数に置き換えることもできますが、std::stringのような独自のメモリを管理するオブジェクトを使用することもできます。

于 2012-04-10T12:11:51.187 に答える