UNIX 環境でいくつかの ENV 変数を使用する C コードを作成しようとしています。問題は、変数 (getenv() など) を読み取ると、バッファ オーバーフローが発生する可能性があるかどうかです。さらに、プラットフォームの環境変数サイズの制限を見つけるにはどうすればよいですか? たとえば、どのヘッダー ファイルですか。
最後に、環境が提供する変数を読み取る際の最も安全なコード プラクティスは何ですか?
UNIX 環境でいくつかの ENV 変数を使用する C コードを作成しようとしています。問題は、変数 (getenv() など) を読み取ると、バッファ オーバーフローが発生する可能性があるかどうかです。さらに、プラットフォームの環境変数サイズの制限を見つけるにはどうすればよいですか? たとえば、どのヘッダー ファイルですか。
最後に、環境が提供する変数を読み取る際の最も安全なコード プラクティスは何ですか?
で環境変数を読み取ってgetenv()
も、バッファ オーバーフローは発生しません。
Linux では、継承された環境変数とその値は、カーネルによってプロセス アドレス空間に格納されますexec()
。このgetenv()
関数は、この既存のデータへのポインターを返すだけです。データをコピーしないため、バッファがなく、バッファ オーバーフローが発生することはありません。
あまりにも多くの環境変数を新しいプロセスに渡そうとするとexec()
、E2BIG
エラーが通知されます。
環境変数に関するバッファ オーバーフローの懸念は実際にはありません。
セキュリティ上の懸念は、環境の内容を信頼してはならないという事実に集中しています。プログラムが setuid (または setgid など) で実行されている場合、環境は攻撃ベクトルです。ユーザーは、悪意のある方法で やその他の変数を設定できPATH
ますLD_PRELOAD
。
ただし、setuid プログラムを作成することはほとんどありません。setuid プログラムをセキュアにすることが難しい理由はたくさんあるので、これは良いことです。
「読む」が何を意味するかによります。電話getenv
するだけなら何の問題もありません。ただし、返された文字列を何らかのバッファにコピーしようとして、バッファの制限をチェックしないと、バッファ オーバーフローが発生する可能性があります。によって返される文字列はgetenv
大きく、システムが環境に割り当てることを決定した使用可能なメモリ以外に上限はありません。
これは、取得する可能性のある他の文字列入力と何ら変わりはありません。and の使用strcpy
には注意してくださいsprintf
。これらは出力バッファーのサイズをチェックしないためです。
特に子プロセスに渡す場合は、環境に注意する必要があります。たとえば、環境には各変数に対して 1 つの値のみが含まれることになっていますが、複数の値を含む環境を作成するのは簡単です。最初の値を削除して結果を渡すと、別の値が公開されます。子供のために環境をサニタイズしたい場合は、取得した値から値を削除するのではなく、最初から作成してください。David Wheeler は、Unix/Linux での安全なプログラミングのガイドを彼の Web サイトで公開しています。