init_on_free 是否立即将未映射的 VMA 归零?

init_on_free 是否立即将未映射的 VMA 归零?

该功能已在 commit 中添加6471384a,应该在页面被释放时对其进行初始化。这是通过在源文件中完成的mm/page_alloc.cfree_pages_prepare()prep_new_page().

当 VMA 取消映射时(手动或在进程终止时自动),是否保证所有进程内存都初始化为零?与通过管道发送数据或在内核和用户之间传递页面等操作相关的内核板又如何呢?请注意提交消息中描述的一个重要异常,该异常适用于一些平板(但绝不适用于用户页面):

init_on_alloc=1 和 init_on_free=1 都保证分配器返回归零的内存。两个例外是带有构造函数和 SLAB_TYPESAFE_BY_RCU 标志的板缓存。为了保留它们的语义,它们永远不会被零初始化。

考虑以下假设脚本,其中列出了所有小于 256 位的设备映射器加密密钥,然后删除所有设备映射器目标,并在此过程中删除密钥:

#!/bin/bash

count=0
dmsetup table --showkeys | while IFS= read table; do
    set -- $table # key material is now present in $6
    [[ ${#6} -lt 64 ]] && ((count++))
done
echo "$count keys less than 256 bits"
dmsetup remove_all --force

所有相关进程终止后,关键数据会在什么时候保留下来init_on_free=1?假设没有交换或跟踪,slub 调试和页面中毒等被禁用。


有趣的是,dmsetup不使用DM_SECURE_DATA_FLAG,缓冲区中的一个标志通过 ioctl 传递给 DM,从而可以擦除缓冲区drivers/md/dm-ioctl.c:1855

secure_data = param_kernel->flags & DM_SECURE_DATA_FLAG;

[...]

/* Wipe the user buffer so we do not return it to userspace */
if (secure_data && clear_user(user, param_kernel->data_size))
    goto bad;

当进程终止并且其所有页面都被释放时,大概这并不重要。

相关内容