在random.c
的内核源代码中提到get_random_int
是“与urandom类似,但目标是最小的熵池耗尽”。但是,get_random_int
与熵池的交互位置(以及如何)?
现在,urandom
实际上调用extract_entropy_user
,但我没有看到与get_random_int
中的内容类似的内容。似乎get_random_int
使用自己的熵源(与键盘,鼠标和磁盘活动无关):
hash[0] += current->pid + jiffies + get_cycles();
并不关心(也不更新)系统可用的熵状态?
get_random_int
如何耗尽熵池?这在哪里得到更新?我知道我错过了一些东西或者读错了源代码,因为当我执行一个程序时,我只能通过在entropy_avail上执行cat来看看它是如何耗尽熵池的。
我查看了http://xorl.wordpress.com/2011/01/16/linux-kernel-aslr-implementation/,但似乎没有提到这是如何运作的。
答案 0 :(得分:1)
据我所知,它不会直接耗尽熵池。它只返回一个低(呃)质量的随机数。它取决于ISN seq生成使用的秘密哈希(定期刷新),它自己的每个CPU状态,以及pid /时间/周期。
它与urandom类似,主要是因为当熵低时它不会阻塞。
答案 1 :(得分:0)
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
混合,之后hash[0]
作为请求的随机int返回。
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()
仅从指令中提供int,而没有其他内容。我的系统有RDRAND,我也看到产生过程时熵计数会下降。