Retour aux mises à jour
New releaseSep 12, 2026

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.

Partager

Logo KASLD généré avec Copilot (recadré)

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

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 de CAP_SYS_RAWIO est 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.map soit lisible par tous ou non.
  • Configuration systèmekptr_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/kallsyms sous kptr_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 /proc ou 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.

SujetDocument
Introduction à KASLRdocs/kaslr.md — historique de KASLR par architecture, base de texte par défaut, vmsplit, FG-KASLR
Utilisation et CLIdocs/usage.md — CLI, modes de sortie, mode explicatif, évaluation du durcissement
Interprétation des résultatsdocs/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 contournementdocs/bypass-techniques.md — fuites du système de fichiers, canaux auxiliaires, fuites par appel système / ioctl, entropie faible, CVE corrigées, lecture arbitraire
Exploitationdocs/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étectiondocs/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
Utilitairesextra/README.md — les scripts auxiliaires de extra/ (capture/rejeu, validation de solidité, diff de posture, ksymoff) et comment ils se combinent
Architecture et internesdocs/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
ContributionCONTRIBUTING.md — écrire un composant ou une règle, API d'émission, codes de sortie, métadonnées
Tests et CIdocs/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.

Catégories