2

在内核源代码中提到random.cget_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/但似乎没有提到这是如何工作的。

4

2 回答 2

1

据我所知,它不会直接耗尽熵池。它只是返回一个低质量的随机数。它取决于 ISN seq 生成使用的秘密哈希(定期刷新)、它自己的 per-cpu 状态和 pid/time/cycles。

它与 urandom 的主要相似之处在于它在熵低时不会阻塞。

于 2013-03-07T14:37:05.577 回答
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_secrethash, 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,我还看到生成进程时熵计数下降。

于 2016-03-02T04:02:32.453 回答