업데이트로 돌아가기
New releaseSep 12, 2026

kasld v0.4.0

KASLD는 로컬 프로세스에서 리눅스 커널의 가상 및 물리 메모리 레이아웃을 무작위화 해제하며, 권한, 구성, 격리 등 자신이 가진 관점이 허용하는 범위 내에서 수행합니다.

공유

Copilot으로 생성한 KASLD 로고 (잘림)

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

KASLD는 로컬 프로세스로부터 Linux 커널의 가상 및 물리 메모리 레이아웃 — 주로 커널 텍스트 베이스 — 을 복원합니다. 무엇을 복원할 수 있는지는 해당 프로세스의 관점(vantage)에 따라 달라집니다. 즉, 프로세스의 권한과 capability, 시스템 구성, 그리고 컨테이너 격리 여부에 달려 있습니다. 누출이나 부채널이 허용하는 경우에는 베이스를 그대로 복원하고, 그렇지 않은 경우에는 사용 가능한 증거가 뒷받침하는 가장 작은 배치 집합으로 좁힙니다.

추론 엔진은 수십 가지 독립적인 기법의 증거를 아키텍처의 알려진 불변식과 융합하여 커널의 배치를 잔여 윈도우로 좁힙니다. 이는 살아남은 슬롯(KASLR이 선택할 수 있었던 배치)의 수와 그것이 나타내는 엔트로피 비트로 보고됩니다. 이는 이 관점에서 KASLR이 유지하는 보호의 상한이며, 베이스가 공격자의 손이 닿지 않는 곳에 있다는 보장은 아닙니다(docs/limitations.md 참조).

강화된 대상 — 직접적인 커널 텍스트 누출이 살아남지 않고 해당 아키텍처와 CPU가 노출하는 부채널이 닫힌 대상 — 에서는 완전한 복원이 종종 불가능하지만, 제약 집합이 비어 있는 경우는 드뭅니다. KASLR이 없는 아키텍처에서는 엔진이 부트로더가 선택한 로드 주소를 찾아냅니다.

지원 대상:

  • 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

빠른 시작

sudo apt install libc-dev make gcc binutils git
git clone https://github.com/bcoles/kasld
cd kasld
make
./build/<arch>/kasld

build/<arch>/ 디렉터리는 자체 포함되어 있으며 대상 시스템에 배포할 수 있습니다:

build/<arch>/
  kasld              <- 실행할 파일
  components/        <- 누출 컴포넌트

강화된 구성(kernel.dmesg_restrict=1, kernel.kptr_restrict=1, kernel.perf_event_paranoid=2 이상, kernel.unprivileged_bpf_disabled=1, 그리고 %pK 포인터 해싱)은 파일시스템 오라클 경로를 좁히지만, 이는 관점의 한 축에 불과합니다. 부채널, 약한 엔트로피, capability 부여 기법은 이러한 sysctl과 무관합니다. 테스트를 위해 extra/weaken-kernel-hardening 스크립트로 이러한 설정을 일시적으로 완화할 수 있습니다(root 필요).

출력 예시

기본 텍스트 모드는 답변 우선 개요를 출력합니다:

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]

Certainty 열은 동일한 수량에 대한 두 가지 서로 다른 주장을 구분합니다. guaranteed 행은 증명된 것입니다. 즉, 실제 값이 해당 윈도우 안에 있습니다. likely 행은 증거가 뒷받침하는 단일 최선의 추정치로, 항상 guaranteed 윈도우의 부분집합이며, 타이밍 부채널과 같이 건전성 하한 아래의 신호에 의존하기 때문에 틀릴 수 있습니다. 직접 행동에 옮길 가치가 있는 결과는 하나의 후보로 좁혀진 guaranteed 행입니다. likely 값은 확인해야 할 단서이지, 의존할 사실이 아닙니다.

-v는 전체 상세 출력(배너, 시스템 구성 블록, 컴포넌트별 로그, KASLR 분석, 메모리 레이아웃 맵)을 추가합니다. -j는 기계 판독 가능한 JSON을 출력합니다. 즉, 컴포넌트별 레코드와 강화 평가를 항상 포함하는 완전한 구조화 뷰입니다. -1은 셸 파이프로 연결 가능한 단일 행을 출력합니다. -m은 이슈 트래커용으로 포맷합니다. -H는 텍스트/마크다운 보고서에 강화 평가를 덧붙입니다.

전체 CLI, 출력 모드 세부 사항, explain 모드, 강화 평가는 docs/usage.md를 참조하십시오.

관점(Vantage)

KASLD가 복원할 수 있는 것은 실행 중인 프로세스의 관점(vantage) 에 따라 달라집니다. 이는 단일 권한 수준이 아니라, 세 가지 독립적인 요소의 조합입니다:

  • 권한, 그룹, capability — 비특권 uid, adm과 같은 그룹(이는 /var/log/ 아래의 커널 로그를 부여함)의 멤버십, 추가 capability를 보유한 컨테이너 태스크, 또는 root. 이들은 단일 사다리를 이루지 않습니다. 왜냐하면 파일시스템 권한이 각 소스를 독립적으로 제어하기 때문입니다. CAP_SYS_RAWIO를 부여받은 컨테이너는 해당 검사에 대해 init 네임스페이스 root이며 /proc/kcore를 읽을 수 있습니다. 이는 일반 사용자가 도달할 수 없는 누출인 반면, 배포판마다 /boot/System.map과 같은 파일이 전 세계에서 읽기 가능한지에 대해 다릅니다.
  • 시스템 구성 — kptr_restrict, dmesg_restrict, perf_event_paranoid, 비특권 BPF, 커널 lockdown. 구성은 권한과 무관합니다. root는 kptr_restrict=2에서 /proc/kallsyms를 읽을 수 없지만, 완화된 sysctl이나 비특권 BPF는 강화된 시스템이라면 거부할 누출을 일반 사용자에게 넘겨줄 수 있습니다.
  • 격리 — /proc 오라클을 가리거나 시스템 호출을 차단하는 네임스페이스 또는 seccomp 샌드박스로, 모든 권한 수준이 관찰하는 범위를 좁힙니다.

세 축은 각 누출 소스를 독립적으로 제어합니다. 따라서 더 많은 권한이 더 적은 권한의 상위 집합이 아닙니다. 구성은 root에게 소스를 거부할 수 있고, 부채널은 sysctl을 완전히 우회합니다. docs/usage.md에는 각 소스를 어느 축이 제어하는지 보여주는 누출 소스별 게이트 매트릭스가 있습니다.

KASLD는 기본적으로 적은 권한을 가정하고, 관점이 부여하는 것은 무엇이든 기회주의적으로 사용합니다. 보고되는 guaranteed 윈도우는 결코 권한에 의존하지 않습니다. 상승된 접근이나 약한 구성은 시도되는 범위를 넓힐 수 있을 뿐, 증거가 증명하는 건전한 레이아웃을 넓히지는 못합니다. 상세(-v), JSON(-j), 마크다운(-m) 출력은 감지된 관점 — 컨테이너, 격리, 읽기 가능한 오라클, 그리고 현재 capability에서 도달 가능한 capability 게이트 누출 — 을 보고합니다.

문서

KASLD가 처음이십니까? 순서대로 읽으십시오: docs/kaslr.md(KASLR이 무엇이고 무엇을 무작위화하는지) → docs/architecture.md → A leak from end to end(KASLD가 하나의 누출을 어떻게 답으로 바꾸는지) → docs/limitations.md(결과가 무엇을 증명하고 무엇을 증명하지 않는지) → CONTRIBUTING.md(누출 컴포넌트나 추론 규칙 추가). 아래 표는 문서를 주제별로 색인합니다.

카테고리