This is a forged valet ticket that only works if the garage, the attendant, and the side door are all open
CVE-2026-46243 is a local privilege escalation in the Linux kernel CIFS client path. A low-privileged user can forge a cifs.spnego key description, trigger the default request-key rule, and get the root-run cifs.upcall helper to trust attacker-controlled fields like pid, uid, creduid, and upcall_target. In practice, exploitation needs several moving parts at once: a vulnerable kernel path, an affected cifs-utils build and default cifs.spnego rule, the cifs module available, unprivileged user namespaces enabled, and an LSM policy that does not shut the chain down. The kernel-side bug dates back to 2007; the researcher notes affected cifs-utils is nominally 6.14+, with some older distro backports also pulled into the blast radius.
The vendor HIGH 7.8 rating is technically defensible for impact, but it overstates enterprise urgency when you factor in the real attack path. This is post-initial-access by definition: the attacker already has code execution as a local user, then still needs the right package mix and namespace/LSM behavior. Public PoC and reliable root impact keep this out of LOW, but the layered prerequisites and lack of KEV / active exploitation evidence push it down to MEDIUM for most 10,000-host fleets.
4 steps from start to impact.
Get local code execution
- Unprivileged local code execution on the target host
- Ability to invoke normal syscalls from user space
- This is not an initial-access bug
- Single-purpose appliances and locked-down servers often have no meaningful untrusted local users
Forge a cifs.spnego key request
request_key(2) or add_key(2), the attacker creates a forged cifs.spnego description that contains authority-bearing fields trusted downstream by cifs.upcall. The kernel bug is that this key type accepted user-originated descriptions instead of restricting them to the CIFS client's private spnego_cred path.- Vulnerable kernel code path present
cifssupport built in or loadablecifs-utilsinstalled with the default/etc/request-key.d/cifs.spnego.confrule
- Hosts that do not use SMB client functionality often lack
cifs-utilsor can blockcifsentirely - If the request-key rule is removed or replaced with
keyctl negate, the helper never becomes a root trampoline
add_key and request_key can catch this; generic network scanners cannot because the bug is local-only.Abuse namespace switching in cifs.upcall
upcall_target=app and a chosen pid, the attacker steers the root helper into attacker-controlled namespaces. The exploit path uses unshare/user+mount namespaces so the helper sees an attacker-prepared filesystem view before dropping privileges.- Unprivileged user namespaces enabled
- A target process namespace the attacker controls
- LSM policy does not block the namespace path end-to-end
- Many hardened environments disable unprivileged user namespaces
- Default SELinux/AppArmor behavior blocks exploitation on some mainstream builds
unshare activity plus keyring syscalls from low-privilege users; EDR should see the process chain but many fleets do not alert on it.Load attacker NSS code as root
cifs.upcall performs NSS lookups before its final privilege drop. That lets a malicious libnss_*.so.2 and crafted nsswitch.conf execute in the root helper context, turning the bug into reliable root code execution.- Helper performs NSS lookup before final privilege drop
- Attacker can plant namespace-local NSS files
- Older
cifs-utilsbuilds lacking the relevant namespace-switch path are not exploitable by this PoC - Application whitelisting or strict library policy can disrupt the last stage
request-key -> cifs.upcall plus unusual NSS library loads is the highest-signal telemetry.The supporting signals.
| In-the-wild status | No authoritative active-exploitation evidence found in CISA KEV or the cited vendor advisories. Treat as publicly weaponizable, not *currently observed at scale*. |
|---|---|
| PoC availability | Yes. Public PoC is available from Asim Manizada at github.com/manizada/CIFSwitch, and the research write-up explains the chain. |
| EPSS | 0.00017 from the user-supplied intel block, which is extremely low and directionally consistent with a niche local-only path. |
| KEV status | Not KEV-listed in the current CISA KEV Catalog. This is an inference from the catalog state at assessment time, not a statement from CISA about non-exploitation. |
| CVSS vector | CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H = local, low complexity, low privileges required, no user interaction, full host impact after success. The *impact* is real; the *reachability* is narrow. |
| Affected range | Kernel-side bug exists since 2007 in the CIFS SPNEGO key path. Researcher guidance says affected cifs-utils is nominally 6.14+, with some older distro backports also exposed; exploitation also needs unprivileged user namespaces and permissive enough SELinux/AppArmor behavior. |
| Fixed versions | Upstream kernel fix is commit 3da1fdf4efbc and Debian reports fixes in bullseye 5.10.257-1, bookworm 6.1.174-1, trixie 6.12.90-2, and sid/forky 7.0.10-1. CIQ/Rocky has separate backported kernel builds; distro backports matter more than raw upstream version numbers. |
| Exposure / scanning reality | This is not internet-scannable in any meaningful way. Shodan/Censys/FOFA exposure numbers are the wrong model; you must inventory hosts with cifs-utils, available cifs support, and kernel.unprivileged_userns_clone enabled. |
| Disclosure timeline | Research write-up published 2026-05-27; CVE/NVD published 2026-06-01; Red Hat bulletin went public 2026-05-29 and was updated 2026-06-02. |
| Reporter / researcher | Asim Viladi Oglu Manizada disclosed the issue and published the write-up plus PoC. |
noisgate verdict.
The decisive factor is attacker position: this bug only matters after an attacker already has local code execution on the Linux host. Public PoC and root impact keep it important, but the extra requirements around cifs-utils, user namespaces, and LSM behavior sharply reduce exposed population versus a true fleet-wide emergency.
Why this verdict
- Downgrade for attacker position:
AV:L/PR:Lmeans the attacker is already on the box. That implies prior compromise or an untrusted local-user model, which is compounding downward pressure on severity. - Downgrade for exposure fraction: exploitation needs
cifs-utils, the defaultcifs.spnegorequest-key rule,cifssupport, and unprivileged user namespaces. Many enterprise Linux servers will miss at least one of those. - Downgrade for platform controls: default SELinux/AppArmor blocks the chain on several mainstream configurations per the researcher testing. Modern host hardening can stop the exploit without the patch.
- Upgrade from LOW because root is real: once the chain lands, impact is full root compromise on the host, not a sandbox escape with limited blast radius.
- Upgrade from LOW because PoC is public: this is not a theoretical logic issue buried in a changelog; there is public weaponization guidance and practical distro testing.
- No extra uplift from threat intel: no KEV listing and no authoritative active exploitation evidence, which removes the strongest argument for HIGH in patch-priority terms.
Why not higher?
A higher rating would fit only if this were unauthenticated remote, broadly reachable across default fleets, or already showing active exploitation. It is none of those. The exploit chain assumes a prior foothold and then still depends on a fairly specific local configuration profile.
Why not lower?
This is not harmless hygiene. The end state is root, the exploit path is public, and shared Linux environments like CI workers, jump hosts, research clusters, and multi-user dev boxes are exactly where local privescs matter most. If you operate those populations at scale, ignoring this would be a mistake.
What to do — in priority order.
- Override the
cifs.spnegorequest-key rule — Replace the default helper invocation with a negation rule so forgedcifs.spnegorequests do not launchcifs.upcallas root. For a MEDIUM verdict there is no mitigation SLA — go straight to the 365-day remediation window, but if you run shared Linux or CI workers, do this early because it cleanly cuts the exploit chain. - Disable unprivileged user namespaces where you can — Set
kernel.unprivileged_userns_clone=0on hosts that do not require rootless containers or similar userns features. This removes a critical prerequisite from the public exploit path; again, there is no mitigation SLA — go straight to the 365-day remediation window, but it is a high-value hardening step for exposed host classes. - Block or unload
cifson non-SMB clients — If the host never mounts SMB/CIFS shares, blacklist or remove thecifsmodule so the vulnerable kernel path is not reachable in practice. Do this during normal hardening work within the MEDIUM remediation window, and validate business impact first because it breaks CIFS mounts. - Remove
cifs-utilsfrom unnecessary hosts — Ifcifs-utilsis present only by image inheritance, remove it from server and container-node baselines that do not need SMB client auth. That strips out the root helper and default request-key rule from the attack path; schedule as standard platform hygiene inside the remediation window. - Add audit coverage for keyring syscalls — Log
request_keyandadd_keyactivity, especially low-privilege calls involvingcifs.spnego, and alert oncifs.upcallancestry from non-kernel processes. This does not fix the bug, but it improves your odds of spotting exploit attempts while patch rollout catches up.
Network perimeter controlsdo not help much because the exploit is local-only and does not require inbound exposure.MFAis irrelevant once the attacker already has local code execution as a low-privilege user.Package-only updates to cifs-utilsare not the primary fix here; the upstream and vendor guidance point to the kernel-side validation patch as the real closure.Internet exposure reductionis the wrong mental model. This is not a Shodan problem; it is a local-hardening and fleet-inventory problem.
Crowdsourced verification payload.
Run this on the target Linux host as root if possible, though it can still gather partial evidence unprivileged. Invoke it as bash check-cve-2026-46243.sh; it inspects distro/kernel versions where known, plus exploit preconditions like cifs-utils, the cifs.spnego rule, cifs availability, and unprivileged user namespaces. Output is PATCHED, VULNERABLE, or UNKNOWN.
#!/usr/bin/env bash
# check-cve-2026-46243.sh
# Determine likely exposure to CVE-2026-46243 (CIFSwitch)
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
set -u
status="UNKNOWN"
reason=()
have_cmd() { command -v "$1" >/dev/null 2>&1; }
ver_ge() {
# returns 0 if $1 >= $2 using sort -V
[ "$(printf '%s\n%s\n' "$2" "$1" | sort -V | head -n1)" = "$2" ]
}
os_id="unknown"
os_ver="unknown"
if [ -r /etc/os-release ]; then
. /etc/os-release
os_id="${ID:-unknown}"
os_ver="${VERSION_ID:-unknown}"
fi
kernel_rel="$(uname -r 2>/dev/null || echo unknown)"
userns="unknown"
if [ -r /proc/sys/kernel/unprivileged_userns_clone ]; then
userns="$(cat /proc/sys/kernel/unprivileged_userns_clone 2>/dev/null)"
fi
cifsutils="absent"
if have_cmd dpkg-query; then
if dpkg-query -W -f='${Status} ${Version}\n' cifs-utils 2>/dev/null | grep -q 'install ok installed'; then
cifsutils="installed"
cifsutils_ver="$(dpkg-query -W -f='${Version}\n' cifs-utils 2>/dev/null)"
fi
elif have_cmd rpm; then
if rpm -q cifs-utils >/dev/null 2>&1; then
cifsutils="installed"
cifsutils_ver="$(rpm -q --qf '%{VERSION}-%{RELEASE}\n' cifs-utils 2>/dev/null)"
fi
fi
cifsutils_ver="${cifsutils_ver:-n/a}"
rule_state="missing"
if [ -f /etc/request-key.d/cifs.spnego.conf ]; then
if grep -Eq 'keyctl[[:space:]]+negate' /etc/request-key.d/cifs.spnego.conf 2>/dev/null; then
rule_state="negated"
elif grep -Eq 'cifs\.upcall' /etc/request-key.d/cifs.spnego.conf 2>/dev/null; then
rule_state="helper"
else
rule_state="custom"
fi
fi
cifs_mod="unknown"
if grep -qw '^cifs' /proc/modules 2>/dev/null; then
cifs_mod="loaded"
elif have_cmd modinfo && modinfo cifs >/dev/null 2>&1; then
cifs_mod="available"
else
cifs_mod="absent_or_builtin_unknown"
fi
# Debian fixed kernel package thresholds from Debian tracker.
# We can only confidently assess Debian-family package streams here.
if [ -r /etc/debian_version ] && have_cmd dpkg-query; then
linux_pkg_ver="$(dpkg-query -W -f='${Version}\n' linux-image-$(uname -r) 2>/dev/null || true)"
if [ -n "$linux_pkg_ver" ]; then
case "$os_ver" in
11*) if ver_ge "$linux_pkg_ver" "5.10.257-1"; then status="PATCHED"; reason+=("Debian 11 kernel package >= 5.10.257-1"); fi ;;
12*) if ver_ge "$linux_pkg_ver" "6.1.174-1"; then status="PATCHED"; reason+=("Debian 12 kernel package >= 6.1.174-1"); fi ;;
13*) if ver_ge "$linux_pkg_ver" "6.12.90-2"; then status="PATCHED"; reason+=("Debian 13 kernel package >= 6.12.90-2"); fi ;;
esac
fi
fi
# Exposure logic if not already PATCHED
if [ "$status" != "PATCHED" ]; then
exploitable_prereqs=0
if [ "$cifsutils" = "installed" ]; then exploitable_prereqs=$((exploitable_prereqs+1)); else reason+=("cifs-utils not installed"); fi
if [ "$rule_state" = "helper" ]; then exploitable_prereqs=$((exploitable_prereqs+1)); else reason+=("cifs.spnego helper rule not active"); fi
case "$cifs_mod" in
loaded|available|absent_or_builtin_unknown) exploitable_prereqs=$((exploitable_prereqs+1)) ;;
esac
if [ "$userns" = "1" ]; then exploitable_prereqs=$((exploitable_prereqs+1)); else reason+=("unprivileged user namespaces disabled or unknown"); fi
# If all practical prereqs are present and we do not know the kernel is fixed, call it VULNERABLE.
if [ "$exploitable_prereqs" -ge 4 ]; then
status="VULNERABLE"
reason+=("all major public exploit prerequisites present; kernel patch level not proven fixed")
else
status="UNKNOWN"
reason+=("kernel patch level not proven fixed, but one or more exploit prerequisites are absent")
fi
fi
echo "CVE-2026-46243 assessment"
echo "OS: $os_id $os_ver"
echo "Kernel: $kernel_rel"
echo "cifs-utils: $cifsutils ($cifsutils_ver)"
echo "cifs.spnego rule: $rule_state"
echo "cifs module: $cifs_mod"
echo "kernel.unprivileged_userns_clone: $userns"
echo "RESULT: $status"
printf 'WHY: %s\n' "${reason[*]}"
case "$status" in
PATCHED) exit 0 ;;
VULNERABLE) exit 1 ;;
*) exit 2 ;;
esac
If you remember one thing.
cifs-utils baked into the image. For a MEDIUM reassessment there is noisgate mitigation SLA: no mitigation SLA — go straight to the 365-day remediation window; use that window to either patch to your vendor's fixed kernel build or remove the exploit prerequisites from non-SMB clients. If you identify high-risk shared-compute segments, apply the request-key or userns mitigations early anyway, but the formal noisgate remediation SLA here is ≤ 365 days.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.