
私は始めたkaslr.cそして、次に定義されたkaslr_get_random_long()を使用することがわかりました。kaslr.h そして実装ライブラリ/kaslr.cおそらくより多くのエントロピーを生成するために、インテルのハードウェアPRNG(RDRAND)、タイムスタンプ、および少なくとも1つのシステムタイマーを使用します。
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 は、ハッシュが静的ゼロに設定された非常に単純な線形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を使用するようにパッチを適用したかどうか疑問に思います。パフォーマンス/セキュリティバランスを考慮すると、これらの選択肢を理解できます。しかし、誰かが強化されたカーネルにもっと多くのオプションを提供するためにそれをパッチしたと確信しています。