CS.LOCRET.GLOB
関数によってローカル変数のアドレスが返されました
以前に解放されたメモリを使用すると、欠陥のインスタンス化とタイミングに応じて、有効なデータの破損から任意のコードの実行に至るまで、さまざまな悪影響を及ぼす可能性があります。データ破損が発生する可能性がある最も簡単な方法として、システムによる解放メモリの再利用があります。C# には、まだ参照が存在すればメモリを解放しないガベージコレクターが内部にありますが、そうした参照は安全でないブロックで発生する可能性があるため、解放後の使用はまれな状況となります。CS.LOCRET チェッカーファミリが検出するのは、安全でない関数が、ブロックのスコープ外で、ローカル変数のアドレスにアクセスできるようにし、ダングリングポインターや解放後の使用などの指摘を引き起こすようなインスタンスです。
CS.LOCRET.GLOB チェッカーが検出するのは、関数が、グローバル変数にアドレスを作成ことにより、ローカル変数のアドレスを返すようなインスタンスです。
脆弱性とリスク
ローカル変数はスタックに割り当てられるため、関数がポインターを変数に返すとき、スタックアドレスが返されています。このアドレスは関数から戻った後は無効になります。このため、このアドレスにアクセスすると、アプリケーションが予期しない動作 (通常、プログラムクラッシュ) をする可能性があります。
解放後の使用エラーには、場合によっては重複する、次の 2 つの一般的な原因があります。
- エラー条件およびその他の例外的な状況。
- プログラムのどの部分がメモリ解放に関与しているかについての混乱。
脆弱コード例
コピー
using System.IO;
namespace Example
{
class Program
{
public static int *glob;
unsafe static int* aaa()
{
int *aux = stackalloc int[3];
glob = aux; //@ CS.LOCRET.GLOB
}
}
}
関連チェッカー
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。