LOCRET.GLOB

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

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

脆弱性とリスク

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

脆弱コード例

コピー
  #include <stdlib.h>
  
  int *buf;
  
  void func_GLOB(unsigned n)
  {
      int aux;
      if (n == 1) {
          buf = &aux;
     } else {
         buf = (int *)malloc(n * sizeof(int));
     }
 }

Klocwork は、関数 func_GLOB が制御されなくなる 13 行目でフラグを立てます。これは、9 行目でグローバル変数に割り当てられるローカル変数 'aux' が、関数が戻った後で、このグローバル変数を介してアクセスできることを示しています。

関連チェッカー

セキュリティトレーニング

Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。