説明
初期化していないスタックやプールのバッファーをユーザー向け出力、カーネルからユーザー空間へのコピー、ファイル出力などに使うと、情報が漏えいするおそれがあります。
想定される影響
- 以前のスタックやヒープの内容が外部に漏れる可能性があります。
- 漏えいしたアドレス、トークン、鍵の断片が、ほかの攻撃に使われるおそれがあります。
対処方法
- 出力バッファーは使用前に全体を初期化します。
- 構造体や配列の一部だけを埋める場合は、パディングや未使用領域も消去します。
- カーネルコードでは、ユーザー空間へコピーする前に
memset、ゼロ初期化を伴うメモリ確保APIなどで、コピーされるすべてのバイトを初期化します。
例
変更前
c
void run(char *user) {
char kernel_buffer[64];
copy_to_user(user, kernel_buffer, sizeof(kernel_buffer));
}
変更後
c
void run(char *user) {
char kernel_buffer[64];
memset(kernel_buffer, 0, sizeof(kernel_buffer));
copy_to_user(user, kernel_buffer, sizeof(kernel_buffer));
}
説明:
- 変更前:
kernel_bufferを初期化せずにユーザー空間へコピーしています。 - 変更後: コピーする前にバッファー全体を0で初期化します。