4

のような C STL 関数への安全でない呼び出しを使用して記述されたレガシー コードがあるとしますstrcpystrcpyプログラムがバッファオーバーフローの問題に対して脆弱になるため、安全ではないことは誰もが知っています。strcpyへのすべての呼び出しを への呼び出しに置き換えたいとしましょうstrncpy。すべての呼び出しを に置き換える手法には、パラメーターを使用して呼び出してから で終了するstrcpy(dest, src)ことが含まれます。これに関する問題は、ヒープに割り当てられたメモリへのポインターである可能性があるため、常に長さがわからないことです。strncpy(dest, src, length of dest - 1)dest\0dest

destこれらの各呼び出しサイトでの長さを把握できると仮定しましょう。strcpyへのすべての呼び出しを への呼び出しに置き換えることstrncpyで、プログラムが (少なくとも の不適切な使用によるstrcpy) バッファ オーバーフロー攻撃の影響を受けないことが保証されます。ただし、このアプローチでは、データが暗黙のうちに切り捨てられ、プログラムの動作が望ましくない方法で変更される可能性があります。これは、切り捨てを検出してプログラムを中止するよりも優れたアプローチですか? または、切り捨てを許可するだけでなく、ログに記録する方が良いですか?

レガシ コードにパッチを適用するための自動化された方法の開発に関心がある人の観点から質問しています。この問題にどのようにアプローチするのが最善かについて考えている人はいますか?

4

2 に答える 2

6

strcpyプログラムがバッファオーバーフローの問題に対して脆弱になるため、安全ではないことは誰もが知っています。

これは少しも問題ではありません。たとえば、コピーする前に呼び出すことによって、または入ってくる文字列がおそらくより長くならないようにすることによって、strcpy文字列がバッファに収まるようにするのはプログラマ次第です。strlen彼らのバッファ。

strcpyへのすべての呼び出しをへの呼び出しに置き換えたいとしましょうstrncpy

固定サイズの文字列を扱っていない限り、これを行うべきではありません:strncpy終端の null までコピーするだけでなく、残りの文字列を null バイトで埋めることにも注意してください。の「最新の代替品」を探している場合は、代わりにstrcpyを使用することを検討してstrlcpyください。

この方法では、暗黙のうちにデータが切り捨てられ、プログラムの動作が望ましくない方法で変更される可能性があります。これは、切り捨てを検出してプログラムを中止するよりも優れたアプローチですか? または、切り捨てを許可するだけでなく、ログに記録する方が良いですか?

これは完全にあなた次第です。そのような切り捨てが発生する設計上の場所によって異なります。認証情報を Web サービスに送信するコードで発生する場合は、その時点でプロセスを停止する方がよいでしょう。トレース メッセージをログに書き込むコードで発生した場合は、おそらく問題を無視するか、ログに記録して続行しても問題ありません。残念ながら、ある程度のプログラムの理解が必要なため、自動的に決定することはできません。

于 2013-11-14T17:49:33.573 に答える
1

strncpy は STL 関数ではありません。:) C には STL ライブラリがありません。strcpy をすべて strncpy に置き換えるのは良い考えではないと思います。状況に応じてアプローチを変える必要があります。ほとんどの場合、strcpy を使用するだけで十分です。

于 2013-11-14T17:50:53.117 に答える