不確かなメモリのクリーン アップ
説明
この欠陥は、0 をメモリに書き込むことによってメモリをクリーン アップしたのに、クリーン アップ操作の後にメモリが読み取られない場合に発生します。クリーン アップ後にメモリが読み取られないため、コンパイラがコードを最適化する際にクリーン アップ操作をスキップする可能性があります。たとえば、次のコードを考えます。
void foo(){
void* buffer = getSensitiveData();
//...
memset(buffer, 0, sizeof(buffer));
}buffer に機密データが含まれる可能性があります。memset() の呼び出しは、データをスクラブするために行われます。スクラブ後にバッファーが読み取られないため、コンパイラ最適化プロセスで memset() コマンドが無視される可能性があります。その場合、buffer 内のデータはクリーン アップされずに残されます。Polyspace® は、このような不確かなメモリのクリーン アップにフラグを設定します。以下のいずれかの条件に該当する場合、Polyspace はこの欠陥を報告しません。
メモリのクリーン アップ関数の戻り値が変数に代入される。
メモリのクリーン アップ関数がグローバル オブジェクトをスクラブする。
リスク
変数が書き込まれた後に読み取られることがないと、コンパイラがこれをデッドストアと見なす可能性があります。コンパイラはコードを最適化するために、デッドストア変数へのすべての代入を削除する可能性があります。
このようなコード最適化によって、メモリの機密情報をスクラブするコードが削除された場合、機密情報がクリーン アップされずにシステム内に残る可能性があります。攻撃者がこの機密情報にアクセスし、これを使用してコード内の保護メカニズムをさらに侵害する恐れがあります。
修正方法
メモリをスクラブするときは、コンパイラが削除できないコードを使用します。たとえば、memset ではなく、memset_s や fill_n などの安全な関数を使用します。これらの関数を使用できない古いバージョンの C または C++ を使用している場合は、コードをより新しいバージョンに更新することを検討してください。あるいは、安全な独自のメモリ スクラブ関数を実装することもできます。独自の実装を使用する場合は、コンパイルされたコードをレビューして、コンパイラがメモリ クリーン アップ操作に干渉しないことを確認してください。
例
結果情報
| グループ: セキュリティ |
| 言語: C | C++ |
| 既定値: オフ |
コマンド ライン構文: UNCERTAIN_MEMORY_CLEANING |
| 影響度: Medium |
バージョン履歴
R2022a で導入