You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
| `enum kasld_region` | `REGION_KERNEL_TEXT`, `REGION_RAM`, `REGION_INITRD`, `REGION_PCI_MMIO`, … (see [kasld/api.h](src/include/kasld/api.h) for the full list) |
Copy file name to clipboardExpand all lines: docs/bypass-techniques.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -197,7 +197,7 @@ The following table catalogues known side-channel KASLR attacks.
197
197
198
198
| Attack | Year | Status | References |
199
199
|---|---|---|---|
200
-
| KernelSnitch | 2025 |**Implemented (experimental)**: [kernelsnitch.c](../src/components/kernelsnitch.c)<br>Futex hash-table timing leaks `mm_struct` directmap address (not `_stext`). x86_64, unprivileged. Requires `--experimental` (~1–30 min runtime). Mitigated by `CONFIG_FUTEX_PRIVATE_HASH` (mainline ~v6.14+) which removes `mm_struct` from the private futex hash key. |[KernelSnitch: Side-Channel Attacks on Kernel Data Structures](https://lukasmaar.github.io/papers/ndss25-kernelsnitch.pdf) (Maar et al., 2025) — [NDSS 2025](https://www.ndss-symposium.org/ndss-paper/kernelsnitch-side-channel-attacks-on-kernel-data-structures/)<br>[lukasmaar/kernelsnitch](https://github.com/lukasmaar/kernelsnitch)|
200
+
| KernelSnitch | 2025 |**Implemented (experimental)**: [kernelsnitch.c](../src/components/kernelsnitch.c)<br>Futex hash-table timing leaks `mm_struct` directmap address (not `_stext`). x86_64, unprivileged. Requires `--experimental` (~1–30 min runtime). Nominally targeted by `CONFIG_FUTEX_PRIVATE_HASH` (v6.14+), but the unprivileged opt-out prctl `PR_FUTEX_HASH_SET_SLOTS=0` pins the process back onto the global `mm_struct`-keyed hash and defeats it, so the leak remains live; upstream status unfixed. |[KernelSnitch: Side-Channel Attacks on Kernel Data Structures](https://lukasmaar.github.io/papers/ndss25-kernelsnitch.pdf) (Maar et al., 2025) — [NDSS 2025](https://www.ndss-symposium.org/ndss-paper/kernelsnitch-side-channel-attacks-on-kernel-data-structures/)<br>[lukasmaar/kernelsnitch](https://github.com/lukasmaar/kernelsnitch)|
201
201
| GhostWrite (CVE-2024-44067) | 2024 | T-Head XuanTie C910/C920 RISC-V only (2 CPU models); kernel ≥6.14 disables vector extension as mitigation. |[GhostWrite](https://www.ghostwriteattack.com/)<br>[RISCover: Differential CPU Fuzz Testing](https://ghostwriteattack.com/riscover_ccs25.pdf) (Thomas et al., 2025)<br>[cispa/GhostWrite](https://github.com/cispa/GhostWrite), [cispa/RISCover](https://github.com/cispa/RISCover)|
202
202
| SLAM | 2024 | Requires Intel LAM / AMD UAI (no mainstream kernel support yet); Spectre-based, needs specific gadgets. |[Leaky Address Masking: Exploiting Unmasked Spectre Gadgets with Noncanonical Address Translation](https://download.vusec.net/papers/slam_sp24.pdf) (Hertogh et al., 2024)<br>[vusec.net/projects/slam](https://www.vusec.net/projects/slam/), [vusec/slam](https://github.com/vusec/slam)|
203
203
| SLUBStick (CVE-2024-26808) | 2024 | Achieves arbitrary kernel read/write (enabling KASLR bypass) via allocator timing side-channel, but requires a pre-existing heap vulnerability (UAF, heap overflow). Not a standalone KASLR bypass. |[SLUBStick: Arbitrary Memory Writes through Practical Software Cross-Cache Attacks within the Linux Kernel](https://www.usenix.org/system/files/usenixsecurity24-maar-slubstick.pdf) (Maar et al., 2024) — [USENIX Security 2024](https://www.usenix.org/conference/usenixsecurity24/presentation/maar-slubstick)|
@@ -313,7 +313,7 @@ The following KASLD components exploit syscall and interface leaks:
*[mincore.c](../src/components/mincore.c) — `mincore()` heap page disclosure via uninitialized memory (CVE-2017-16994; patched in v4.15)
315
315
*[bcm_msg_head_struct.c](../src/components/bcm_msg_head_struct.c) — CAN BCM `bcm_msg_head` struct uninitialized 4-byte padding hole leaks kernel stack pointer via `recvmsg()` (CVE-2021-34693; patched in v5.12)
316
-
*[pppd_kallsyms.c](../src/components/pppd_kallsyms.c) — set-uid-root `pppd` opens `/proc/kallsyms` as root, bypassing the `kptr_restrict`open-time check in pre-v4.8 kernels
316
+
*[pppd_kallsyms.c](../src/components/pppd_kallsyms.c) — set-uid-root `pppd` opens and reads `/proc/kallsyms` as root: pre-v4.8 the `kptr_restrict``%pK` check ran at `read()` time, which `pppd` performs with root credentials, so the symbols are unrestricted; v4.8 moved the check to `open()`
317
317
*[qemu_tcg_iret.c](../src/components/qemu_tcg_iret.c) — QEMU TCG `iret` emulation performs the frame read as ring 0, so a ring-3 guest reads an exception handler's return address off the guest kernel's exception stack — a kernel `.text` pointer (patched in QEMU 9.1; not a kernel bug)
Copy file name to clipboardExpand all lines: docs/usage.md
+13Lines changed: 13 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -139,6 +139,19 @@ The Layout table carries one row per quantity and basis:
139
139
|`Search space`| how many placements remain, against the set the row narrows — a `guaranteed` row against the window the kernel randomized over, a `likely` row against the `guaranteed` count above it. Reported whether or not evidence narrowed it, so a baseline run states the size of the problem; the denominator is dropped when nothing narrowed, leaving the bare total. `-` means no window is modelled for the quantity, which is the only thing that withholds the figure |
140
140
|`Align`| the grid the candidates sit on, which is what reconciles the count with the range |
141
141
142
+
The `likely` basis is deliberately conservative — "may be wrong" is a worst-case
143
+
caveat, not a coin toss. KASLD is build-agnostic: it never trusts a version string
144
+
or fingerprint to pin a base, so a signal that *would* fix the base on a specific
145
+
build — a leaked symbol pointer read as the base (e.g. `perf_event_open`), a
146
+
matched compile-time default — is still held below the sound floor to `likely`,
147
+
because the engine cannot assume it is looking at that build. Against a **known
148
+
target** (known hardware, known kernel and configuration) those *deterministic*
149
+
likely results are in practice effectively certain; the genuinely probabilistic
150
+
part is the hardware side channels (`prefetch`, `entrybleed`, …), whose success
151
+
varies from run to run. So a `likely` row is a floor on confidence, read together
152
+
with the source that produced it: a parsed leak is near-certain on a known target;
153
+
a timing oracle is the part that can miss.
154
+
142
155
Every quantity the architecture randomizes gets a row whether or not the engine
143
156
bounded it, so the set of rows is a property of the machine rather than of the
144
157
run — rows do not appear and vanish between boots. A row the engine never
0 commit comments