Skip to content

x86 restore_ucontext(): validate user-modified contex values#2144

Merged
francescolavra merged 2 commits intomasterfrom
fix/ucontext
Mar 7, 2026
Merged

x86 restore_ucontext(): validate user-modified contex values#2144
francescolavra merged 2 commits intomasterfrom
fix/ucontext

Conversation

@francescolavra
Copy link
Member

A signal handler can modify the machine context that is applied to the thread frame when the handler returns. The kernel should validate any user-modified values that might cause faults in kernel mode or leak kernel info to the user program.

Issues reported and fixes suggested by Niklas Femerstrand (@niklasfemerstrand).

Francesco Lavra added 2 commits March 7, 2026 08:33
A non-canonical instruction pointer value (i.e. a value where bit 47 is not
sign-extended to 64 bits) causes a general protection fault. If a signal
handler writes a non-canonical RIP value to the machine context, the sysret
instruction executed by the kernel when the handler returns triggers the
general protection fault in kernel mode (on Intel CPUs).
To avoid faulting in kernel mode, only copy the RIP value from the machine
context to the thread frame if the value is canonical.
…rame

A signal handler can modify the pointer to the floating-point register
frame in the thread context. If a modified pointer is invalid, the kernel
crashes; if a modified pointer points to kernel memory, kernel info is
leaked to the user program.
To prevent these issues, avoid copying from non-legitimate addresses when
restoring the thread context after a signal handler.
@francescolavra francescolavra merged commit 3f4aa1c into master Mar 7, 2026
7 checks passed
@francescolavra francescolavra deleted the fix/ucontext branch March 7, 2026 08:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants