Volver a actualizaciones
Nuevo releaseSep 12, 2026

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.

Compartir

Logotipo de KASLD generado con Copilot (recortado)

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

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 otorga CAP_SYS_RAWIO es 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.map es legible por todos.
  • Configuración del sistemakptr_restrict, dmesg_restrict, perf_event_paranoid, BPF sin privilegios, bloqueo del kernel. La configuración es independiente del privilegio: root no puede leer /proc/kallsyms bajo kptr_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 /proc o 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.

TemaDocumento
Introducción a KASLRdocs/kaslr.md — historial de KASLR por arquitectura, base de texto predeterminada, vmsplit, FG-KASLR
Uso y CLIdocs/usage.md — CLI, modos de salida, modo explicativo, evaluación de endurecimiento
Interpretación de resultadosdocs/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óndocs/bypass-techniques.md — fugas del sistema de archivos, canales laterales, fugas de syscall / ioctl, entropía débil, CVE parcheados, lectura arbitraria
Explotacióndocs/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óndocs/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
Utilidadesextra/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 internosdocs/architecture.md — el motor de inferencia, las costuras de flujo de datos, el protocolo de líneas etiquetadas, la derivación entre regiones
ContribuirCONTRIBUTING.md — escribir un componente o regla, API del emisor, códigos de salida, metadatos
Pruebas y CIdocs/testing.md — pruebas en host, fixtures de reproducción, multiplataforma bajo qemu-user, cobertura
Reproducibilidaddocs/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.

Categorías