
KASLD는 로컬 프로세스에서 리눅스 커널의 가상 및 물리 메모리 레이아웃을 무작위화 해제하며, 권한, 구성, 격리 등 자신이 가진 관점이 허용하는 범위 내에서 수행합니다.
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/48542/27960c6a9cf0003d33879e796f71de7930ff461d87e9c6333b9522d822615306.png" alt="Copilot으로 생성한 KASLD 로고 (잘림)"/>
</p>
<p align="center">
<img src="https://github.com/bcoles/kasld/actions/workflows/build.yml/badge.svg" alt="Build Status"/>
<img src="https://github.com/bcoles/kasld/actions/workflows/codeql.yml/badge.svg" alt="CodeQL"/>
<img src="https://img.shields.io/badge/platform-Linux-informational" alt="Platform: Linux"/>
<img src="https://img.shields.io/badge/arch-x86%20%C2%B7%20ARM%20%C2%B7%20MIPS%20%C2%B7%20PPC%20%C2%B7%20RISC--V%20%C2%B7%20LoongArch%20%C2%B7%20s390-blue" alt="Architectures"/>
<img src="https://img.shields.io/badge/C-C99-blue.svg" alt="C99"/>
<img src="https://img.shields.io/github/v/release/bcoles/kasld" alt="Release"/>
<img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="License: MIT"/>
</p>
KASLD는 로컬 프로세스로부터 Linux 커널의 가상 및 물리 메모리 레이아웃 — 주로 커널 텍스트 베이스 — 을 복원합니다. 무엇을 복원할 수 있는지는 해당 프로세스의 관점(vantage)에 따라 달라집니다. 즉, 프로세스의 권한과 capability, 시스템 구성, 그리고 컨테이너 격리 여부에 달려 있습니다. 누출이나 부채널이 허용하는 경우에는 베이스를 그대로 복원하고, 그렇지 않은 경우에는 사용 가능한 증거가 뒷받침하는 가장 작은 배치 집합으로 좁힙니다.
추론 엔진은 수십 가지 독립적인 기법의 증거를 아키텍처의 알려진 불변식과 융합하여 커널의 배치를 잔여 윈도우로 좁힙니다. 이는 살아남은 *슬롯*(KASLR이 선택할 수 있었던 배치)의 수와 그것이 나타내는 엔트로피 비트로 보고됩니다. 이는 이 관점에서 KASLR이 유지하는 보호의 상한이며, 베이스가 공격자의 손이 닿지 않는 곳에 있다는 보장은 아닙니다([docs/limitations.md](https://github.com/bcoles/kasld/blob/master/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
## 빠른 시작
```sh
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](https://github.com/bcoles/kasld/blob/master/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](https://github.com/bcoles/kasld/blob/master/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](https://github.com/bcoles/kasld/blob/master/docs/usage.md#vantage)에는 각 소스를 어느 축이 제어하는지 보여주는 누출 소스별 게이트 매트릭스가 있습니다.
KASLD는 기본적으로 적은 권한을 가정하고, 관점이 부여하는 것은 무엇이든 기회주의적으로 사용합니다. 보고되는 *guaranteed* 윈도우는 결코 권한에 의존하지 않습니다. 상승된 접근이나 약한 구성은 시도되는 범위를 넓힐 수 있을 뿐, 증거가 증명하는 건전한 레이아웃을 넓히지는 못합니다. 상세(`-v`), JSON(`-j`), 마크다운(`-m`) 출력은 감지된 관점 — 컨테이너, 격리, 읽기 가능한 오라클, 그리고 현재 capability에서 도달 가능한 capability 게이트 누출 — 을 보고합니다.
## 문서
KASLD가 처음이십니까? 순서대로 읽으십시오: [docs/kaslr.md](https://github.com/bcoles/kasld/blob/master/docs/kaslr.md)(KASLR이 무엇이고 무엇을 무작위화하는지) → [docs/architecture.md → A leak from end to end](https://github.com/bcoles/kasld/blob/master/docs/architecture.md#a-leak-from-end-to-end)(KASLD가 하나의 누출을 어떻게 답으로 바꾸는지) → [docs/limitations.md](https://github.com/bcoles/kasld/blob/master/docs/limitations.md)(결과가 무엇을 증명하고 무엇을 증명하지 않는지) → [CONTRIBUTING.md](https://github.com/bcoles/kasld/blob/master/CONTRIBUTING.md)(누출 컴포넌트나 추론 규칙 추가). 아래 표는 문서를 주제별로 색인합니다.
| 주제 | 문서 |
|---|---|
| KASLR 입문 | [docs/kaslr.md](https://github.com/bcoles/kasld/blob/master/docs/kaslr.md) — 아키텍처별 KASLR 이력, 기본 텍스트 베이스, vmsplit, FG-KASLR |
| 사용법 & CLI | [docs/usage.md](https://github.com/bcoles/kasld/blob/master/docs/usage.md) — CLI, 출력 모드, explain 모드, 강화 평가 |
| 결과 해석 | [docs/limitations.md](https://github.com/bcoles/kasld/blob/master/docs/limitations.md) — 부정적 또는 부분적 결과가 의미하는 것: 건전하지만 완전하지 않음, 그리고 실패가 보안 보장이 아닌 이유 |
| 우회 기법 | [docs/bypass-techniques.md](https://github.com/bcoles/kasld/blob/master/docs/bypass-techniques.md) — 파일시스템 누출, 부채널, 시스템 호출 / ioctl 누출, 약한 엔트로피, 패치된 CVE, 임의 읽기 |
| 익스플로잇 | [docs/exploitation.md](https://github.com/bcoles/kasld/blob/master/docs/exploitation.md) — KASLR 무력화가 익스플로잇에서 어디에 위치하는지, 제어 흐름 vs 데이터 전용, pwntools 템플릿, `ksymoff` |
| 흔적 & 탐지 | [docs/footprint.md](https://github.com/bcoles/kasld/blob/master/docs/footprint.md) — 모니터링되는 호스트에서 실행이 어떻게 보이는지: 이를 탐지할 행동 서명, 그리고 운영자의 OPSEC 비용; 설계상 요란함 |
| 유틸리티 | [extra/README.md](https://github.com/bcoles/kasld/blob/master/extra/README.md) — `extra/` 헬퍼 스크립트(캡처/재생, 건전성 검증, 자세 차이, `ksymoff`)와 이들이 결합하는 방식 |
| 아키텍처 & 내부 | [docs/architecture.md](https://github.com/bcoles/kasld/blob/master/docs/architecture.md) — 추론 엔진, 데이터 흐름 이음새, 태그된 라인 프로토콜, 교차 영역 도출 |
| 건전성 | [docs/soundness.md](https://github.com/bcoles/kasld/blob/master/docs/soundness.md) — 보고된 윈도우가 보장하는 것, 형식적 속성으로서: 각 수량이 나타내는 격자, 규칙에 대한 의무, 진리 포함, 신뢰 하한, 종료 한계 |
| 기여 | [CONTRIBUTING.md](https://github.com/bcoles/kasld/blob/master/CONTRIBUTING.md) — 컴포넌트나 규칙 작성, 이미터 API, 종료 코드, 메타데이터 |
| JSON 스키마 | [docs/kasld.schema.json](https://github.com/bcoles/kasld/blob/master/docs/kasld.schema.json) — `-j` 문서를 JSON Schema로: 수집된 스냅샷을 이에 대해 검증하거나, 이로부터 타입을 생성. `schema_version`과 그 호환성 규칙은 [docs/usage.md](https://github.com/bcoles/kasld/blob/master/docs/usage.md#json--j)에 있음 |
| 테스트 & CI | [docs/testing.md](https://github.com/bcoles/kasld/blob/master/docs/testing.md) — 호스트 테스트, 재생 픽스처, qemu-user 하의 교차 아키텍처, 커버리지 |
| 재현성 | [docs/reproducibility.md](https://github.com/bcoles/kasld/blob/master/docs/reproducibility.md) — 독립적 검증: 로컬 커널에서, 아키텍처 전반에 걸쳐 라이브로, 또는 캡처된 코퍼스에 대해 |
## 빌드
비이식성 코드(`MAP_ANONYMOUS`, `getline()`, `popen()`, …)를 사용하기 때문에 `_GNU_SOURCE` 매크로를 지원하는 컴파일러가 필요합니다.
```
make # kasld + 컴포넌트 빌드
make run # 빌드 후 실행
make test # 빌드 후 단위 테스트 실행
make cross # 지원되는 모든 아키텍처용 크로스 컴파일
make install # /usr/local에 설치 (PREFIX=/usr/local)
make install-strip # 설치 후 설치된 바이너리 strip
make installcheck # 설치된 bin/kasld + libexec/kasld/ 스모크 테스트
make uninstall # 설치된 파일 제거
make clean # 빌드 디렉터리 제거
make print-deps # 빌드 의존성 목록 (라이브러리 + 컴포넌트별 플래그)
make help # 모든 타겟과 옵션 표시
```
`COMPONENTS`는 빌드를 glob과 일치하는 컴포넌트로 제한하므로, 소수의 기법만 실행할 수 있는 대상에는 그것들만 포함됩니다. 패턴은 컴포넌트를 지정하며 쉼표 또는 공백으로 구분되고, `--skip` 플래그가 받는 것과 동일한 형식입니다. 아무것도 일치하지 않는 패턴은 조용히 범위를 좁히는 대신 빌드를 중단합니다. 설정하지 않으면 모든 컴포넌트가 빌드됩니다.
```
make cross COMPONENTS='dmesg_*,sysfs_devicetree_*,devicetree_facts,proc_*'
```
컴포넌트는 설치 크기의 대부분을 차지하므로, 선택은 작은 rootfs를 위한 지렛대입니다. 또한 빌드를 비례적으로 줄여주는데, 이는 17개 대상에 걸쳐 더 큰 절약입니다.
`CC`와 마찬가지로, 선택은 트리가 아니라 호출에 속합니다. 선택 없이 `install` 또는 `install-strip`을 실행하면 모든 것을 다시 빌드하고 설치하므로, 그것들에도 전달하십시오.
```
make install-strip COMPONENTS='dmesg_*,proc_*' DESTDIR=/staging PREFIX=/usr
```
`make print-deps`는 필요한 툴체인, 두 개의 선택적 라이브러리(`pthread`, `zlib`)와 현재 컴파일러에 대한 자동 감지 결과, 그리고 컴포넌트별 컴파일/링크 플래그 예외를 보고합니다. 이는 Makefile의 프로브 로직을 읽지 않고도 배포판 패키지의 control 파일을 채우기에 충분합니다.
`make installcheck`는 설치된 `bin/kasld`를 실행하고 FHS `../libexec/kasld` 경로를 통해 컴포넌트를 발견하는지 확인합니다. 이는 분할 설치 레이아웃을 위한 설치 후 스모크 테스트로, `make install`과 동일한 `PREFIX`/`DESTDIR`을 사용합니다(따라서 패키지 CI의 `DESTDIR` 스테이징 루트에 대해서도 작동합니다).
`make install`은 또한 `kasld`와 `ksymoff`에 대한 `man1` 매뉴얼 페이지를 `<prefix>/share/man/man1/`에 설치하므로, 설치 후 `man kasld`와 `man ksymoff`가 작동합니다.
KASLD는 적절한 컴파일러(`CC`)를 지정하여 `make`로 크로스 컴파일할 수 있습니다. 크로스 컴파일 시 정적 링크가 자동으로 적용됩니다:
```
make CC=aarch64-linux-musl-gcc
```
지원되는 모든 크로스 컴파일 대상 빌드(툴체인이 `PATH`에 있어야 함):
```
make cross
```
## 라이선스
KASLD는 MIT 라이선스입니다([LICENSE](https://github.com/bcoles/kasld/blob/master/LICENSE) 참조). 일부 누출 컴포넌트는 서드파티 개념 증명 코드를 각색하거나 다른 사람이 처음 공개한 기법을 구현합니다. 그러한 각 파일은 헤더에 원저자와 출처를 명시하며, [THIRD-PARTY-NOTICES.md](https://github.com/bcoles/kasld/blob/master/THIRD-PARTY-NOTICES.md)는 각각을 라이선스 또는 재사용 근거(업스트림 라이선스, 저자 허가, 또는 여기서 재구현된 기법/재현 자료)와 함께 나열합니다.
## KASLD 인용
KASLD는 MIT 라이선스입니다. 사용에 출처 표시가 요구되지는 않지만, 연구, 도구, 익스플로잇, 또는 글에서 참조될 때마다 인용이나 링크를 해주시면 감사하겠습니다:
> **KASLD: Kernel Address Space Layout Derandomization**, Brendan Coles,
> https://github.com/bcoles/kasld
BibTeX:
```bibtex
@software{kasld,
title = {KASLD: Kernel Address Space Layout Derandomization},
author = {Coles, Brendan},
url = {https://github.com/bcoles/kasld},
version = {0.4.1},
year = {2026}
}
```
GitHub는 또한 [CITATION.cff](https://github.com/bcoles/kasld/blob/master/CITATION.cff)로부터 *"Cite this repository"* 버튼을 표시합니다. `master`에서의 미출시 빌드의 경우, 특정 커밋과 접근 날짜를 인용하십시오. 예: `bcoles/kasld@<commit>` (접근 YYYY-MM-DD). `-dev` 버전 문자열은 단일 커밋에 고유하지 않기 때문입니다.