
kasld v0.4.0
KASLD desaleatoriza la disposición de la memoria virtual y física del kernel de Linux desde un proceso local, utilizando lo que su ventaja —privilegio, configuración y confinamiento— le permita.
KASLD recupera el diseño de memoria virtual y física del kernel de Linux — principalmente la base del texto del kernel — desde un proceso local, usando tanto como la posición del proceso lo permita: sus privilegios y capacidades, la configuración del sistema y cualquier confinamiento de contenedor. Recupera la base del texto del kernel directamente cuando una fuga o canal lateral lo permite, y en caso contrario la reduce al conjunto más pequeño de ubicaciones que la evidencia disponible respalda. El motor de inferencia fusiona evidencia de docenas de técnicas independientes con las invariantes conocidas de la arquitectura, reduciendo la ubicación del kernel a una ventana residual — reportada como el número de ranuras supervivientes y bits de entropía: un límite superior de la protección que KASLR conserva desde esta posición, no una garantía de que la base esté fuera del alcance de un atacante (véase docs/limitations.md). En un kernel moderno totalmente parcheado — donde los canales laterales de x86-64 están mitigados y no sobrevive ninguna fuga directa del texto del kernel — la recuperación completa a menudo es imposible, pero el conjunto de restricciones rara vez está vacío. En arquitecturas sin KASLR, el motor localiza la dirección de carga elegida por el gestor de arranque.
Compatible con:
- x86 (i386+, amd64)
- ARM (armv6, armv7, armv8, aarch64)
- MIPS (mipsbe, mipsel, mips64el)
- PowerPC (ppc, ppcle, ppc64, ppc64le)
- RISC-V (riscv32, riscv64)
- LoongArch (loongarch64)
- s390
Inicio rápido
sudo apt install libc-dev make gcc binutils git
git clone https://github.com/bcoles/kasld
cd kasld
make
./build/<arch>/kasld
El directorio build/<arch>/ es autocontenido y puede desplegarse en un
sistema objetivo:
build/<arch>/
kasld <- ejecutar esto
components/ <- componentes de fuga
Una configuración endurecida (kernel.dmesg_restrict=1,
kernel.kptr_restrict=1, kernel.perf_event_paranoid=2 o superior,
kernel.unprivileged_bpf_disabled=1) reduce la ruta del oráculo del sistema
de archivos, pero es solo un eje de la posición: las técnicas de canal
lateral, entropía débil y las otorgadas por capacidades son independientes de
estos sysctls. Para pruebas, el script
extra/weaken-kernel-hardening puede relajar
temporalmente estos ajustes (requiere root).
Ejemplo de salida
El modo de texto predeterminado imprime una visión general con la respuesta primero:
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 añade la lectura detallada completa (banner, bloque de configuración del
sistema, registros por componente, análisis de KASLR, mapas de diseño de
memoria). -j emite JSON legible por máquina — la vista estructurada completa,
incluyendo siempre los registros por componente y la evaluación de
endurecimiento. -1 emite una sola línea canalizable por shell. -m formatea
para rastreadores de incidencias. -H añade la evaluación de endurecimiento a
los informes de texto/markdown.
Véase docs/usage.md para la CLI completa, detalles de los modos de salida, modo explicativo y evaluación de endurecimiento.
Posición
Lo que KASLD puede recuperar depende de la posición del proceso en ejecución — no de un único nivel de privilegio, sino de la combinación de tres cosas independientes:
- Privilegios, grupos y capacidades — un uid sin privilegios, pertenencia
a un grupo como
adm(que otorga los registros del kernel bajo/var/log/), una tarea de contenedor con una capacidad extra, o root. Estos no forman una única escala, porque los permisos del sistema de archivos controlan cada fuente de forma independiente: un contenedor al que se le otorgaCAP_SYS_RAWIOes root del espacio de nombres init para esa comprobación y puede leer/proc/kcore— una fuga que un usuario ordinario no puede alcanzar — mientras que las distribuciones difieren sobre si un archivo como/boot/System.mapes legible por todos. - Configuración del sistema —
kptr_restrict,dmesg_restrict,perf_event_paranoid, BPF sin privilegios, bloqueo del kernel. La configuración es independiente del privilegio: root no puede leer/proc/kallsymsbajokptr_restrict=2, mientras que un sysctl relajado o BPF sin privilegios puede entregar a un usuario común una fuga que un sistema endurecido denegaría. - Confinamiento — un espacio de nombres o sandbox seccomp que enmascara
los oráculos de
/proco bloquea llamadas al sistema, reduciendo lo que observa cualquier nivel de privilegio.
Los tres ejes controlan cada fuente de fuga de forma independiente — por lo que más privilegio no es un superconjunto de menos: la configuración puede denegar una fuente a root, y los canales laterales eluden los sysctls por completo. docs/usage.md tiene una matriz de fuente-de-fuga-por-control que muestra qué eje controla cada fuente.
KASLD asume pocos privilegios por defecto y aprovecha oportunistamente lo que
la posición otorgue. La ventana garantizada reportada nunca depende del
privilegio: el acceso elevado o una configuración débil pueden ampliar lo que
se intenta, nunca el diseño sólido que la evidencia demuestra. Las salidas
detallada (-v), JSON (-j) y Markdown (-m) reportan la posición detectada
— contenedor, confinamiento, oráculos legibles y las fugas controladas por
capacidades alcanzables desde las capacidades actuales.
Documentación
¿Nuevo en KASLD? Lea en orden: docs/kaslr.md (qué es KASLR y qué aleatoriza) → docs/architecture.md → A leak from end to end (cómo KASLD convierte una fuga en una respuesta) → docs/limitations.md (qué prueba y qué no prueba un resultado) → CONTRIBUTING.md (añadir un componente de fuga o una regla de inferencia). La tabla siguiente indexa la documentación por tema.
| Tema | Documento |
|---|---|
| Introducción a KASLR | docs/kaslr.md — historial de KASLR por arquitectura, base de texto predeterminada, vmsplit, FG-KASLR |
| Uso y CLI | docs/usage.md — CLI, modos de salida, modo explicativo, evaluación de endurecimiento |
| Interpretación de resultados | docs/limitations.md — qué significa un resultado negativo o parcial: sólido pero no completo, y por qué un fallo no es una garantía de seguridad |
| Técnicas de elusión | docs/bypass-techniques.md — fugas del sistema de archivos, canales laterales, fugas de syscall / ioctl, entropía débil, CVE parcheados, lectura arbitraria |
| Explotación | docs/exploitation.md — dónde encaja la derrota de KASLR en un exploit, control de flujo vs solo datos, plantilla de pwntools, ksymoff |
| Huella y detección | docs/footprint.md — cómo se ve una ejecución en un host monitorizado: la firma de comportamiento para detectarla, y el coste OPSEC del operador; ruidoso por diseño |
| Utilidades | extra/README.md — los scripts auxiliares de extra/ (captura/reproducción, validación de solidez, diff de postura, ksymoff) y cómo se combinan |
| Arquitectura e internos | docs/architecture.md — el motor de inferencia, las costuras de flujo de datos, el protocolo de líneas etiquetadas, la derivación entre regiones |
| Contribuir | CONTRIBUTING.md — escribir un componente o regla, API del emisor, códigos de salida, metadatos |
| Pruebas y CI | docs/testing.md — pruebas en host, fixtures de reproducción, multiplataforma bajo qemu-user, cobertura |
| Reproducibilidad | docs/reproducibility.md — verificación independiente: en el kernel local, en vivo entre arquitecturas, o sobre el corpus capturado |
Compilación
Se requiere un compilador que soporte la macro _GNU_SOURCE debido al uso de
código no 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 informa del conjunto de herramientas requerido, las dos
bibliotecas opcionales (pthread, zlib) con su resultado de detección
automática para el compilador actual, y las excepciones de flags de
compilación/enlazado por componente — suficiente para rellenar el archivo de
control de un paquete de distribución sin leer la lógica de sondeo del
Makefile.
make installcheck ejecuta el bin/kasld instalado y confirma que descubre
sus componentes a través de la ruta FHS ../libexec/kasld — una prueba de
humo posterior a la instalación para el diseño de instalación dividida, usando
el mismo PREFIX/DESTDIR que make install (por lo que también funciona
contra una raíz de preparación DESTDIR en CI de paquetes).
make install también instala las páginas de manual man1 para kasld y
ksymoff en <prefix>/share/man/man1/, de modo que man kasld y
man ksymoff funcionan tras la instalación.
KASLD puede compilarse de forma cruzada con make especificando el compilador
adecuado (CC). El enlazado estático se aplica automáticamente al compilar de
forma cruzada:
make CC=aarch64-linux-musl-gcc
Compilar todos los objetivos de compilación cruzada soportados (los conjuntos
de herramientas deben estar en PATH):
make cross
Licencia
KASLD tiene licencia MIT (véase LICENSE). Algunos componentes de fuga adaptan código de prueba de concepto de terceros o implementan una técnica publicada por primera vez por otros; cada uno de estos archivos acredita a su autor y fuente originales en su cabecera, y THIRD-PARTY-NOTICES.md enumera cada uno con su licencia o base de reutilización (licencia upstream, permiso del autor, o material de técnica/reproductor reimplementado aquí).
Citar KASLD
KASLD tiene licencia MIT — no se requiere atribución para su uso, pero se agradece una cita o enlace siempre que se haga referencia a él en investigación, herramientas, exploits o escritos:
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 también muestra un botón "Cite this repository" a partir de
CITATION.cff. Para una compilación no publicada de master,
cite el commit específico y la fecha de acceso — por ejemplo
bcoles/kasld@<commit> (accedido YYYY-MM-DD) — ya que las cadenas de versión
-dev no son únicas para un solo commit.