ASLR зависит от энтропии, доступной в Linux?

В исходном коде ядра в 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 истощает запас энтропии? Где это обновляется? Я знаю, что что-то упускаю или неправильно читаю исходный код, потому что, когда я запускаю программу, я вижу, как она истощает пул энтропии, просто выполняя cat на entropy_avail.

Я просмотрел http://xorl.wordpress.com/2011/01/16/linux-kernel-aslr-implementation/, но, похоже, не упоминается, как это работает.


person csstudent2233    schedule 07.03.2013    source источник


Ответы (2)


Насколько я могу судить, это не напрямую истощает запасы энтропии. Он просто возвращает случайное число более низкого качества. Это зависит от секретного хэша, используемого при генерации последовательности ISN (периодически обновляется), его собственного состояния для каждого процессора и pid/времени/циклов.

Он похож на urandom в основном тем, что не блокируется при низкой энтропии.

person Hasturkun    schedule 07.03.2013
comment
Интересно, а почему тогда я наблюдаю уменьшение entropy_avail, когда повторяю просмотр файла? - person csstudent2233; 07.03.2013
comment
Если бы мне пришлось угадывать, я бы сказал, что это из-за rekey_seq_generator(), который вызывается периодически (и устанавливает вышеупомянутый хэш), который использует get_random_bytes(), который действительно использует энтропийный пул. - person Hasturkun; 07.03.2013
comment
Если подумать, это может показаться плохим предположением, поскольку интервал смены ключей равен (300 * HZ). Во всяком случае я не вижу там ничего прямо истощающего энтропию - person Hasturkun; 07.03.2013
comment
Можете ли вы воспроизвести поведение, при котором я наблюдаю, как энтропия истощается, просто выбирая entropy_avail? Я убиваю большинство запущенных процессов, выполняю поиск, чтобы убедиться, что энтропия высока, затем запускаю cat /proc/sys/kernel/entropy_avail и вижу, что это число уменьшается при каждом выполнении cat. - person csstudent2233; 07.03.2013

hash[0] также смешивается с хэшем random_int_secret, который генерируется только один раз в начале загрузки функцией random_int_secret_init(). Он генерируется с использованием get_random_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() random_int_secret смешивается с hash, прежде чем 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, и я также вижу, что счетчик энтропии снижается при порождении процессов.

person cassab    schedule 02.03.2016