ENV01-C. 環境変数のサイズについて勝手な想定をしない
環境変数は攻撃者によって完全に制御されている可能性があるため、環境変数のサイズについて勝手な想定をしないこと。環境変数を格納する必要がある場合、環境変数に結び付けられている文字列の長さを計算し、記憶域を動的に割り当てる必要がある。(「STR31-C. 文字データと null 終端文字を格納するために十分な領域を確保する」を参照)。
違反コード
以下のコード例は、getenv() から返された文字列を固定サイズのバッファにコピーしている。
void f() {
char path[PATH_MAX]; /* PATH_MAX は定義されているものとする */
strcpy(path, getenv("PATH"));
/* path を使う */
}
実行環境において、$PATH 環境変数や PATH_MAX が定義され、パス名の長さが必ず PATH_MAX 以下であることが保証されているとしても、$PATH の値が PATH_MAX の値より小さい保証はない。$PATH の値が PATH_MAX より長かった場合、バッファーオーバフローが発生する。また、$PATH が定義されていない場合、strcpy() による NULL ポインタ参照が発生する。
適合コード
以下のコードでは、strlen() 関数を使用して文字列のサイズを計算し、必要な領域を動的に割り当てている。
void f() {
char *path = NULL;
/* $PATH が定義されていることやその長さを仮定しない */
const char *temp = getenv("PATH");
if (temp != NULL) {
path = (char*) malloc(strlen(temp) + 1);
if (path == NULL) {
/* エラー条件の処理 */
} else {
strcpy(path, temp);
}
/* path を使う */
}
}
リスク評価
環境変数のサイズについて勝手な想定をすると、バッファオーバーフローが引き起こされることがある。
|
レコメンデーション |
深刻度 |
可能性 |
修正コスト |
優先度 |
レベル |
|---|---|---|---|---|---|
|
ENV01-C |
高 |
高 |
中 |
P18 |
L1 |
自動検出(最新の情報はこちら)
|
ツール |
バージョン |
チェッカー |
説明 |
|---|---|---|---|
|
Compass/ROSE |
|
|
「STR31-C. 文字データと null 終端文字を格納するために十分な領域を確保する」と同様な方法で、このレコメンデーションの違反を検出することができる。 |
関連するガイドライン
| CERT C++ Secure Coding Standard | ENV01-CPP. Do not make assumptions about the size of an environment variable |
| MITRE CWE | CWE-119, Failure to constrain operations within the bounds of an allocated memory buffer |
参考資料
| [Open Group 2004] | Chapter 8, "Environment Variables" |
| [Viega 2003] | Section 3.6, "Using Environment Variables Securely" |
翻訳元
これは以下のページを翻訳したものです。
ENV01-C. Do not make assumptions about the size of an environment variable (revision 53)
