Skip to content

[26.04_linux-nvidia-bos] Backport of 'randomize_kstack: Unify random source across arches' - #536

Open
esot0 wants to merge 1 commit into
NVIDIA:26.04_linux-nvidia-bosfrom
esot0:26.04_linux-nvidia-bos-kstack-random
Open

[26.04_linux-nvidia-bos] Backport of 'randomize_kstack: Unify random source across arches'#536
esot0 wants to merge 1 commit into
NVIDIA:26.04_linux-nvidia-bosfrom
esot0:26.04_linux-nvidia-bos-kstack-random

Conversation

@esot0

@esot0 esot0 commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

Backport of upstream commit a96ef58 (randomize_kstack: Unify random source across arches) to NVIDIA 7.0+ kernels. This change preserves randomized-kstack while replacing the ARM64 syscall-path get_random_u16() hot path with the upstream per-CPU PRNG design seeded from the kernel CRNG, reducing syscall overhead without disabling the mitigation. During functional backport testing, running perf bench syscall basic, consistently showcased marked improvement over the stock kernel:

Stock:

# Running 'syscall/basic' benchmark:
# Executed 10000000 getppid() calls
     Total time: 1.436 [sec]

       0.143675 usecs/op
        6960167 ops/sec

Modified:

# Running 'syscall/basic' benchmark:
# Executed 10,000,000 getppid() calls
     Total time: 1.286 [sec]

       0.128617 usecs/op
      7,775,034 ops/sec

Launchpad: https://bugs.launchpad.net/ubuntu/+source/linux-nvidia-bos/+bug/2163050

@esot0 esot0 added the help wanted Extra attention is needed label Aug 7, 2026
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

PR Validation Report

Patchscan ✅ No Missing Fixes

All cherry-picked commits checked — no missing upstream fixes found.

PR Lint ✅ All checks passed

Details
Checking 1 commits...

Cherry-pick digest:
┌──────────────┬──────────────────────────────────────────────────────────────────┬────────────┬─────────┬───────────────────────────┐
│ Local        │ Referenced upstream / Patch subject                              │ Patch-ID   │ Subject │ SoB chain                 │
├──────────────┼──────────────────────────────────────────────────────────────────┼────────────┼─────────┼───────────────────────────┤
│ 2ae6a9b60f50 │ a96ef5848cb0 randomize_kstack: Unify random source across arches │ match      │ match   │ preserved + emilys added  │
└──────────────┴──────────────────────────────────────────────────────────────────┴────────────┴─────────┴───────────────────────────┘

Lint: all checks passed.

@jamieNguyenNVIDIA

Copy link
Copy Markdown
Collaborator

For both this and #537:

These also look like clean picks, so your commit message should say:

(cherry picked from commit a96ef5848cb096226bf6aff31a90d8b136d99b71)

instead of:

(backported from commit a96ef5848cb096226bf6aff31a90d8b136d99b71)

For clean cherry-picks, you can also drop the bracketed porting note:

[emilys: Unify kstack randomization path across all architectures]

This note is meant to explain what you had to change in the upstream patch to get it applied to our tree.

Lastly, this PR has the following SoB:

Signed-off-by: Emily S <emilys@nvidia.com>

but PR537 has:

Signed-off-by: Emily Soto <emilys@nvidia.com>

I'd suggest going with "Emily Soto" for all your sign-offs.

@nirmoy

nirmoy commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

For both this and #537:

These also look like clean picks, so your commit message should say:

(cherry picked from commit a96ef5848cb096226bf6aff31a90d8b136d99b71)

instead of:

(backported from commit a96ef5848cb096226bf6aff31a90d8b136d99b71)

Below command should handle this well

git cherry-pick -xs  a96ef58 

@esot0
esot0 force-pushed the 26.04_linux-nvidia-bos-kstack-random branch 2 times, most recently from 071444a to 5efd0e3 Compare August 7, 2026 16:10
Previously different architectures were using random sources of
differing strength and cost to decide the random kstack offset. A number
of architectures (loongarch, powerpc, s390, x86) were using their
timestamp counter, at whatever the frequency happened to be. Other
arches (arm64, riscv) were using entropy from the crng via
get_random_u16().

There have been concerns that in some cases the timestamp counters may
be too weak, because they can be easily guessed or influenced by user
space. And get_random_u16() has been shown to be too costly for the
level of protection kstack offset randomization provides.

