
kasld v0.4.0
KASLD dérandomise la disposition de la mémoire virtuelle et physique du noyau Linux depuis un processus local, en utilisant tout ce que son point de vue — privilège, configuration et confinement — lui permet.
KASLD reconstitue la disposition de la mémoire virtuelle et physique du noyau Linux — principalement la base du texte du noyau — depuis un processus local, en exploitant autant que le permet le point de vue du processus : ses privilèges et capacités, la configuration du système, et tout confinement de conteneur. Il reconstitue la base du texte du noyau directement lorsqu'une fuite ou un canal auxiliaire le permet, et la réduit sinon au plus petit ensemble de placements que les preuves disponibles étayent. Le moteur d'inférence fusionne les preuves issues de dizaines de techniques indépendantes avec les invariants connus de l'architecture, réduisant le placement du noyau à une fenêtre résiduelle — rapportée sous forme de nombre d'emplacements survivants et de bits d'entropie : une borne supérieure sur la protection que KASLR conserve depuis ce point de vue, et non une garantie que la base est hors de portée d'un attaquant (voir docs/limitations.md). Sur un noyau moderne entièrement corrigé — où les canaux auxiliaires x86-64 sont atténués et aucune fuite directe du texte du noyau ne subsiste — la reconstitution complète est souvent impossible, mais l'ensemble de contraintes est rarement vide. Sur les architectures sans KASLR, le moteur localise l'adresse de chargement choisie par le chargeur d'amorçage.
Prend en charge :
- x86 (i386+, amd64)
- ARM (armv6, armv7, armv8, aarch64)
- MIPS (mipsbe, mipsel, mips64el)
- PowerPC (ppc, ppcle, ppc64, ppc64le)
- RISC-V (riscv32, riscv64)
- LoongArch (loongarch64)
- s390
Démarrage rapide
sudo apt install libc-dev make gcc binutils git
git clone https://github.com/bcoles/kasld
cd kasld
make
./build/<arch>/kasld
Le répertoire build/<arch>/ est autonome et peut être déployé sur un
système cible :
build/<arch>/
kasld <- exécuter ceci
components/ <- composants de fuite
Une configuration durcie (kernel.dmesg_restrict=1,
kernel.kptr_restrict=1, kernel.perf_event_paranoid=2 ou plus,
kernel.unprivileged_bpf_disabled=1) réduit la voie des oracles du système de
fichiers, mais ne constitue qu'un seul axe du point de vue : les techniques
par canal auxiliaire, par entropie faible et par capacités accordées sont
indépendantes de ces sysctls. Pour les tests, le script
extra/weaken-kernel-hardening peut
temporairement assouplir ces réglages (nécessite root).
Exemple de sortie
Le mode texte par défaut affiche un aperçu axé sur la réponse :
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 ajoute la sortie détaillée complète (bannière, bloc de configuration
système, journaux par composant, analyse KASLR, cartes de disposition mémoire).
-j émet du JSON exploitable par machine — la vue structurée complète,
incluant toujours les enregistrements par composant et l'évaluation du
durcissement. -1 émet une seule ligne exploitable dans un pipe shell. -m
formate pour les gestionnaires de tickets. -H ajoute l'évaluation du
durcissement aux rapports texte/markdown.
Voir docs/usage.md pour l'interface en ligne de commande complète, les détails des modes de sortie, le mode explicatif et l'évaluation du durcissement.
Point de vue
Ce que KASLD peut reconstituer dépend du point de vue du processus en cours d'exécution — non pas d'un seul niveau de privilège, mais de la combinaison de trois éléments indépendants :
- Privilèges, groupes et capacités — un uid non privilégié, l'appartenance
à un groupe tel que
adm(qui donne accès aux journaux du noyau sous/var/log/), une tâche de conteneur détenant une capacité supplémentaire, ou root. Ces éléments ne forment pas une échelle unique, car les permissions du système de fichiers conditionnent chaque source indépendamment : un conteneur disposant deCAP_SYS_RAWIOest root dans le namespace d'init pour ce contrôle et peut lire/proc/kcore— une fuite qu'un utilisateur ordinaire ne peut atteindre — tandis que les distributions diffèrent sur le fait qu'un fichier tel que/boot/System.mapsoit lisible par tous ou non. - Configuration système —
kptr_restrict,dmesg_restrict,perf_event_paranoid, BPF non privilégié, verrouillage du noyau. La configuration est indépendante du privilège : root ne peut pas lire/proc/kallsymssouskptr_restrict=2, tandis qu'un sysctl assoupli ou BPF non privilégié peut fournir à un simple utilisateur une fuite qu'un système durci refuserait. - Confinement — un namespace ou un bac à sable seccomp qui masque les
oracles de
/procou bloque des appels système, réduisant ce que tout niveau de privilège observe.
Les trois axes conditionnent chaque source de fuite indépendamment — ainsi, plus de privilèges n'est pas un sur-ensemble de moins : la configuration peut refuser une source à root, et les canaux auxiliaires contournent entièrement les sysctls. docs/usage.md contient une matrice source-de-fuite-par- barrière montrant quel axe contrôle chaque source.
KASLD suppose peu de privilèges par défaut et exploite de manière opportuniste
tout ce que le point de vue accorde. La fenêtre garantie rapportée ne dépend
jamais du privilège : un accès élevé ou une configuration faible peut élargir ce
qui est tenté, jamais la disposition solide que les preuves démontrent. Les
sorties verbeuse (-v), JSON (-j) et Markdown (-m) rapportent le point de
vue détecté — conteneur, confinement, oracles lisibles, et les fuites
conditionnées par capacités accessibles depuis les capacités actuelles.
Documentation
Nouveau sur KASLD ? À lire dans l'ordre : docs/kaslr.md (ce qu'est KASLR et ce qu'il randomise) → docs/architecture.md → Une fuite de bout en bout (comment KASLD transforme une fuite en réponse) → docs/limitations.md (ce qu'un résultat prouve et ne prouve pas) → CONTRIBUTING.md (ajouter un composant de fuite ou une règle d'inférence). Le tableau ci-dessous indexe la documentation par sujet.
| Sujet | Document |
|---|---|
| Introduction à KASLR | docs/kaslr.md — historique de KASLR par architecture, base de texte par défaut, vmsplit, FG-KASLR |
| Utilisation et CLI | docs/usage.md — CLI, modes de sortie, mode explicatif, évaluation du durcissement |
| Interprétation des résultats | docs/limitations.md — ce que signifie un résultat négatif ou partiel : solide mais incomplet, et pourquoi un échec n'est pas une garantie de sécurité |
| Techniques de contournement | docs/bypass-techniques.md — fuites du système de fichiers, canaux auxiliaires, fuites par appel système / ioctl, entropie faible, CVE corrigées, lecture arbitraire |
| Exploitation | docs/exploitation.md — où la défaite de KASLR s'inscrit dans un exploit, flux de contrôle vs données seules, modèle pwntools, ksymoff |
| Empreinte et détection | docs/footprint.md — à quoi ressemble une exécution sur un hôte surveillé : la signature comportementale pour la détecter, et le coût OPSEC pour l'opérateur ; bruyant par conception |
| Utilitaires | extra/README.md — les scripts auxiliaires de extra/ (capture/rejeu, validation de solidité, diff de posture, ksymoff) et comment ils se combinent |
| Architecture et internes | docs/architecture.md — le moteur d'inférence, les jointures de flux de données, le protocole de lignes balisées, la dérivation inter-régions |
| Contribution | CONTRIBUTING.md — écrire un composant ou une règle, API d'émission, codes de sortie, métadonnées |
| Tests et CI | docs/testing.md — tests sur l'hôte, fixtures de rejeu, cross-arch sous qemu-user, couverture |
| Reproductibilité | docs/reproducibility.md — vérification indépendante : sur le noyau local, en direct sur plusieurs architectures, ou sur le corpus capturé |
Compilation
Un compilateur prenant en charge la macro _GNU_SOURCE est requis en raison
de l'utilisation de code non portable (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 rapporte la chaîne d'outils requise, les deux bibliothèques
optionnelles (pthread, zlib) avec leur résultat d'auto-détection pour le
compilateur courant, et les exceptions de drapeaux de compilation/édition de
liens par composant — assez pour renseigner le fichier de contrôle d'un paquet
de distribution sans lire la logique de sonde du Makefile.
make installcheck exécute le bin/kasld installé et confirme qu'il découvre
ses composants via le chemin FHS ../libexec/kasld — un test de fumée
post-installation pour la disposition d'installation séparée, utilisant le même
PREFIX/DESTDIR que make install (il fonctionne donc aussi contre une racine
de préparation DESTDIR en CI de paquet).
make install installe également les pages de manuel man1 pour kasld et
ksymoff dans <prefix>/share/man/man1/, de sorte que man kasld et
man ksymoff fonctionnent après l'installation.
KASLD peut être compilé de manière croisée avec make en spécifiant le
compilateur approprié (CC). L'édition de liens statique est appliquée
automatiquement lors de la compilation croisée :
make CC=aarch64-linux-musl-gcc
Compiler toutes les cibles de compilation croisée prises en charge (les chaînes
d'outils doivent être dans le PATH) :
make cross
Licence
KASLD est sous licence MIT (voir LICENSE). Certains composants de fuite adaptent du code de preuve de concept tiers ou implémentent une technique publiée initialement par d'autres ; chacun de ces fichiers crédite son auteur et sa source d'origine dans son en-tête, et THIRD-PARTY-NOTICES.md les liste chacun avec sa licence ou sa base de réutilisation (licence amont, autorisation de l'auteur, ou matériel de technique/reproduction réimplémenté ici).
Citer KASLD
KASLD est sous licence MIT — l'attribution n'est pas requise pour l'utilisation, mais une citation ou un lien est apprécié partout où il est référencé dans la recherche, l'outillage, les exploits ou les écrits :
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 affiche également un bouton « Cite this repository » à partir de
CITATION.cff. Pour une version non publiée issue de master,
citez le commit spécifique et la date d'accès — par ex. bcoles/kasld@<commit>
(consulté le AAAA-MM-JJ) — car les chaînes de version -dev ne sont pas uniques
à un seul commit.