
kasld v0.4.0
KASLD устраняет рандомизацию виртуального и физического размещения памяти ядра Linux из локального процесса, используя все доступные ему возможности — привилегии, конфигурацию и ограничения изоляции.
KASLD восстанавливает виртуальное и физическое расположение памяти ядра Linux — в первую очередь базовый адрес текста ядра — из локального процесса. То, что удаётся восстановить, зависит от точки обзора этого процесса: его привилегий и возможностей, конфигурации системы и любых ограничений контейнера. Там, где утечка или побочный канал позволяют, базовый адрес восстанавливается напрямую; в противном случае он сужается до наименьшего набора размещений, которые поддерживаются доступными свидетельствами.
Механизм вывода объединяет свидетельства из десятков независимых методов с известными инвариантами архитектуры, сужая размещение ядра до остаточного окна — которое сообщается как число сохранившихся слотов (размещений, которые мог выбрать KASLR) и представляющие их биты энтропии: верхняя граница защиты, которую KASLR сохраняет с этой точки обзора, а не гарантия того, что базовый адрес недосягаем для атакующего (см. docs/limitations.md).
Полное восстановление часто невозможно на усиленно защищённой цели — такой, где не сохраняется прямая утечка текста ядра и закрыты побочные каналы, которые предоставляют её архитектура и CPU — но множество ограничений редко бывает пустым. На архитектурах без KASLR механизм определяет адрес загрузки, выбранный загрузчиком.
Поддерживаются:
- x86 (i386+, amd64)
- ARM (armv6, armv7, armv8, aarch64)
- MIPS (mipsbe, mipsel, mips64, mips64el)
- PowerPC (ppc, ppcle, ppc64, ppc64le)
- RISC-V (riscv32, riscv64)
- LoongArch (loongarch64)
- s390
Быстрый старт
sudo apt install libc-dev make gcc binutils git
git clone https://github.com/bcoles/kasld
cd kasld
make
./build/<arch>/kasld
Каталог build/<arch>/ самодостаточен и может быть развёрнут на целевой системе:
build/<arch>/
kasld <- запускать это
components/ <- компоненты утечек
Усиленно защищённая конфигурация (kernel.dmesg_restrict=1,
kernel.kptr_restrict=1, kernel.perf_event_paranoid=2 или выше,
kernel.unprivileged_bpf_disabled=1 и хеширование указателей %pK) сужает
путь через оракулы файловой системы, но это лишь одна ось точки обзора: методы
побочных каналов, слабой энтропии и предоставляемые возможностями не зависят от
этих sysctl. Для тестирования скрипт
extra/weaken-kernel-hardening
может временно ослабить эти настройки (требуется root).
Пример вывода
Режим текстового вывода по умолчанию печатает обзор, начинающийся с ответа:
KASLD 0.4.2-dev -- Kernel Address Space Layout Derandomization
Target: x86_64 / 7.0.0
Running 117 of 120 components (3 experimental skipped; use -x to enable)...
[####################] 100% 117/117 40.9s
1 component timed out after 30s and was killed (prefetch_directmap)
Quantity Certainty Window Candidates Grain
------------------- ---------- --------------------------------------- ---------------- -----
Virtual Image Base guaranteed 0xffffffff81000000 - 0xffffffffbd400000 483 of 512 2 MiB
Virtual Image Base likely 0xffffffff93400000 slide +0x12400000 1 2 MiB
Physical Image Base guaranteed 0x1000000 - 0x3d400000 474 2 MiB
Physical Image Base likely 0x1000000 - 0x3c29d000 474 2 MiB
Direct Map Base guaranteed 0xffff800000000000 - 0xffffa4aa80000000 37,547 1 GiB
Vmalloc Base guaranteed 0xffff898000000000 - 0xffffd6d580000000 79,191 of 79,191 1 GiB
Vmemmap Base guaranteed 0xffffa98040000000 - 0xfffffd0000000000 85,504 1 GiB
Module Region Base guaranteed 0xffffffffa0000000 - 0xffffffffff000000 389,121 4 KiB
Module Region Base likely 0xffffffffc0000000 - 0xffffffffc0400000 1,025 4 KiB
Paging Level guaranteed 48 1 of 2 -
Note: physical and virtual text randomize independently
Note: 1 sub-range excluded from the windows above; the counts
already reflect them (-v lists the ranges).
Evidence (1 finding, 2 components)
Region Position Address Sources
----------------- -------- ------------------ -------
virt kernel image base 0xffffffff93400000 2
[-v: detailed results, memory map, system info] [-H: hardening assessment]
Столбец Certainty разделяет два разных утверждения об одной и той же
величине. Строка guaranteed доказана: истинное значение лежит внутри этого
окна. Строка likely — это единственная наилучшая оценка, которую
поддерживают свидетельства; она всегда является подмножеством гарантированного
окна и может быть неверной, поскольку опирается на сигналы ниже порога
достоверности, такие как временные побочные каналы. Результат, на котором стоит
действовать напрямую, — это строка guaranteed, суженная до одного кандидата;
значение likely — это зацепка для подтверждения, а не факт, на который можно
полагаться.
-v добавляет полный подробный вывод (баннер, блок конфигурации системы,
журналы по каждому компоненту, анализ KASLR, карты расположения памяти). -j
выдаёт машиночитаемый JSON — полное структурированное представление, всегда
включающее записи по каждому компоненту и оценку защищённости. -1 выдаёт
одну строку, пригодную для передачи в shell. -m форматирует для трекеров
задач. -H добавляет оценку защищённости к текстовым/markdown-отчётам.
Полный CLI, подробности режимов вывода, режим объяснения и оценку защищённости см. в docs/usage.md.
Точка обзора
То, что KASLD может восстановить, зависит от точки обзора запущенного процесса — не от одного уровня привилегий, а от сочетания трёх независимых вещей: