
kasld v0.4.0
KASLD derandomizza il layout della memoria virtuale e fisica del kernel Linux da un processo locale, utilizzando tutto ciò che il suo punto di osservazione — privilegi, configurazione e confinamento — consente.
KASLD recupera il layout della memoria virtuale e fisica del kernel Linux — principalmente la base del testo del kernel — da un processo locale, usando tanto quanto la posizione privilegiata del processo consente: i suoi privilegi e capacità, la configurazione del sistema e qualsiasi confinamento in container. Recupera direttamente la base del testo del kernel dove una fuga o un canale laterale lo consente, e altrimenti la restringe al più piccolo insieme di posizionamenti supportati dalle prove disponibili. Il motore di inferenza fonde le prove provenienti da dozzine di tecniche indipendenti con le invarianti note dell'architettura, restringendo il posizionamento del kernel a una finestra residua — riportata come numero di slot sopravvissuti e bit di entropia: un limite superiore alla protezione che KASLR conserva da questa posizione, non una garanzia che la base sia fuori dalla portata di un attaccante (vedi docs/limitations.md). Su un kernel moderno completamente aggiornato — dove i canali laterali x86-64 sono mitigati e nessuna fuga diretta del testo del kernel sopravvive — il recupero completo è spesso impossibile, ma l'insieme dei vincoli è raramente vuoto. Su architetture senza KASLR, il motore individua l'indirizzo di caricamento scelto dal bootloader.
Supporta:
- x86 (i386+, amd64)
- ARM (armv6, armv7, armv8, aarch64)
- MIPS (mipsbe, mipsel, mips64el)
- PowerPC (ppc, ppcle, ppc64, ppc64le)
- RISC-V (riscv32, riscv64)
- LoongArch (loongarch64)
- s390
Avvio rapido
sudo apt install libc-dev make gcc binutils git
git clone https://github.com/bcoles/kasld
cd kasld
make
./build/<arch>/kasld
La directory build/<arch>/ è autonoma e può essere distribuita su un
sistema di destinazione:
build/<arch>/
kasld <- eseguire questo
components/ <- componenti di leak
Una configurazione rafforzata (kernel.dmesg_restrict=1,
kernel.kptr_restrict=1, kernel.perf_event_paranoid=2 o superiore,
kernel.unprivileged_bpf_disabled=1) restringe il percorso dell'oracolo
del filesystem, ma è solo un asse della posizione privilegiata: le tecniche
basate su canali laterali, entropia debole e capacità concesse sono
indipendenti da questi sysctl. Per i test, lo script
extra/weaken-kernel-hardening
può allentare temporaneamente queste impostazioni (richiede root).
Esempio di output
La modalità testo predefinita stampa una panoramica con la risposta in primo piano:
KASLD 0.3.1-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 505 2 MiB
Virtual Image Base likely 0xffffffff93400000 slide +0x12400000 1 of 483 2 MiB
Physical Image Base guaranteed 0x1000000 - 0x3d400000 474 of 8185 2 MiB
Physical Image Base likely 0x1000000 - 0x3c29d000 474 of 474 2 MiB
Direct Map Base guaranteed 0xffff800000000000 - 0xffffa4aa80000000 37547 1 GiB
Vmalloc Base guaranteed 0xffff898000000000 - 0xffffd6d580000000 79191 of 79191 1 GiB
Vmemmap Base guaranteed 0xffffa98040000000 - 0xfffffd0000000000 85504 1 GiB
Module Region Base guaranteed 0xffffffffa0000000 - 0xffffffffff000000 389121 4 KiB
Module Region Base likely 0xffffffffc0000000 - 0xffffffffc0400000 1025 of 389121 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]
-v aggiunge la lettura dettagliata completa (banner, blocco di
configurazione del sistema, log per componente, analisi KASLR, mappe del
layout di memoria). -j emette JSON leggibile dalla macchina — la vista
strutturata completa, che include sempre i record per componente e la
valutazione del rafforzamento. -1 emette una singola riga utilizzabile in
pipe shell. -m formatta per i sistemi di tracciamento delle issue. -H
aggiunge la valutazione del rafforzamento ai report in testo/markdown.
Vedi docs/usage.md per la CLI completa, i dettagli delle modalità di output, la modalità explain e la valutazione del rafforzamento.
Posizione privilegiata
Ciò che KASLD può recuperare dipende dalla posizione privilegiata del processo in esecuzione — non da un singolo livello di privilegio, ma dalla combinazione di tre cose indipendenti:
- Privilegi, gruppi e capacità — un uid non privilegiato, l'appartenenza
a un gruppo come
adm(che concede i log del kernel sotto/var/log/), un task in container che detiene una capacità extra, o root. Questi non formano una singola scala, perché i permessi del filesystem controllano ciascuna fonte in modo indipendente: un container a cui è concessaCAP_SYS_RAWIOè root nell'init namespace per quel controllo e può leggere/proc/kcore— una fuga che un utente ordinario non può raggiungere — mentre le distribuzioni differiscono sul fatto che un file come/boot/System.mapsia leggibile da tutti o meno. - Configurazione del sistema —
kptr_restrict,dmesg_restrict,perf_event_paranoid, BPF non privilegiato, kernel lockdown. La configurazione è indipendente dal privilegio: root non può leggere/proc/kallsymsconkptr_restrict=2, mentre un sysctl allentato o BPF non privilegiato può fornire a un utente semplice una fuga che un sistema rafforzato negherebbe. - Confinamento — un namespace o una sandbox seccomp che maschera gli
oracoli di
/proco blocca le syscall, restringendo ciò che qualsiasi livello di privilegio osserva.
I tre assi controllano ciascuna fonte di fuga in modo indipendente — quindi più privilegio non è un sovrainsieme di meno: la configurazione può negare una fonte a root, e i canali laterali aggirano completamente i sysctl. docs/usage.md contiene una matrice fonte-di-fuga per controllo che mostra quale asse controlla ciascuna fonte.
KASLD assume pochi privilegi per impostazione predefinita e sfrutta
opportunisticamente ciò che la posizione privilegiata concede. La finestra
garantita riportata non dipende mai dal privilegio: un accesso elevato o una
configurazione debole possono ampliare ciò che viene tentato, mai il layout
solido che le prove dimostrano. Gli output dettagliato (-v), JSON (-j) e
Markdown (-m) riportano la posizione privilegiata rilevata — container,
confinamento, oracoli leggibili e le fughe controllate da capacità raggiungibili
dalle capacità correnti.
Documentazione
Nuovo a KASLD? Leggi in ordine: docs/kaslr.md (cos'è KASLR e cosa randomizza) → docs/architecture.md → A leak from end to end (come KASLD trasforma una fuga in una risposta) → docs/limitations.md (cosa dimostra e cosa non dimostra un risultato) → CONTRIBUTING.md (aggiungere un componente di fuga o una regola di inferenza). La tabella seguente indicizza i documenti per argomento.
| Argomento | Documento |
|---|---|
| Introduzione a KASLR | docs/kaslr.md — storia di KASLR per architettura, base del testo predefinita, vmsplit, FG-KASLR |
| Utilizzo e CLI | docs/usage.md — CLI, modalità di output, modalità explain, valutazione del rafforzamento |
| Interpretare i risultati | docs/limitations.md — cosa significa un risultato negativo o parziale: solido ma non completo, e perché un fallimento non è una garanzia di sicurezza |
| Tecniche di bypass | docs/bypass-techniques.md — fughe dal filesystem, canali laterali, fughe da syscall / ioctl, entropia debole, CVE corrette, lettura arbitraria |
| Sfruttamento | docs/exploitation.md — dove si colloca il superamento di KASLR in un exploit, control-flow vs data-only, template pwntools, ksymoff |
| Impronta e rilevamento | docs/footprint.md — come appare un'esecuzione su un host monitorato: la firma comportamentale per rilevarla e il costo OPSEC per l'operatore; rumoroso per progettazione |
| Utilità | extra/README.md — gli script di supporto in extra/ (capture/replay, validazione di solidità, posture-diff, ksymoff) e come si combinano |
| Architettura e interni | docs/architecture.md — il motore di inferenza, le giunture del flusso di dati, il protocollo a righe etichettate, la derivazione tra regioni |
| Contribuire | CONTRIBUTING.md — scrivere un componente o una regola, API dell'emitter, codici di uscita, metadati |
| Test e CI | docs/testing.md — test sull'host, fixture di replay, cross-arch sotto qemu-user, copertura |
| Riproducibilità | docs/reproducibility.md — verifica indipendente: sul kernel locale, dal vivo su architetture diverse o sul corpus catturato |
Compilazione
È richiesto un compilatore che supporti la macro _GNU_SOURCE a causa
dell'uso di codice non portabile (MAP_ANONYMOUS, getline(), popen(), …).
make # build kasld + components
make run # build and run
make test # build and run unit tests
make cross # cross-compile for all supported architectures
make install # install to /usr/local (PREFIX=/usr/local)
make installcheck # smoke-test the installed bin/kasld + libexec/kasld/
make uninstall # remove installed files
make clean # remove build directory
make print-deps # list build dependencies (libs + per-component flags)
make help # show all targets and options
make print-deps riporta il toolchain richiesto, le due librerie opzionali
(pthread, zlib) con il loro risultato di rilevamento automatico per il
compilatore corrente, e le eccezioni ai flag di compilazione/link per
componente — abbastanza per popolare il file di controllo di un pacchetto di
distribuzione senza leggere la logica di rilevamento del Makefile.
make installcheck esegue il bin/kasld installato e conferma che scopra i
suoi componenti tramite il percorso FHS ../libexec/kasld — uno smoke test
post-installazione per il layout di installazione separata, usando gli stessi
PREFIX/DESTDIR di make install (quindi funziona anche contro una root di
staging DESTDIR nella CI dei pacchetti).
make install installa anche le pagine di manuale man1 per kasld e
ksymoff in <prefix>/share/man/man1/, così man kasld e man ksymoff
funzionano dopo l'installazione.
KASLD può essere compilato in cross-compilazione con make specificando il
compilatore appropriato (CC). Il linking statico viene applicato
automaticamente durante la cross-compilazione:
make CC=aarch64-linux-musl-gcc
Compila tutti i target di cross-compilazione supportati (i toolchain devono
essere nel PATH):
make cross
Licenza
KASLD è distribuito con licenza MIT (vedi LICENSE). Alcuni componenti di fuga adattano codice proof-of-concept di terze parti o implementano una tecnica pubblicata per la prima volta da altri; ciascuno di tali file accredita il suo autore e la sua fonte originale nell'intestazione, e THIRD-PARTY-NOTICES.md li elenca ciascuno con la relativa licenza o base di riutilizzo (licenza upstream, permesso dell'autore o materiale di tecnica/riproduttore reimplementato qui).
Citare KASLD
KASLD è distribuito con licenza MIT — l'attribuzione non è richiesta per l'uso, ma una citazione o un link è apprezzata ovunque venga referenziato in ricerche, strumenti, exploit o scritti:
KASLD: Kernel Address Space Layout Derandomization, Brendan Coles, https://github.com/bcoles/kasld
BibTeX:
@software{kasld,
title = {KASLD: Kernel Address Space Layout Derandomization},
author = {Coles, Brendan},
url = {https://github.com/bcoles/kasld},
version = {0.3.0},
year = {2026}
}
GitHub mostra anche un pulsante "Cite this repository" da
CITATION.cff. Per una build non rilasciata da master, cita il
commit specifico e la data di accesso — ad esempio bcoles/kasld@<commit>
(accessed YYYY-MM-DD) — poiché le stringhe di versione -dev non sono uniche
per un singolo commit.