hash[0]
还与一个名为的散列混合在一起,该散列仅random_int_secret
在启动时由函数生成一次random_int_secret_init()
。它是使用 生成的get_random_bytes()
,它确实耗尽了熵估计。
从 drivers/char/random.c 中定义了一个函数,该函数将生成这个一次性哈希,每次请求随机 int 时都会重新使用该哈希:
static u32 random_int_secret[MD5_MESSAGE_BYTES / 4];
int random_int_secret_init(void)
{
get_random_bytes(random_int_secret, sizeof(random_int_secret)); /* XXX */
return 0;
}
在函数get_random_int()
中 ,random_int_secret
与hash
, before混合hash[0]
作为被请求的随机整数返回。
static DEFINE_PER_CPU(__u32 [MD5_DIGEST_WORDS], get_random_int_hash);
unsigned int get_random_int(void)
{
__u32 *hash;
unsigned int ret;
if (arch_get_random_int(&ret))
return ret;
hash = get_cpu_var(get_random_int_hash);
hash[0] += current->pid + jiffies + random_get_entropy();
md5_transform(hash, random_int_secret); /* XXX */
ret = hash[0];
put_cpu_var(get_random_int_hash);
return ret;
}
EXPORT_SYMBOL(get_random_int);
在启动过程开始时,在 init/main.c 中,会生成此种子:
static void __init do_basic_setup(void)
{
cpuset_init_smp();
shmem_init();
driver_init();
init_irq_proc();
do_ctors();
usermodehelper_enable();
do_initcalls();
random_int_secret_init(); /* XXX */
}
关于猫耗尽游泳池,我曾经记得它为什么这样做,但我现在不记得了。但是我很确定它不是 ASLR,因为在带有 RDRAND 的系统上,get_random_int()
只从指令中给出整数,而没有别的。我的系统有 RDRAND,我还看到生成进程时熵计数下降。