
kasld v0.4.0
KASLDは、ローカルプロセスからLinuxカーネルの仮想メモリおよび物理メモリのレイアウトを非ランダム化する。その際、特権、設定、隔離といったその時点で利用可能な vantage を活用する。
KASLDは、ローカルプロセスからLinuxカーネルの仮想メモリおよび物理メモリのレイアウト — 主にカーネルテキストベース — を復元します。何を復元できるかは、そのプロセスの視点(vantage)の関数です。すなわち、そのプロセスの権限とケイパビリティ、システムの設定、およびコンテナによる隔離です。リークやサイドチャネルが許す場合にはベースを直接復元し、そうでない場合には、利用可能な証拠が支持する最小の配置候補集合に絞り込みます。
推論エンジンは、数十の独立した手法からの証拠をアーキテクチャの既知の不変条件と融合し、カーネルの配置を残差ウィンドウに絞り込みます。これは、生き残ったスロット数(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ポインタハッシュ化)はファイルシステムオラクルの経路を狭めますが、これは視点の一軸にすぎません。サイドチャネル、弱いエントロピー、およびケイパビリティ付与型の手法は、これらの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列は、同じ量についての2つの異なる主張を区別します。guaranteed行は証明済みです。真の値はそのウィンドウ内にあります。likely行は、証拠が支持する単一の最良推定値です — 常にguaranteedウィンドウの部分集合であり、タイミングサイドチャネルなど健全性の下限を下回るシグナルに依拠するため、誤っている可能性があります。直接行動に移す価値のある結果は、1つの候補に絞り込まれたguaranteed行です。likely値は確認すべき手がかりであり、依拠すべき事実ではありません。
-vは完全な詳細読み出し(バナー、システム設定ブロック、コンポーネントごとのログ、KASLR分析、メモリレイアウトマップ)を追加します。-jは機械可読なJSONを出力します — 完全な構造化ビューであり、常にコンポーネントごとのレコードと堅牢化評価を含みます。-1はシェルでパイプ可能な単一行を出力します。-mはイシュートラッカー向けにフォーマットします。-Hはテキスト/Markdownレポートに堅牢化評価を追加します。
完全なCLI、出力モードの詳細、explainモード、および堅牢化評価についてはdocs/usage.mdを参照してください。
視点(Vantage)
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(リークコンポーネントまたは推論ルールを追加する)。以下の表はトピック別にドキュメントを索引付けしています。