
Proof-of-concept for CVE-2026-43494 (PinTheft): Linux LPE via RDS zerocopy refcount bug + io_uring fixed buffers → SUID page-cache overwrite. Authorized research only.
Proof of concept — uid=1000(raken) → uid=0(root) after ./sley on WSL2 (6.6.87.2-microsoft-standard-WSL2)
Single-file proof-of-concept for CVE-2026-43494 (PinTheft): a Linux kernel local privilege escalation that chains an RDS zerocopy reference-count bug with io_uring fixed buffers to overwrite the page cache of a SUID-root binary.
Disclaimer: This repository is for authorized security research, education, and defensive testing only. Running this against systems you do not own or lack explicit permission to test is illegal and unethical. The authors assume no liability for misuse.
Original public research and PoC were published by the V12 Security team (Aaron Esau). SLEY is an independent, compact reimplementation with a styled terminal UI for lab use and learning.
flowchart LR
A[mmap anonymous page] --> B[io_uring: register fixed buffer]
B --> C[Clone buffer table to 2nd ring]
C --> D[1024× failing RDS zerocopy sends]
D --> E[Drain FOLL_PIN bias / steal refs]
E --> F[munmap → page freed]
F --> G[SUID binary page reclaimed in page cache]
G --> H[Stale io_uring ptr writes ELF stub]
H --> I[exec SUID → root shell]
su, mount, passwd, …).FOLL_PIN bias ≈ 1024).execve the SUID binary runs the injected stub as root.CONFIG_RDS=y and CONFIG_RDS_TCP=yCONFIG_IO_URING=y and kernel.io_uring_disabled = 0rds / rds_tcp modules loaded (or autoloadable by unprivileged users)IORING_REGISTER_CLONE_BUFFERS API used by the public chainsudo apt install build-essential linux-libc-dev # Debian/Ubuntu
# or equivalent headers package on your distro
# Patched? (example — adjust for your distro)
uname -r
grep -r CVE-2026-43494 /usr/share/doc/linux* 2>/dev/null || true
# RDS available?
grep CONFIG_RDS /boot/config-$(uname -r) 2>/dev/null
lsmod | grep -E '^rds'
# io_uring enabled?
cat /proc/sys/kernel/io_uring_disabled # expect 0
gcc -O2 -Wall -Wextra -o sley sley.c
Static linking (optional, for minimal lab images):
gcc -O2 -static -o sley sley.c
./sley
All status output goes to stderr (ANSI 256-color UI, progress bar, phased logging). Ensure your terminal supports UTF-8 and truecolor/256 colors for the box-drawing UI.
Example phases:
PHASE 1 │ Reconnaissance
PHASE 2 │ Memory & io_uring setup
PHASE 3 │ Pin reference theft (RDS zerocopy)
PHASE 4 │ Page cache overwrite & privesc
On a successfully exploited configuration, the chain completes and hands off to the discovered SUID binary with an overwritten first page — yielding a root shell if the race and kernel state align.
On patched kernels, hardened hosts, or missing RDS/io_uring, the PoC will fail early (no SUID target, mmap/io_uring/socket errors, etc.).
Distro-specific security advisories may ship backported patches — track your vendor’s kernel security queue.
.
├── README.md # This file
├── proof-of-concept.jpg # Screenshot: successful LPE (uid 1000 → root)
├── sley.c # Single-file PoC + terminal UI
└── .gitignore
This software is provided as-is for research and education. You are responsible for complying with applicable laws and obtaining written authorization before testing any system you do not own.
MIT — see repository license file if added. Use responsibly.
| Item | Detail |
|---|
| CVE | CVE-2026-43494 |
| Public name | PinTheft |
| Component | net/rds — zerocopy send path (rds_message_zcopy_from_user) |
| Primitive | Double put_page() when page pin fails → steal FOLL_PIN refs |
| Weaponization | io_uring fixed buffer + RDS failing zerocopy → page-cache UAF write |
| Impact | Local root on vulnerable configurations |
| Upstream fix | e17492979319 |
| Action | Notes |
|---|
| Patch kernel | Apply stable fix containing commit e17492979319 |
| Disable RDS | modprobe -r rds_tcp rds (and block autoload) if not required |
| Restrict io_uring | kernel.io_uring_disabled=1 or 2 via sysctl |
| Least privilege | Remove unnecessary SUID binaries; use containers with hardened profiles |
| Monitor | Alert on burst RDS zerocopy failures + io_uring buffer registration patterns |