So let's use a common, architecture-agnostic source of entropy; a
per-cpu prng, seeded at boot-time from the crng. This has a few
benefits:

  - We can remove choose_random_kstack_offset(); That was only there to
    try to make the timestamp counter value a bit harder to influence
    from user space [*].

  - The architecture code is simplified. All it has to do now is call
    add_random_kstack_offset() in the syscall path.

  - The strength of the randomness can be reasoned about independently
    of the architecture.

  - Arches previously using get_random_u16() now have much faster
    syscall paths, see below results.

[*] Additionally, this gets rid of some redundant work on s390 and x86.
Before this patch, those architectures called
choose_random_kstack_offset() under arch_exit_to_user_mode_prepare(),
which is also called for exception returns to userspace which were *not*
syscalls (e.g. regular interrupts). Getting rid of
choose_random_kstack_offset() avoids a small amount of redundant work
for the non-syscall cases.

In some configurations, add_random_kstack_offset() will now call
instrumentable code, so for a couple of arches, I have moved the call a
bit later to the first point where instrumentation is allowed. This
doesn't impact the efficacy of the mechanism.

There have been some claims that a prng may be less strong than the
timestamp counter if not regularly reseeded. But the prng has a period
of about 2^113. So as long as the prng state remains secret, it should
not be possible to guess. If the prng state can be accessed, we have
bigger problems.

Additionally, we are only consuming 6 bits to randomize the stack, so
there are only 64 possible random offsets. I assert that it would be
trivial for an attacker to brute force by repeating their attack and
waiting for the random stack offset to be the desired one. The prng
approach seems entirely proportional to this level of protection.

Performance data are provided below. The baseline is v6.18 with rndstack
on for each respective arch. (I)/(R) indicate statistically significant
improvement/regression. arm64 platform is AWS Graviton3 (m7g.metal).
x86_64 platform is AWS Sapphire Rapids (m7i.24xlarge):

+-----------------+--------------+---------------+---------------+
| Benchmark       | Result Class |  per-cpu-prng |  per-cpu-prng |
|                 |              | arm64 (metal) |   x86_64 (VM) |
+=================+==============+===============+===============+
| syscall/getpid  | mean (ns)    |    (I) -9.50% |   (I) -17.65% |
|                 | p99 (ns)     |   (I) -59.24% |   (I) -24.41% |
|                 | p99.9 (ns)   |   (I) -59.52% |   (I) -28.52% |
+-----------------+--------------+---------------+---------------+
| syscall/getppid | mean (ns)    |    (I) -9.52% |   (I) -19.24% |
|                 | p99 (ns)     |   (I) -59.25% |   (I) -25.03% |
|                 | p99.9 (ns)   |   (I) -59.50% |   (I) -28.17% |
+-----------------+--------------+---------------+---------------+
| syscall/invalid | mean (ns)    |   (I) -10.31% |   (I) -18.56% |
|                 | p99 (ns)     |   (I) -60.79% |   (I) -20.06% |
|                 | p99.9 (ns)   |   (I) -61.04% |   (I) -25.04% |
+-----------------+--------------+---------------+---------------+

I tested an earlier version of this change on x86 bare metal and it
showed a smaller but still significant improvement. The bare metal
system wasn't available this time around so testing was done in a VM
instance. I'm guessing the cost of rdtsc is higher for VMs.

Acked-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Ryan Roberts <ryan.roberts@arm.com>
Link: https://patch.msgid.link/20260303150840.3789438-3-ryan.roberts@arm.com
Signed-off-by: Kees Cook <kees@kernel.org>
(cherry picked from commit a96ef58)
Signed-off-by: Emily Soto <emilys@nvidia.com>

@clsotog clsotog left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Acked-by: Carol L Soto <csoto@nvidia.com>

@esot0
esot0 force-pushed the 26.04_linux-nvidia-bos-kstack-random branch from 5efd0e3 to 2ae6a9b Compare August 7, 2026 16:28
@nvmochs

nvmochs commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

LGTM!

Acked-by: Matthew R. Ochs <mochs@nvidia.com>

@jamieNguyenNVIDIA

Copy link
Copy Markdown
Collaborator
Acked-by: Jamie Nguyen <jamien@nvidia.com>

@nirmoy nirmoy added has_2_acks and removed help wanted Extra attention is needed has_1_ack labels Aug 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants