ASLR受Linux上的熵影响吗?

时间:2013-03-07 12:44:21

标签: linux entropy aslr

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/,但似乎没有提到这是如何运作的。

2 个答案:

答案 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_secrethash混合,之后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,我也看到产生过程时熵计数会下降。