Torna agli aggiornamenti
New releaseSep 12, 2026

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.

Condividi

KASLD logo generato con Copilot (ritagliato)

Build Status CodeQL Platform: Linux Architectures C99 Release License: MIT

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 è concessa CAP_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.map sia leggibile da tutti o meno.
  • Configurazione del sistemakptr_restrict, dmesg_restrict, perf_event_paranoid, BPF non privilegiato, kernel lockdown. La configurazione è indipendente dal privilegio: root non può leggere /proc/kallsyms con kptr_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 /proc o 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.

ArgomentoDocumento
Introduzione a KASLRdocs/kaslr.md — storia di KASLR per architettura, base del testo predefinita, vmsplit, FG-KASLR
Utilizzo e CLIdocs/usage.md — CLI, modalità di output, modalità explain, valutazione del rafforzamento
Interpretare i risultatidocs/limitations.md — cosa significa un risultato negativo o parziale: solido ma non completo, e perché un fallimento non è una garanzia di sicurezza
Tecniche di bypassdocs/bypass-techniques.md — fughe dal filesystem, canali laterali, fughe da syscall / ioctl, entropia debole, CVE corrette, lettura arbitraria
Sfruttamentodocs/exploitation.md — dove si colloca il superamento di KASLR in un exploit, control-flow vs data-only, template pwntools, ksymoff
Impronta e rilevamentodocs/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 internidocs/architecture.md — il motore di inferenza, le giunture del flusso di dati, il protocollo a righe etichettate, la derivazione tra regioni
ContribuireCONTRIBUTING.md — scrivere un componente o una regola, API dell'emitter, codici di uscita, metadati
Test e CIdocs/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.

Categorie