Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASLR受Linux上可用的熵的影响?_Linux_Entropy_Aslr - Fatal编程技术网

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 */
}