71

strncpyが安全でないと見なされる理由を調べています。誰かがこれまたはそれを使用したエクスプロイトの例に関する何らかのドキュメントを持っていますか?

4

5 に答える 5

46

このサイトを見てください; それはかなり詳細な説明です。基本的に、strncpy()NUL終了を必要としないため、さまざまなエクスプロイトの影響を受けやすくなります。

于 2009-05-15T17:20:06.660 に答える
12

元の問題は、明らかにstrcpy(3)メモリ セーフな操作ではなかったため、攻撃者がバッファよりも長い文字列を供給して、スタック上のコードを上書きし、慎重に配置すれば、攻撃者から任意のコードを実行できることです。

しかし、strncpy(3)には別の問題があり、宛先ですべての場合にヌル終了を提供するとは限りません。(宛先バッファーよりも長いソース文字列を想像してください。) 将来の操作では、同じサイズのバッファー間で C のヌル文字で終わる文字列が一致することが予想され、結果がさらに 3 番目のバッファーにコピーされるときにダウンストリームで誤動作する可能性があります。

strncpy(3) を使用することは strcpy(3) よりも優れていますが、strlcpy(3) のようなものはさらに優れています。

于 2012-06-01T07:12:07.457 に答える
7

strncpy を安全に使用するには、(1) 結果バッファに null 文字を手動で貼り付ける、(2) バッファが null で終わることを事前に知っておいて、(長さ-1) を strncpy に渡す、または (3) それを知っている必要があります。バッファーの長さをバッファーの長さにバインドしないメソッドを使用して、バッファーがコピーされることはありません。

strncpy はコピーされた文字列以降のバッファー内のすべてをゼロで埋めますが、他の長さ制限のある strcpy バリアントはそうではないことに注意することが重要です。これは、場合によってはパフォーマンスの低下になる可能性がありますが、セキュリティ上の利点になる場合もあります。たとえば、strlcpy を使用して「supercalifragilisticexpalidocious」をバッファーにコピーしてから「it」をコピーすると、バッファーは「it^ercalifragilisticexpalidocious^」を保持します (「^」を使用してゼロバイトを表します)。バッファが固定サイズのフォーマットにコピーされると、余分なデータが一緒にタグ付けされる可能性があります。

于 2010-10-22T17:29:22.117 に答える
5

質問は「ロードされた」前提に基づいているため、質問自体が無効になります。

ここでのstrncpy結論は、これは安全ではないと見なされており、安全でないと見なされたことは一度もないということです。その関数に付随する可能性のある「セキュリティ上の問題」の唯一の主張は、C メモリ モデルと C 言語自体の一般的なセキュリティ上の問題に関する幅広い主張です。(しかし、それは明らかにまったく別のトピックです)。

C 言語の領域内では、「安全な文字列コピー」 (つまり、この関数が実行しないもの、意図されていないもの)strncpyを使用するという広範な疑わしいパターンから、C 言語に固有のある種の「不安」という誤った信念が生まれています。strncpyこのような使用法は、実際に非常にエラーが発生しやすいものです。しかし、「非常にエラーが発生しやすい」と「安全でない」の間に等号を置いたとしても、それは使用上の問題 (つまり教育の問題) であり、問​​題ではありませんstrncpy

基本的に、唯一の問題strncpyは、仕様を実際に読む代わりに、この関数が何をするかを理解していると初心者プログラマーに思い込ませる不幸な命名であると言えます。strncpy関数名を見ると、無能なプログラマーはが の「安全なバージョン」であると想定しますがstrcpy、実際には、これら 2 つの関数はまったく無関係です。

一例として、除算演算子に対してもまったく同じ主張を行うことができます。ほとんどの人が知っているように、C 言語に関する最もよくある質問の 1 つは、「それ1/2が評価されると仮定しまし0.5たが、代わりに得0られました。なぜですか?」というものです。それでも、言語初心者がその動作を誤解する傾向があるという理由だけで、除算演算子が安全でないとは主張しません。

別の例として、疑似乱数ジェネレーター関数を「安全ではない」とは呼びません。無能なプログラマーは、出力が真にランダムではないという事実に不快な驚きを覚えることがよくあります。

それはまさにそれがstrncpy機能である方法です。初心者のプログラマーが疑似乱数ジェネレーターが実際に何をするかを学ぶのに時間がかかるのと同じように、実際に何をするかを学ぶのにも時間がかかりますstrncpyこれが、ゼロで終わる文字列を固定幅文字列に変換することを目的としstrncpy変換関数であることを理解するには時間がかかります。「安全な文字列コピー」とはまったく関係がなく、その目的で有意義に使用できないことを知るには時間がかかります。strncpy

確かに、語学学習strncpy者が除算演算子を使って物事を整理するよりも、目的を理解するのに通常ははるかに長い時間がかかります。ただし、これは に対する「不安」の主張の根拠となりますstrncpy

PS 受け入れられた回答にリンクされている CERT ドキュメントは、まさにそのことに専念していstrncpyますstrcpystrncpyそれ自体が何らかの形で安全でないと主張することは決して意図されていません。

于 2014-09-10T14:50:35.120 に答える