
kasld v0.4.0
O KASLD remove a aleatoriedade do layout de memória virtual e física do kernel Linux a partir de um processo local, usando o que sua posição — privilégio, configuração e confinamento — permite.
O KASLD recupera o layout de memória virtual e física do kernel Linux — principalmente a base do texto do kernel — a partir de um processo local, usando o máximo que a vantagem do processo permite: seus privilégios e capacidades, a configuração do sistema e qualquer confinamento de contêiner. Ele recupera a base do texto do kernel diretamente onde um vazamento ou canal lateral o permite e, caso contrário, a restringe ao menor conjunto de posicionamentos que as evidências disponíveis sustentam. O motor de inferência funde evidências de dezenas de técnicas independentes com as invariantes conhecidas da arquitetura, restringindo o posicionamento do kernel a uma janela residual — reportada como a contagem de slots sobreviventes e bits de entropia: um limite superior da proteção que o KASLR retém a partir desta vantagem, não uma garantia de que a base está fora do alcance de um atacante (consulte docs/limitations.md). Em um kernel moderno totalmente corrigido — onde os canais laterais do x86-64 são mitigados e nenhum vazamento direto do texto do kernel sobrevive — a recuperação completa geralmente é impossível, mas o conjunto de restrições raramente é vazio. Em arquiteturas sem KASLR, o motor localiza o endereço de carga escolhido pelo bootloader.
Suporta:
- x86 (i386+, amd64)
- ARM (armv6, armv7, armv8, aarch64)
- MIPS (mipsbe, mipsel, mips64el)
- PowerPC (ppc, ppcle, ppc64, ppc64le)
- RISC-V (riscv32, riscv64)
- LoongArch (loongarch64)
- s390
Início rápido
sudo apt install libc-dev make gcc binutils git
git clone https://github.com/bcoles/kasld
cd kasld
make
./build/<arch>/kasld
O diretório build/<arch>/ é autocontido e pode ser implantado em um
sistema alvo:
build/<arch>/
kasld <- execute isto
components/ <- componentes de vazamento
Uma configuração reforçada (kernel.dmesg_restrict=1,
kernel.kptr_restrict=1, kernel.perf_event_paranoid=2 ou superior,
kernel.unprivileged_bpf_disabled=1) restringe o caminho do oráculo do
sistema de arquivos, mas é apenas um eixo da vantagem: técnicas de canal
lateral, de entropia fraca e concedidas por capacidade são independentes
desses sysctls. Para testes, o script
extra/weaken-kernel-hardening pode relaxar
temporariamente essas configurações (requer root).
Exemplo de saída
O modo de texto padrão imprime uma visão geral com a resposta em primeiro lugar:
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 adiciona a leitura detalhada completa (banner, bloco de configuração do
sistema, logs por componente, análise do KASLR, mapas de layout de memória).
-j emite JSON legível por máquina — a visão estruturada completa, sempre
incluindo os registros por componente e a avaliação de reforço. -1 emite uma
única linha canalizável para shell. -m formata para rastreadores de issues.
-H anexa a avaliação de reforço aos relatórios em texto/markdown.
Consulte docs/usage.md para a CLI completa, detalhes dos modos de saída, modo de explicação e avaliação de reforço.
Vantagem
O que o KASLD consegue recuperar depende da vantagem do processo em execução — não de um único nível de privilégio, mas da combinação de três coisas independentes:
- Privilégios, grupos e capacidades — um uid sem privilégios, a
participação em um grupo como
adm(que concede os logs do kernel em/var/log/), uma tarefa de contêiner com uma capacidade extra, ou root. Estes não formam uma única escada, porque as permissões do sistema de arquivos controlam cada fonte de forma independente: um contêiner comCAP_SYS_RAWIOé root do namespace de init para essa verificação e pode ler/proc/kcore— um vazamento que um usuário comum não consegue alcançar — enquanto as distribuições divergem sobre se um arquivo como/boot/System.mapé legível por todos. - Configuração do sistema —
kptr_restrict,dmesg_restrict,perf_event_paranoid, BPF sem privilégios, lockdown do kernel. A configuração é independente do privilégio: root não consegue ler/proc/kallsymssobkptr_restrict=2, enquanto um sysctl relaxado ou BPF sem privilégios pode entregar a um usuário comum um vazamento que um sistema reforçado negaria. - Confinamento — um namespace ou sandbox seccomp que mascara os oráculos
de
/procou bloqueia syscalls, restringindo o que qualquer nível de privilégio observa.
Os três eixos controlam cada fonte de vazamento de forma independente — então mais privilégio não é um superconjunto de menos: a configuração pode negar uma fonte ao root, e os canais laterais contornam os sysctls inteiramente. docs/usage.md tem uma matriz de fonte-de-vazamento por barreira mostrando qual eixo controla cada fonte.
O KASLD assume poucos privilégios por padrão e usa oportunisticamente o que a
vantagem concede. A janela garantida reportada nunca depende de privilégio:
acesso elevado ou uma configuração fraca pode ampliar o que é tentado, nunca
o layout sólido que as evidências provam. As saídas detalhada (-v), JSON
(-j) e Markdown (-m) reportam a vantagem detectada — contêiner,
confinamento, oráculos legíveis e os vazamentos controlados por capacidade
alcançáveis a partir das capacidades atuais.
Documentação
Novo no KASLD? Leia em ordem: docs/kaslr.md (o que é o KASLR e o que ele randomiza) → docs/architecture.md → Um vazamento de ponta a ponta (como o KASLD transforma um vazamento em uma resposta) → docs/limitations.md (o que um resultado prova e não prova) → CONTRIBUTING.md (adicionar um componente de vazamento ou regra de inferência). A tabela abaixo indexa a documentação por tópico.
| Tópico | Documento |
|---|---|
| Introdução ao KASLR | docs/kaslr.md — histórico do KASLR por arquitetura, base de texto padrão, vmsplit, FG-KASLR |
| Uso e CLI | docs/usage.md — CLI, modos de saída, modo de explicação, avaliação de reforço |
| Interpretação de resultados | docs/limitations.md — o que significa um resultado negativo ou parcial: sólido mas não completo, e por que uma falha não é uma garantia de segurança |
| Técnicas de contorno | docs/bypass-techniques.md — vazamentos do sistema de arquivos, canais laterais, vazamentos de syscall / ioctl, entropia fraca, CVEs corrigidas, leitura arbitrária |
| Exploração | docs/exploitation.md — onde a derrota do KASLR se encaixa em um exploit, fluxo de controle vs somente dados, template pwntools, ksymoff |
| Pegada e detecção | docs/footprint.md — como uma execução se parece em um host monitorado: a assinatura comportamental para detectá-la, e o custo de OPSEC do operador; ruidoso por design |
| Utilitários | extra/README.md — os scripts auxiliares em extra/ (captura/replay, validação de solidez, diff de postura, ksymoff) e como se combinam |
| Arquitetura e internos | docs/architecture.md — o motor de inferência, costuras de fluxo de dados, protocolo de linhas marcadas, derivação entre regiões |
| Contribuição | CONTRIBUTING.md — escrever um componente ou regra, API do emitter, códigos de saída, metadados |
| Testes e CI | docs/testing.md — testes no host, fixtures de replay, cross-arch sob qemu-user, cobertura |
| Reprodutibilidade | docs/reproducibility.md — verificação independente: no kernel local, ao vivo entre arquiteturas, ou sobre o corpus capturado |
Compilação
É necessário um compilador que suporte a macro _GNU_SOURCE devido ao uso de
código não portável (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 reporta o toolchain necessário, as duas bibliotecas opcionais
(pthread, zlib) com seu resultado de detecção automática para o compilador
atual, e as exceções de flags de compilação/ligação por componente — o
suficiente para preencher o arquivo de controle de um pacote de distribuição
sem ler a lógica de sondagem do Makefile.
make installcheck executa o bin/kasld instalado e confirma que ele descobre
seus componentes via o caminho FHS ../libexec/kasld — um teste de fumaça
pós-instalação para o layout de instalação dividida, usando o mesmo
PREFIX/DESTDIR que make install (portanto também funciona contra uma raiz
de preparação DESTDIR em CI de pacotes).
make install também instala páginas de manual man1 para kasld e ksymoff
em <prefix>/share/man/man1/, para que man kasld e man ksymoff funcionem
após a instalação.
O KASLD pode ser compilado cruzado com make especificando o compilador
apropriado (CC). A ligação estática é aplicada automaticamente ao compilar
cruzado:
make CC=aarch64-linux-musl-gcc
Compilar todos os alvos de compilação cruzada suportados (os toolchains devem
estar no PATH):
make cross
Licença
O KASLD é licenciado sob MIT (consulte LICENSE). Alguns componentes de vazamento adaptam código de prova de conceito de terceiros ou implementam uma técnica publicada pela primeira vez por outros; cada arquivo desse tipo credita seu autor e fonte originais em seu cabeçalho, e THIRD-PARTY-NOTICES.md lista cada um com sua licença ou base de reutilização (licença upstream, permissão do autor, ou material de técnica/reprodutor reimplementado aqui).
Citar o KASLD
O KASLD é licenciado sob MIT — a atribuição não é exigida para uso, mas uma citação ou link é apreciada onde quer que seja referenciado em pesquisa, ferramentas, exploits ou textos:
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}
}
O GitHub também mostra um botão "Cite this repository" a partir de
CITATION.cff. Para uma compilação não lançada do master,
cite o commit específico e a data de acesso — por exemplo, bcoles/kasld@<commit>
(acessado em AAAA-MM-DD) — já que strings de versão -dev não são únicas para
um único commit.