メインコンテンツ

スタック内にクリアされていない機密データがあります

スタック内の変数がクリアされておらず、機密データが含まれている

説明

この欠陥は、静的に割り当てられたメモリに機密データが含まれており、関数またはプログラムを終了する前に機密データをクリアしなかった場合に発生します。

リスク

パスワードやユーザー情報などの機密情報がスタック内に残っていると、プログラム終了後、攻撃者がその情報にアクセスできるようになります。

修正方法

関数またはプログラムの終了前に、memsetSecureZeroMemory を使用して、機密データを含むメモリ ゾーンをクリアしておきます。

すべて展開する

#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>

void bug_sensitivestacknotcleared(const char * my_user) {
    struct passwd* result, pwd;
    long bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
    char buf[1024] = "";
    getpwnam_r(my_user, &pwd, buf, bufsize, &result);
} 

この例では、静的バッファーがパスワード情報で埋められています。プログラムは、その終了時にスタック メモリを解放します。しかし、データは依然としてメモリからアクセス可能です。

修正 — メモリをクリア

1 つの修正方法として、関数の終了前にメモリを上書きします。この例では、memset を使用してバッファー メモリからデータをクリアしています。

#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <pwd.h>
#include <assert.h>

#define isNull(arr) for(int i=0;i<(sizeof(arr)/sizeof(arr[0]));i++) assert(arr[i]==0)

void corrected_sensitivestacknotcleared(const char * my_user) {
    struct passwd* result, pwd;
    long bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
    char buf[1024] = "";
    getpwnam_r(my_user, &pwd, buf, bufsize, &result);
    memset(buf, 0, (size_t)1024);
    isNull(buf);
}

結果情報

グループ: セキュリティ
言語: C | C++
既定値: オフ
コマンド ライン構文: SENSITIVE_STACK_NOT_CLEARED
影響度: Medium

バージョン履歴

R2015b で導入