未初期化メモリの漏えい

初期化していないメモリがユーザー向けの出力にコピーされる問題

説明

初期化していないスタックやプールのバッファーをユーザー向け出力、カーネルからユーザー空間へのコピー、ファイル出力などに使うと、情報が漏えいするおそれがあります。

想定される影響

  • 以前のスタックやヒープの内容が外部に漏れる可能性があります。
  • 漏えいしたアドレス、トークン、鍵の断片が、ほかの攻撃に使われるおそれがあります。

対処方法

  1. 出力バッファーは使用前に全体を初期化します。
  2. 構造体や配列の一部だけを埋める場合は、パディングや未使用領域も消去します。
  3. カーネルコードでは、ユーザー空間へコピーする前に 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で初期化します。

参考資料