EN JP CN

LOCRET.GLOB

LOCRET.GLOB

関数によってグローバル変数内のローカル変数のアドレスが返されました

LOCRET.GLOB チェッカーは、関数が、グローバル変数にアドレスを書き込むことにより、ローカル変数のアドレスを返すインスタンスを検出します。

脆弱性とリスク

ローカル変数はスタックに割り当てられるため、関数がポインターを変数に返すとき、スタックアドレスが返されています。このアドレスは関数から戻った後は無効になります。このため、このアドレスにアクセスすると、アプリケーションが予期しない動作 (通常、プログラムクラッシュ) をする可能性があります。

脆弱コード例

1  #include <stdlib.h>
2  
3  int *buf;
4  
5  void func_GLOB(unsigned n)
6  {
7      int aux;
8      if (n == 1) {
9          buf = &aux;
10     } else {
11         buf = (int *)malloc(n * sizeof(int));
12     }
13 }

Klocwork flags line 13 where control leaves function func_GLOB。これは、9 行目でグローバル変数に割り当てられるローカル変数 ’aux’ が、関数が戻った後で、このグローバル変数を介してアクセスできることを示しています。

関連チェッカー