
kasld v0.4.0
KASLDは、ローカルプロセスからLinuxカーネルの仮想メモリおよび物理メモリのレイアウトを非ランダム化する。その際、特権、設定、隔離といったその時点で利用可能な vantage を活用する。
KASLDは、ローカルプロセスからLinuxカーネルの仮想メモリおよび物理メモリのレイアウト — 主にカーネルテキストベース — を復元します。その際、プロセスの視点が許す限りの情報を活用します。すなわち、そのプロセスの権限とケイパビリティ、システムの設定、およびコンテナによる隔離です。リークやサイドチャネルが許す場合にはカーネルテキストベースを直接復元し、そうでない場合には、利用可能な証拠が支持する最小の配置候補集合に絞り込みます。推論エンジンは、数十の独立した手法からの証拠をアーキテクチャの既知の不変条件と融合し、カーネルの配置を残存ウィンドウに絞り込みます — これは残存スロット数とエントロピービット数として報告され、この視点から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) はファイルシステムオラクルの経路を狭めますが、これは視点の一軸に過ぎません:
サイドチャネル、弱いエントロピー、およびケイパビリティ付与型の手法はこれらの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 はテキスト/マークダウンレポートに堅牢化評価を追加します。
完全なCLI、出力モードの詳細、explainモード、および堅牢化評価についてはdocs/usage.mdを参照してください。
視点
KASLDが復元できる内容は、実行中プロセスの視点に依存します — これは単一の権限レベルではなく、3つの独立した要素の組み合わせです:
- 権限、グループ、ケイパビリティ — 非特権uid、
admのようなグループへの所属 (/var/log/配下のカーネルログへのアクセスを許可)、追加のケイパビリティを保持するコンテナタスク、またはroot。これらは単一のはしごを形成しません。なぜなら、ファイルシステムのパーミッションが各ソースを独立に制御するからです:CAP_SYS_RAWIOを付与されたコンテナはそのチェックにおいてinit名前空間のrootであり、/proc/kcoreを読み取れます — これは通常のユーザーが到達できないリークです — 一方、/boot/System.mapのようなファイルが誰でも読み取り可能かどうかはディストリビューションによって異なります。 - システム設定 —
kptr_restrict、dmesg_restrict、perf_event_paranoid、非特権BPF、カーネルロックダウン。設定は権限とは独立です: rootはkptr_restrict=2の下で/proc/kallsymsを読み取れませんが、緩和されたsysctlや非特権BPFは、堅牢化されたシステムなら拒否するリークを一般ユーザーに与えることがあります。 - 隔離 —
/procオラクルをマスクしたり、システムコールをブロックしたりする名前空間またはseccompサンドボックスで、あらゆる権限レベルが観測できる範囲を狭めます。
3つの軸は各リークソースを独立に制御します — したがって、より多くの権限はより少ない権限のスーパーセットではありません: 設定はrootに対してソースを拒否でき、サイドチャネルはsysctlを完全に迂回します。docs/usage.mdには、各ソースをどの軸が制御するかを示すリークソース別ゲートのマトリクスがあります。
KASLDはデフォルトで少数の権限を前提とし、視点が与えるものを日和見的に利用します。報告されるguaranteedウィンドウは決して権限に依存しません: 昇格したアクセスや弱い設定は試行される範囲を広げることはあっても、証拠が証明する健全なレイアウトを広げることはありません。詳細 (-v)、JSON (-j)、およびMarkdown (-m) 出力は、検出された視点 — コンテナ、隔離、読み取り可能なオラクル、および現在のケイパビリティから到達可能なケイパビリティ制御型リーク — を報告します。
ドキュメント
KASLDが初めてですか? 順番に読んでください: docs/kaslr.md (KASLRとは何か、何をランダム化するか) → docs/architecture.md → A leak from end to end (KASLDが1つのリークをどのように答えに変えるか) → docs/limitations.md (結果が証明するものとしないもの) → CONTRIBUTING.md (リークコンポーネントや推論ルールの追加)。以下の表はトピック別にドキュメントを索引化しています。
| トピック | ドキュメント |
|---|---|
| KASLR入門 | docs/kaslr.md — アーキテクチャ別KASLRの歴史、デフォルトテキストベース、vmsplit、FG-KASLR |
| 使用方法とCLI | docs/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.md — extra/ヘルパースクリプト (キャプチャ/リプレイ、健全性検証、ポスチャ差分、ksymoff) とそれらの組み合わせ方 |
| アーキテクチャと内部 | docs/architecture.md — 推論エンジン、データフローの継ぎ目、タグ付き行プロトコル、領域間導出 |
| コントリビューション | CONTRIBUTING.md — コンポーネントやルールの作成、エミッターAPI、終了コード、メタデータ |
| テストとCI | docs/testing.md — ホストテスト、リプレイフィクスチャ、qemu-user下でのクロスアーキテクチャ、カバレッジ |
| 再現性 | 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 installcheck # インストールされた bin/kasld + libexec/kasld/ のスモークテスト
make uninstall # インストールされたファイルを削除
make clean # ビルドディレクトリを削除
make print-deps # ビルド依存関係を一覧表示 (ライブラリ + コンポーネント別フラグ)
make help # すべてのターゲットとオプションを表示
make print-deps は、必要なツールチェーン、2つのオプションライブラリ (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を参照)。一部のリークコンポーネントは、サードパーティの概念実証コードを適応させたり、他者によって最初に公開された手法を実装したりしています。そのような各ファイルはヘッダーに元の作者と出典を明記しており、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バージョン文字列は単一のコミットに固有ではないためです。