
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. O que ele consegue recuperar é função do ponto de observação desse processo: seus privilégios e capacidades, a configuração do sistema e qualquer confinamento de container. Ele recupera a base de forma direta 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 o número de slots sobreviventes (os posicionamentos que o KASLR poderia ter escolhido) e os bits de entropia que eles representam: um limite superior da proteção que o KASLR mantém a partir desse ponto de observação, não uma garantia de que a base está fora do alcance de um atacante (veja docs/limitations.md).
A recuperação completa geralmente é impossível em um alvo endurecido — um onde nenhum vazamento direto do texto do kernel sobrevive e os canais laterais que sua arquitetura e CPU expõem estão fechados — mas o conjunto de restrições raramente é vazio. Em arquiteturas sem KASLR, o motor localiza o endereço de carregamento escolhido pelo bootloader.
Suporta:
- x86 (i386+, amd64)
- ARM (armv6, armv7, armv8, aarch64)
- MIPS (mipsbe, mipsel, mips64, 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 endurecida (kernel.dmesg_restrict=1,
kernel.kptr_restrict=1, kernel.perf_event_paranoid=2 ou superior,
kernel.unprivileged_bpf_disabled=1 e hashing de ponteiros %pK) restringe o
caminho do oráculo do sistema de arquivos, mas é apenas um eixo do ponto de
observação: técnicas de canal lateral, de entropia fraca e concedidas por
capacidades 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.4.2-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 512 2 MiB
Virtual Image Base likely 0xffffffff93400000 slide +0x12400000 1 2 MiB
Physical Image Base guaranteed 0x1000000 - 0x3d400000 474 2 MiB
Physical Image Base likely 0x1000000 - 0x3c29d000 474 2 MiB
Direct Map Base guaranteed 0xffff800000000000 - 0xffffa4aa80000000 37,547 1 GiB
Vmalloc Base guaranteed 0xffff898000000000 - 0xffffd6d580000000 79,191 of 79,191 1 GiB
Vmemmap Base guaranteed 0xffffa98040000000 - 0xfffffd0000000000 85,504 1 GiB
Module Region Base guaranteed 0xffffffffa0000000 - 0xffffffffff000000 389,121 4 KiB
Module Region Base likely 0xffffffffc0000000 - 0xffffffffc0400000 1,025 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]
A coluna Certainty separa duas afirmações diferentes sobre a mesma
quantidade. Uma linha guaranteed é provada: o valor verdadeiro está dentro
dessa janela. Uma linha likely é a melhor estimativa única que as
evidências sustentam — sempre um subconjunto da janela garantida, e pode estar
errada, pois se baseia em sinais abaixo do piso de solidez, como canais
laterais de temporização. Um resultado que vale a pena usar diretamente é uma
linha guaranteed reduzida a um único candidato; um valor likely é uma pista
a confirmar, não um fato em que confiar.
-v adiciona a leitura verbosa completa (banner, bloco de configuração do
sistema, logs por componente, análise de 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 endurecimento. -1
emite uma única linha canalizável para shell. -m formata para rastreadores de
issues. -H anexa a avaliação de endurecimento aos relatórios de
texto/markdown.
Veja docs/usage.md para a CLI completa, detalhes dos modos de saída, modo explain e avaliação de endurecimento.
Ponto de observação
O que o KASLD consegue recuperar depende do ponto de observação do processo em execução — não de um único nível de privilégio, mas da combinação de três coisas independentes: