danos/system/kernel
Daniel Samson cb30faf15f
kernel: a hostile return address cannot fault the kernel
SYSRETQ with a non-canonical RIP raises a general protection fault in ring
0 — on the kernel stack, an instruction after the swapgs that installed the
user's GS base. It is one of the better-known escalation primitives, and
ring 3 reaches it without any kernel bug at all: the processor saves the
address of the instruction after SYSCALL, so a program whose SYSCALL is the
last two bytes of the last canonical page returns to the first
non-canonical address. The new test does exactly that.

The exit path now sign-extends the return address from bit 47 and compares;
if the value changed, it returns through IRETQ instead, which commits the
privilege change before fetching the new address, so the fault arrives from
ring 3 and the process dies like any other. Four register-only operations
and a branch that a correct program can never take — it could not have
executed at a non-canonical address in the first place. Bit 47 is the right
pivot because danos builds four-level page tables and nothing sets the
five-level bit; a future port must move the pivot, and the comment says so.

SFMASK grows one bit while we are here. SYSCALL, unlike an interrupt gate,
does not clear the nested-task flag, so the kernel had been running every
system call with whatever ring 3 last chose — harmless while the only exit
was SYSRETQ, and a question worth not having now that one exit is IRETQ.
The kernel is never nested; ring 3 still gets its own flag back.

Suite 113/113. The new case asserts the refusal counter rather than the
dying process: the emulator we test on kills it either way, so only the
counter distinguishes a guard that ran from one that did not.
2026-08-01 11:22:07 +01:00
..
architecture/x86_64 kernel: a hostile return address cannot fault the kernel 2026-08-01 11:22:07 +01:00
acpi.zig kernel: the IOMMU backends move behind the architecture boundary 2026-07-30 07:16:08 +01:00
console.zig console: page-wrap instead of scrolling — never read the framebuffer 2026-07-21 19:22:59 +01:00
device-model.zig kernel: flatten the device/discovery code, merge power into acpi, rename fdt 2026-07-22 21:49:20 +01:00
devices-broker.zig kernel: user memory is reached only through a checked copy 2026-07-31 20:57:49 +01:00
fdt.zig kernel: flatten the device/discovery code, merge power into acpi, rename fdt 2026-07-22 21:49:20 +01:00
font.psf Re-organize the source tree as a monorepo mirroring the FHS 2026-07-10 12:55:56 +01:00
heap.zig docs: audit all 'what's next' sections against the code; fix stale comments 2026-07-22 02:23:51 +01:00
iommu.zig kernel: the IOMMU backends move behind the architecture boundary 2026-07-30 07:16:08 +01:00
ipc-synchronous.zig init: /protocol replaces the ServiceId registry 2026-08-01 02:39:07 +01:00
ipc.zig Re-organize the source tree as a monorepo mirroring the FHS 2026-07-10 12:55:56 +01:00
irq.zig init: /protocol replaces the ServiceId registry 2026-08-01 02:39:07 +01:00
kernel.zig kernel: ring 0 cannot execute a user page 2026-08-01 10:05:58 +01:00
log-ring.zig build: the unix paths retire — configuration, logs, and volumes move into the danos tree 2026-07-31 19:41:35 +01:00
log.zig kernel: the boot transcript on screen, every line timestamped 2026-07-21 19:09:34 +01:00
platform.zig kernel: flatten the device/discovery code, merge power into acpi, rename fdt 2026-07-22 21:49:20 +01:00
pmm.zig M14b: DMA memory (dma_alloc / dma_free) 2026-07-10 19:43:59 +01:00
process.zig kernel: a hostile return address cannot fault the kernel 2026-08-01 11:22:07 +01:00
scheduler.zig kernel: user memory is reached only through a checked copy 2026-07-31 20:57:49 +01:00
sync.zig kernel: contain a fatal fault — name the task, release the BKL before halt 2026-07-14 09:05:10 +01:00
tests.zig kernel: a hostile return address cannot fault the kernel 2026-08-01 11:22:07 +01:00
user-memory.zig kernel: user memory is reached only through a checked copy 2026-07-31 20:57:49 +01:00
vfs.zig init: /protocol replaces the ServiceId registry 2026-08-01 02:39:07 +01:00
wall-clock.zig kernel: tagged log ring — per-line pid/name/level records, klog_status 2026-07-21 15:30:28 +01:00