-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 NEFARIOUSPLAN-CANONICAL-V1 {"body_md":"## The repository names contain CVE-2026-46300. The files do not contain Fragnesia.\n\nA GitHub search for repository names containing `CVE-2026-46300`, as of 16 May 2026, returns three results.\n\n`v12-security/pocs/tree/main/fragnesia` is not one of them, because the repository name is `pocs`, not the CVE. It contains the working exploit, `fragnesia.c`, 1,302 lines, attributed in its header comment to William Bowling on the V12 team. The header points at the netdev patch on `lists.openwall.net/netdev/2026/05/13/79`. The file builds with `gcc -O2 -Wall -Wextra -static`, runs as an unprivileged user (modulo AppArmor on Ubuntu), and on success drops to a root shell by overwriting the first 192 bytes of `/usr/bin/su` in the page cache and `execve`-ing it.\n\n`HORKimhab/CVE-2026-46300` (one star, two commits on 14 May 2026 from `kimhab.zeecode@gmail.com`) is a faithful mirror of the V12 PoC under a disclaimer-wrapped README. The repository's `pocs/fragnesia/fragnesia.c` is byte-for-byte identical to the V12 file, and the README's final section reads:\n\n```\n## Credit or reference\n\n- pocs: https://github.com/v12-security/pocs\n```\n\nThis is a mirror, not a placeholder. It is in the scanner's result set because its name matches; the bytes inside it are the real exploit.\n\nThe other two results are the placeholders.\n\n`Sentebale/CVE-2026-46300`. One star. First commit `2026-05-14 15:31:14 +0800` from `owenglux@gmail.com`. Nine commits in twenty-three minutes the same day, all from the same author. The repository contains one Python file, `CVE-2026-46300.py`, 117 lines, and a README whose body is a Kylin Linux `uname -a` line and a transcript:\n\n```\npython3 CVE-2026-46300.py\n\nns> whoami\n\nroot\n\nns>\n```\n\n`0xBlackash/CVE-2026-46300`. Zero stars. Three commits on 15 May 2026 from `ashrafzaryouh@protonmail.com`. The repository contains `CVE-2026-46300.py` (117 lines), `CVE-2026-46300.sh` (48 lines), and a README of shields and emoji headers reading `Severity: High`, `Linux Kernel`, `Attack: Local Privilege Escalation`, with the section `Proof of Concept` linking to `v12-security/pocs/tree/main/fragnesia`.\n\nThe two `CVE-2026-46300.py` files are byte-for-byte identical except for one line:\n\n```diff\n- line = input(\"ns> \")\n+ line = input(\"PWNED> \")\n```\n\nThat is the diff. Sentebale's prompt is `ns>`. 0xBlackash's prompt is `PWNED>`. The timestamps support a copy direction: Sentebale's first commit is 25 hours before 0xBlackash's first commit, and the two author identities differ. The bytes do not.\n\n`0xBlackash` adds a companion bash script, `CVE-2026-46300.sh`, whose mechanical core is:\n\n```bash\nunshare_cmd=\"unshare --user --map-root-user --net\"\n\n$unshare_cmd bash -c '\n ip link set lo up 2>/dev/null || true\n ip addr add 127.0.0.1/8 dev lo 2>/dev/null || true\n echo \"[+] Network namespace ready\"\n PS1=\"(Fragnesia) \\u@\\h:\\w# \" bash\n'\n```\n\nThe artifact this script produces is a bash shell whose prompt reads `(Fragnesia) root@host:/path#`. The user-facing tell, the only thing the script does that distinguishes it from `unshare --user --map-root-user --net bash`, is the `PS1`.\n\n## What `whoami` actually returns\n\nBoth placeholder Python scripts perform the same operation. The parent forks. The child calls `unshare(CLONE_NEWUSER)`, signals the parent, and waits. The parent writes the child's uid mapping:\n\n```python\ndef parent_maps(pid, uid, gid):\n p = f\"/proc/{pid}\"\n write_proc(f\"{p}/uid_map\", f\"0 {uid} 1\\n\")\n write_proc(f\"{p}/setgroups\", \"deny\\n\")\n write_proc(f\"{p}/gid_map\", f\"0 {gid} 1\\n\")\n```\n\n`uid` is the outer user's real uid. The mapping `0 1` declares: inside this namespace, the single mapped identity is uid 0, which corresponds to the outer user's uid in the host. The child then calls `unshare(CLONE_NEWNET)`, runs `ip link set lo up` and `ip addr add 127.0.0.1/8 dev lo` via `subprocess.run`, and drops into a REPL that pipes each input line to `subprocess.run(cmd, shell=True, executable=\"/bin/sh\")`.\n\nThe user runs `python3 CVE-2026-46300.py`. The user sees `ns>` (or `PWNED>`). The user types `whoami`. `/usr/bin/whoami` calls `getuid()`, finds 0 in the calling process's user namespace, looks up uid 0 in `/etc/passwd`, and prints the matching name. The name is `root`. The Sentebale README presents that transcript as the exploit working.\n\nThe user is not root. The user is uid 0 inside a user namespace whose only mapped identity is their own outer uid. The kernel's filesystem checks against the host filesystem still see the outer uid. Any operation that requires real privilege, opening `/etc/shadow`, writing to `/usr/bin/su`, modifying another user's files, returns `EACCES`. The string `root` is a name lookup. It is not a capability state.\n\n## The real exploit's source code disproves the placeholders' premise in writing\n\nThe real `fragnesia.c` performs the same namespace dance the placeholders perform, and then performs three more steps the placeholders do not. The author of `fragnesia.c` knew which of those steps was the bug, and the source code says so.\n\nInside `main`:\n\n```c\nfile_size = use_existing_target(\"/usr/bin/su\");\nbyte_off = 0;\ndesired = (unsigned char *)shell_elf;\ndesired_len = PAYLOAD_LEN;\n\nprintf(\"[*] target=%s size=%llu\\n\", target_file, file_size);\nverify_write_denied(\"outer\");\nsetup_user_netns_xfrm();\nverify_write_denied(\"userns_root_mapped_to_outer_user\");\n\nret = replace_existing_bytes_after(byte_off, desired, desired_len, file_size);\n```\n\n`verify_write_denied` is defined earlier in the file:\n\n```c\nstatic void verify_write_denied(const char *label)\n{\n\tint fd;\n\n\terrno = 0;\n\tfd = open(target_file, O_WRONLY | O_CLOEXEC);\n\tif (fd >= 0) {\n\t\tclose(fd);\n\t\tprintf(\"namespace_gate_failed: %s write-open unexpectedly succeeded\\n\",\n\t\t label);\n\t\texit(4);\n\t}\n\n\tprintf(\"%s_write_open_denied=1 errno=%d (%s)\\n\",\n\t label, errno, strerror(errno));\n}\n```\n\nThe function tries to open `/usr/bin/su` for writing. If the open succeeds, the exploit prints `namespace_gate_failed` and exits with code 4. If the open fails, the exploit prints `