Voltar às atualizações
New releaseSep 12, 2026

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.

Compartilhar

Logotipo do KASLD gerado com Copilot (recortado)

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

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 com CAP_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 sistemakptr_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/kallsyms sob kptr_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 /proc ou 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ópicoDocumento
Introdução ao KASLRdocs/kaslr.md — histórico do KASLR por arquitetura, base de texto padrão, vmsplit, FG-KASLR
Uso e CLIdocs/usage.md — CLI, modos de saída, modo de explicação, avaliação de reforço
Interpretação de resultadosdocs/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 contornodocs/bypass-techniques.md — vazamentos do sistema de arquivos, canais laterais, vazamentos de syscall / ioctl, entropia fraca, CVEs corrigidas, leitura arbitrária
Exploraçãodocs/exploitation.md — onde a derrota do KASLR se encaixa em um exploit, fluxo de controle vs somente dados, template pwntools, ksymoff
Pegada e detecçãodocs/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áriosextra/README.md — os scripts auxiliares em extra/ (captura/replay, validação de solidez, diff de postura, ksymoff) e como se combinam
Arquitetura e internosdocs/architecture.md — o motor de inferência, costuras de fluxo de dados, protocolo de linhas marcadas, derivação entre regiões
ContribuiçãoCONTRIBUTING.md — escrever um componente ou regra, API do emitter, códigos de saída, metadados
Testes e CIdocs/testing.md — testes no host, fixtures de replay, cross-arch sob qemu-user, cobertura
Reprodutibilidadedocs/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.

Categorias