LOCRET.RET
関数によって戻り値のローカル変数のアドレスが返されました
LOCRET.RET チェッカーは、関数が return ステートメント内の式を介してローカル変数のアドレスを返すインスタンスを検出します。
脆弱性とリスク
ローカル変数はスタックに割り当てられるため、関数がポインターを変数に返すとき、スタックアドレスが返されています。このアドレスは関数から戻った後は無効になります。このため、このアドレスにアクセスすると、アプリケーションが予期しない動作 (通常、プログラムクラッシュ) をする可能性があります。
脆弱コード例
コピー
#include <stdlib.h>
int *func_RET(unsigned n)
{
int aux;
int *p;
if (n == 1) {
p = &aux;
} else {
p = (int *)malloc(n * sizeof(int));
}
return p;
}
Klocwork は 12 行目でフラグを立て、関数 func_RET が引数を介してローカル変数のアドレスを返すことを指摘します。ローカル変数 aux のアドレスは変数 p に割り当てることができ、変数 p が返されます。
関連チェッカー
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。