NebuNebu/Bug List/CVE-2026-43502
Finding·Linux kernel·RDS·Sep 04, 2026
CVE-2026-43502

A failed RDS zero-copy send could incorrectly free pinned memory

rds_message_zcopy_from_user
AffectsLinux v4.17-rc1 until the fixopenSUSE · Linux 6.4.0-150600 demo target

Summary

RDS zero-copy sending pinned user pages before attaching the new message to a socket. If sending failed during that interval, cleanup did not recognize the message as zero-copy and released those user-owned pages with the wrong primitive.

The lifecycle flaw was introduced in February 2018 and fixed upstream in May 2026. The public exploit, named ZcopyReaper, was validated on openSUSE with Linux 6.4.0-150600.

Why it mattered

An unprivileged local process could provoke a post-copy send error. Cleanup then treated pinned user memory as ordinary kernel-owned pages, causing invalid frees, corrupted memory accounting, and a path to local privilege escalation.

The affected code has been fixed. The risk described here applies to unpatched kernels in the affected line, not automatically to every system using the named distribution today.

What went wrong

rds_message_zcopy_from_user() stored the zero-copy notifier before rds_send_queue_rm() set rm->m_rs. rds_message_purge() used only m_rs to decide whether the pages were zero-copy, so an early failure took the non-zero-copy cleanup path.

Exploit

Because the issue and its fixes are public, NebuSec’s validation code is included here for reproducibility. The preview starts at the program entry point and shows exactly 15 lines. Expanding it reveals the complete selected C file embedded in this page; build files, headers, helpers, and any additional sources remain in the linked CyberMeowfia directory.

Public exploit · patched target
CyberMeowfia snapshot4c1f0aa
Browse all files
Exploit entry point · 979 linesOpen at main() ↗
exploit.c
int main(int argc, char **argv)
{
struct sigaction action = {
.sa_handler = signal_handler,
};
unsigned char control[CMSG_SPACE(sizeof(uint32_t))] = { 0 };
size_t control_length;
setvbuf(stdout, NULL, _IOLBF, 0);
if (!getuid() && argc > 0 && !strcmp(argv[0], MODPROBE_HELPER))
run_modprobe_helper();
if (argc != 1)
errx(1, "usage: %s", argv[0]);
if (atexit(park_corrupted_mm))
errx(1, "atexit registration failed");

The selected file is the execution entry point. Build files, headers, leak helpers, and supporting sources remain in the linked CyberMeowfia directory.

Patch

Fixed upstream in May 2026. The fix makes zero-copy ownership explicit throughout message cleanup, including failures before socket attachment. Apply the openSUSE kernel update containing the May 2026 upstream correction.

The safest check is the distribution’s own kernel changelog for CVE-2026-43502; version numbers alone can be misleading because vendors routinely backport security fixes without changing to the newest upstream kernel.

Nebu · AI security research

Find bugs in your code. Before anyone else does.