ASLR受Linux上可用的熵的影响?
内核源代码中提到,ASLR受Linux上可用的熵的影响?,linux,entropy,aslr,Linux,Entropy,Aslr,内核源代码中提到,get\u random\u int与urandom类似,但目标是最小化熵池损耗。然而,get\u random\u int在哪里(以及如何)与熵池交互 现在,uradom实际上调用了extract\u entropy\u user,但我在get\u random\u int中没有看到类似的调用。似乎get\u random\u int使用了自己的熵源(与键盘、鼠标和磁盘活动无关): 不关心(也不更新)系统总体上可用的熵的状态 get\u random\u int如何耗尽熵池?
get\u random\u int
与urandom类似,但目标是最小化熵池损耗。然而,get\u random\u int
在哪里(以及如何)与熵池交互
现在,uradom
实际上调用了extract\u entropy\u user
,但我在get\u random\u int
中没有看到类似的调用。似乎get\u random\u int
使用了自己的熵源(与键盘、鼠标和磁盘活动无关):
不关心(也不更新)系统总体上可用的熵的状态
get\u random\u int
如何耗尽熵池?这在哪里得到更新?我知道我漏掉了一些东西或者读错了源代码,因为当我执行一个程序时,我可以看到它是如何消耗熵池的,只要在熵池上执行cat
我已经看过了,但它似乎没有提到它是如何工作的。据我所知,它不会直接耗尽熵池。它只是返回一个低(er)质量的随机数。它取决于ISN seq生成(定期刷新)所使用的秘密哈希、它自己的每cpu状态以及pid/时间/周期
它与Uradom的相似之处在于,当熵较低时,它不会阻塞。散列[0]还与名为
随机int\u secret
的散列相混合,该散列在启动早期由函数随机int\u secret\u init()生成一次。它是使用get\u random\u bytes()
生成的,这会耗尽熵估计
从drivers/char/random.c中定义了一个函数,该函数将生成此一次性散列,每次请求随机整数时都会重复使用该散列:
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()
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\u random\u int()
只从指令中给出int,其他什么都没有。我的系统有RDRAND,我也看到生成进程时熵计数下降。有趣的是,那么为什么我在重复搜索文件时观察到熵下降?如果我不得不猜测,我会说这是因为重新设置序列生成器()
,它会定期调用(并设置上述散列),它使用get\u random\u bytes()
,它确实使用熵池。仔细想想,这似乎是一个错误的猜测,因为重设密钥间隔是(300*HZ)
。在任何情况下,我都看不到有任何东西直接耗尽熵。你能重现我观察到的熵被耗尽的行为吗?我杀死大多数正在运行的进程,做一个查找以确保熵是高的,然后我使用cat/proc/sys/kernel/entropy\u,并看到每次执行cat时,这个数字都会减少。
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 */
}