
kasld v0.4.0
KASLD randomisiert das virtuelle und physische Speicherlayout des Linux-Kernels von einem lokalen Prozess aus, wobei es nutzt, was seine Perspektive – Privilegien, Konfiguration und Einschränkungen – zulässt.
KASLD rekonstruiert das virtuelle und physische Speicherlayout des Linux-Kernels — hauptsächlich die Kernel-Textbasis — aus einem lokalen Prozess. Was es rekonstruieren kann, hängt von der Perspektive dieses Prozesses ab: seinen Privilegien und Fähigkeiten, der Systemkonfiguration und einer etwaigen Container-Eingrenzung. Wo ein Leck oder ein Seitenkanal es erlaubt, rekonstruiert es die Basis direkt; andernfalls grenzt es sie auf die kleinste Menge von Platzierungen ein, die die verfügbaren Hinweise stützen.
Die Inferenz-Engine fusioniert Hinweise aus Dutzenden unabhängiger Techniken mit den bekannten Invarianten der Architektur und grenzt die Platzierung des Kernels auf ein Restfenster ein — angegeben als Anzahl der verbleibenden Slots (der Platzierungen, die KASLR hätte wählen können) und die Bits an Entropie, die sie repräsentieren: eine obere Schranke für den Schutz, den KASLR aus dieser Perspektive behält, keine Garantie, dass die Basis außerhalb der Reichweite eines Angreifers liegt (siehe docs/limitations.md).
Eine vollständige Rekonstruktion ist auf einem gehärteten Ziel oft unmöglich — einem, bei dem kein direktes Kernel-Text-Leck überlebt und die Seitenkanäle, die seine Architektur und CPU offenlegen, geschlossen sind —, doch die Constraint-Menge ist selten leer. Auf Architekturen ohne KASLR ermittelt die Engine die vom Bootloader gewählte Ladeadresse.
Unterstützt:
- 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
Schnellstart
sudo apt install libc-dev make gcc binutils git
git clone https://github.com/bcoles/kasld
cd kasld
make
./build/<arch>/kasld
Das Verzeichnis build/<arch>/ ist eigenständig und kann auf ein Zielsystem
deployt werden:
build/<arch>/
kasld <- dies ausführen
components/ <- Leck-Komponenten
Eine gehärtete Konfiguration (kernel.dmesg_restrict=1,
kernel.kptr_restrict=1, kernel.perf_event_paranoid=2 oder höher,
kernel.unprivileged_bpf_disabled=1 und %pK-Pointer-Hashing) verengt den
Dateisystem-Oracle-Pfad, ist aber nur eine Achse der Perspektive:
Seitenkanal-, Schwache-Entropie- und durch Fähigkeiten gewährte Techniken sind
von diesen Sysctls unabhängig. Zum Testen kann das Skript
extra/weaken-kernel-hardening diese
Einstellungen vorübergehend lockern (erfordert Root).
Beispielausgabe
Der Standard-Textmodus gibt eine antwortorientierte Übersicht aus:
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]
Die Spalte Certainty trennt zwei verschiedene Aussagen über dieselbe
Größe. Eine guaranteed-Zeile ist bewiesen: Der wahre Wert liegt innerhalb
dieses Fensters. Eine likely-Zeile ist die beste einzelne Schätzung, die
die Hinweise stützen — immer eine Teilmenge des garantierten Fensters, und sie
kann falsch sein, weil sie auf Signale unterhalb der Soliditätsschwelle wie
Timing-Seitenkanäle zurückgreift. Ein direkt verwertbares Ergebnis ist eine
guaranteed-Zeile, die auf einen einzigen Kandidaten verengt ist; ein
likely-Wert ist eine zu bestätigende Spur, kein Fakt, auf den man sich
verlassen sollte.
-v fügt die vollständige ausführliche Ausgabe hinzu (Banner, Systemkonfigurationsblock,
Komponenten-Protokolle, KASLR-Analyse, Speicherlayout-Karten). -j gibt
maschinenlesbares JSON aus — die vollständige strukturierte Ansicht, stets
einschließlich der Komponenten-Datensätze und der Härtungsbewertung. -1 gibt
eine einzelne shell-pipebare Zeile aus. -m formatiert für Issue-Tracker. -H
hängt die Härtungsbewertung an die Text-/Markdown-Berichte an.
Siehe docs/usage.md für die vollständige CLI, Details zu den Ausgabemodi, den Erklärungsmodus und die Härtungsbewertung.
Perspektive
Was KASLD rekonstruieren kann, hängt von der Perspektive des laufenden Prozesses ab — nicht von einer einzelnen Privilegienstufe, sondern von der Kombination dreier unabhängiger Dinge: