업데이트로 돌아가기
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이 유지하는 보호의 상한이며, 베이스가 공격자의 손이 닿지 않는 곳에 있다는 보장은 아닙니다 (docs/limitations.md 참조). 완전히 패치된 최신 커널 — x86-64 부채널이 완화되고 직접적인 커널 텍스트 누출이 남아 있지 않은 경우 — 에서는 완전한 복원이 종종 불가능하지만, 제약 집합이 비어 있는 경우는 드뭅니다. KASLR이 없는 아키텍처에서는 엔진이 부트로더가 선택한 로드 주소를 찾아냅니다.

지원 대상:

  • x86 (i386+, amd64)
  • ARM (armv6, armv7, armv8, aarch64)
  • MIPS (mipsbe, mipsel, 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)은 파일시스템 오라클 경로를 좁히지만, 이는 관점의 한 축일 뿐입니다: 부채널, 약한 엔트로피, capability로 허용되는 기법들은 이러한 sysctl과 무관합니다. 테스트를 위해 extra/weaken-kernel-hardening 스크립트가 이러한 설정을 일시적으로 완화할 수 있습니다 (root 필요).

출력 예시

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

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

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

관점 (Vantage)

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

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

문서

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

주제문서
KASLR 입문docs/kaslr.md — 아키텍처별 KASLR 역사, 기본 텍스트 베이스, vmsplit, FG-KASLR
사용법 & CLIdocs/usage.md — CLI, 출력 모드, explain 모드, 강화 평가
결과 해석docs/limitations.md — 부정적 또는 부분적 결과가 의미하는 것: 건전하지만 완전하지 않음, 그리고 실패가 보안 보장이 아닌 이유
우회 기법docs/bypass-techniques.md — 파일시스템 누출, 부채널, 시스템 콜 / ioctl 누출, 약한 엔트로피, 패치된 CVE, 임의 읽기
익스플로잇docs/exploitation.md — 익스플로잇에서 KASLR 무력화가 어디에 들어가는지, 제어 흐름 vs 데이터 전용, pwntools 템플릿, ksymoff
흔적 & 탐지docs/footprint.md — 모니터링되는 호스트에서 실행이 어떻게 보이는지: 탐지할 행동 서명과 운영자의 OPSEC 비용; 설계상 요란함
유틸리티extra/README.mdextra/ 헬퍼 스크립트(캡처/재생, 건전성 검증, 포스처 diff, ksymoff)와 이들의 조합 방법
아키텍처 & 내부docs/architecture.md — 추론 엔진, 데이터 흐름 이음새, 태그된 라인 프로토콜, 교차 영역 도출
기여CONTRIBUTING.md — 컴포넌트나 규칙 작성, emitter API, 종료 코드, 메타데이터
테스트 & CIdocs/testing.md — 호스트 테스트, 재생 픽스처, qemu-user 하의 교차 아키텍처, 커버리지
재현성docs/reproducibility.md — 독립적 검증: 로컬 커널에서, 아키텍처 전반에 걸쳐 라이브로, 또는 캡처된 코퍼스에 대해

빌드

비이식성 코드(MAP_ANONYMOUS, getline(), popen(), …)를 사용하므로 _GNU_SOURCE 매크로를 지원하는 컴파일러가 필요합니다.

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는 필요한 툴체인, 두 개의 선택적 라이브러리(pthread, zlib)와 현재 컴파일러에 대한 자동 감지 결과, 그리고 컴포넌트별 컴파일/링크 플래그 예외를 보고합니다 — Makefile의 탐지 로직을 읽지 않고도 배포판 패키지의 control 파일을 채우기에 충분합니다.

make installcheck는 설치된 bin/kasld를 실행하고 FHS ../libexec/kasld 경로를 통해 컴포넌트를 발견하는지 확인합니다 — 분할 설치 레이아웃을 위한 설치 후 스모크 테스트로, make install과 동일한 PREFIX/DESTDIR를 사용합니다 (따라서 패키지 CI의 DESTDIR 스테이징 루트에 대해서도 작동합니다).

make install은 또한 kasldksymoff에 대한 man1 매뉴얼 페이지를 <prefix>/share/man/man1/에 설치하므로, 설치 후 man kasldman ksymoff가 작동합니다.

KASLD는 적절한 컴파일러(CC)를 지정하여 make로 교차 컴파일할 수 있습니다. 교차 컴파일 시 정적 링크가 자동으로 적용됩니다:

make CC=aarch64-linux-musl-gcc

지원되는 모든 교차 컴파일 대상 빌드 (툴체인이 PATH에 있어야 함):

make cross

라이선스

KASLD는 MIT 라이선스입니다 (LICENSE 참조). 일부 누출 컴포넌트는 서드파티 개념 증명 코드를 각색하거나 다른 사람이 처음 공개한 기법을 구현합니다. 그러한 각 파일은 헤더에 원저자와 출처를 명시하며, THIRD-PARTY-NOTICES.md는 각 항목을 라이선스 또는 재사용 근거(업스트림 라이선스, 저자 허가, 또는 여기서 재구현된 기법/재현 자료)와 함께 나열합니다.

KASLD 인용

KASLD는 MIT 라이선스입니다 — 사용에 출처 표시가 필요하지는 않지만, 연구, 도구, 익스플로잇, 또는 글에서 참조될 때 인용이나 링크를 해주시면 감사하겠습니다:

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는 또한 CITATION.cff로부터 "Cite this repository" 버튼을 표시합니다. master에서의 미출시 빌드의 경우, 특정 커밋과 접근 날짜를 인용하세요 — 예: bcoles/kasld@<commit> (accessed YYYY-MM-DD) — -dev 버전 문자열은 단일 커밋에 고유하지 않기 때문입니다.

카테고리