바닐라 소스에서처럼 lib/kaslr.c의 RDRAND보다 KASLR에서 더 안전한 CSPRNG를 구현하는 배포판이 있습니까?

바닐라 소스에서처럼 lib/kaslr.c의 RDRAND보다 KASLR에서 더 안전한 CSPRNG를 구현하는 배포판이 있습니까?

나는 시작했다kaslr.c그리고 다음에 정의된 kaslr_get_random_long()을 사용한다는 것을 발견했습니다.kaslr.h 그리고 구현lib/kaslr.c더 많은 엔트로피를 생성하기 위해 RDRAND(인텔의 하드웨어 PRNG), 타임스탬프 및 최소한 시스템 타이머를 사용할 수 있습니다.

unsigned long raw, random = get_boot_seed();
bool use_i8254 = true;

debug_putstr(purpose);
debug_putstr(" KASLR using");

if (has_cpuflag(X86_FEATURE_RDRAND)) {
    debug_putstr(" RDRAND");
    if (rdrand_long(&raw)) {
        random ^= raw;
        use_i8254 = false;
    }
}

if (has_cpuflag(X86_FEATURE_TSC)) {
    debug_putstr(" RDTSC");
    raw = rdtsc();

    random ^= raw;
    use_i8254 = false;
}

if (use_i8254) {
    debug_putstr(" i8254");
    random ^= i8254();
}

반환된 값은 일부 asm 순환 곱셈을 통해 약간 확산됩니다.

    /* Circular multiply for better bit diffusion */
asm(_ASM_MUL "%3"
    : "=a" (random), "=d" (raw)
    : "a" (random), "rm" (mix_const));
random += raw;

get_boot_seed는 정적 0으로 설정된 해시의 매우 간단한 선형 xor PRNG인 것 같습니다. 커널 부팅 매개변수에 의존하는 매우 간단한 xor를 사용합니다.

    /* Attempt to create a simple but unpredictable starting entropy. */
static unsigned long get_boot_seed(void)
{
    unsigned long hash = 0;

    hash = rotate_xor(hash, build_str, sizeof(build_str));
    hash = rotate_xor(hash, boot_params, sizeof(*boot_params));

    return hash;
}

이것은 "충분히 좋은" 유형의 접근 방식인 것으로 보이며 다른 배포판에서 더 강력한 CSPRNG를 사용하도록 패치했는지 궁금합니다. 성능/보안 균형을 고려하여 선택을 이해할 수 있습니다. 그러나 강화된 커널에 대해 더 많은 옵션을 허용하기 위해 누군가 이미 이를 패치했음이 틀림없다고 확신합니다.

관련 정보