
Script de detecção para CIFSwitch - CVE-2026-46243
Um script de shell para verificar se um sistema Linux está exposto a CIFSwitch (CVE-2026-46243) — uma vulnerabilidade de escalonamento local de privilégios no cliente CIFS/SMB do kernel Linux que existe desde 2007.
Funciona em hosts bare-metal, VMs e dentro de contêineres. Projetado para ser integrado diretamente em pipelines de CI/CD.
O CIFSwitch foi divulgado em 28 de maio de 2026 pelo pesquisador de segurança Asim Manizada. A falha combina uma validação de entrada ausente no tipo de chave cifs.spnego do kernel com o auxiliar cifs.upcall com privilégios de root do cifs-utils.
Um usuário local sem privilégios pode chamar request_key() com uma descrição de chave forjada, fazendo o kernel invocar cifs.upcall como root com campos controlados pelo atacante. Com upcall_target=app, o auxiliar entra no namespace de montagem do atacante e realiza uma consulta getpwuid() antes de abandonar privilégios — carregando um módulo NSS controlado pelo atacante e executando código arbitrário como root.
Pré-requisitos para exploração:
cifs-utils >= 6.14 instaladoUm PoC público está disponível em manizada/CIFSwitch.
# Clone or download
curl -O https://raw.githubusercontent.com/liamromanis101/cifswitch-check/main/cifswitch-check.sh
chmod +x cifswitch-check.sh
# Run interactively (coloured output)
./cifswitch-check.sh
# Quiet mode — only FAILs and final verdict
./cifswitch-check.sh --quiet
# JSON output — for CI/CD pipelines, SIEM ingestion
./cifswitch-check.sh --ci
# No colour (plain text, useful for logging)
./cifswitch-check.sh --no-colour
# This script is also available as a SKILL from Agensi:
https://www.agensi.io/skills/cve-2026-46243-cifswitch
| Código | Significado |
|---|---|
0 | Não vulnerável, ou todas as mitigações críticas em vigor |
1 | Vulnerável — uma ou mais verificações FAIL |
2 | Erro no script |
CIFSwitch Vulnerability Check (CVE-2026-46243)
Kernel: 6.18.5 Host: myserver Container: false
────────────────────────────────────────────────────────────────────────
[FAIL] KERNEL_VERSION Kernel 6.18.5 appears unpatched. Fixed in: >= 6.18.22, >= 6.19.12, >= 7.0. Update your kernel.
[PASS] CIFS_UTILS cifs-utils NOT installed — cifs.upcall helper absent, attack chain is broken
[PASS] CIFS_MODULE CIFS kernel module not present on this system
[FAIL] USERNS user.max_user_namespaces = 15980 (non-zero). Disable to block namespace step:
[PASS] REQUESTKEY_RULE No cifs.spnego request-key rule found — rootful cifs.upcall will not be invoked
[WARN] MAC_POLICY No enforcing MAC policy (SELinux/AppArmor) detected
[ -- ] FIX_SYMBOL CIFS module not loaded — symbol check skipped
────────────────────────────────────────────────────────────────────────
VERDICT: VULNERABLE — remediation required
Reference: https://heyitsas.im/posts/cifswitch/
--ci){
"scanner": "cifswitch-check",
"cve": "CVE-2026-46243",
"timestamp": "2026-06-03T00:10:08Z",
"hostname": "myserver",
"kernel": "6.18.5",
"in_container": false,
"overall": "FAIL",
"checks": [
{"check": "KERNEL_VERSION", "status": "FAIL", "detail": "Kernel 6.18.5 appears unpatched. Fixed in: >= 6.18.22, >= 6.19.12, >= 7.0. Update your kernel."},
{"check": "CIFS_UTILS", "status": "PASS", "detail": "cifs-utils NOT installed — cifs.upcall helper absent, attack chain is broken"},
{"check": "CIFS_MODULE", "status": "PASS", "detail": "CIFS kernel module not present on this system"},
{"check": "USERNS", "status": "FAIL", "detail": "user.max_user_namespaces = 15980 (non-zero). Disable to block namespace step:"},
{"check": "REQUESTKEY_RULE","status": "PASS", "detail": "No cifs.spnego request-key rule found — rootful cifs.upcall will not be invoked"},
{"check": "MAC_POLICY", "status": "WARN", "detail": "No enforcing MAC policy (SELinux/AppArmor) detected"},
{"check": "FIX_SYMBOL", "status": "INFO", "detail": "CIFS module not loaded — symbol check skipped"}
]
}
- name: CIFSwitch vulnerability check
run: |
chmod +x ./cifswitch-check.sh
./cifswitch-check.sh --ci | tee cifswitch-result.json
# Exit code 1 will fail the step if the runner is vulnerable
cifswitch-check:
stage: security
script:
- chmod +x cifswitch-check.sh
- ./cifswitch-check.sh --ci > cifswitch-result.json
artifacts:
paths:
- cifswitch-result.json
stage('CIFSwitch Check') {
steps {
sh 'chmod +x cifswitch-check.sh && ./cifswitch-check.sh --ci > cifswitch-result.json'
archiveArtifacts artifacts: 'cifswitch-result.json'
}
}
1. Corrija seu kernel (quando o pacote da sua distribuição estiver disponível)
A correção a montante é o commit 3da1fdf4efbc, programado para estável nos kernels >= 6.18.22, >= 6.19.12 e >= 7.0. Backports das distribuições estão sendo lançados ativamente — consulte o aviso de segurança do seu fornecedor para CVE-2026-46243. Até que um pacote esteja disponível, aplique as mitigações abaixo.
2. Remova o cifs-utils (interrompe totalmente a cadeia de ataque se você não usar montagens CIFS/SMB)
apt remove cifs-utils # Debian / Ubuntu
dnf remove cifs-utils # RHEL / Fedora / AlmaLinux
2. Desative namespaces de usuário sem privilégios (bloqueia a etapa de pivô de namespace)
# Debian / Ubuntu
sysctl -w kernel.unprivileged_userns_clone=0
echo 'kernel.unprivileged_userns_clone=0' >> /etc/sysctl.d/99-cifswitch.conf
# RHEL / Fedora / upstream
sysctl -w user.max_user_namespaces=0
⚠️ Isso pode quebrar o Flatpak, o Podman/Docker sem root e o sandboxing do Chrome/Chromium.
3. Desative a regra request-key cifs.spnego
sed -i 's|^create cifs.spnego|#create cifs.spnego|' /etc/request-key.d/cifs.spnego.conf
4. Coloque o módulo do kernel CIFS na lista negra (se montagens de rede SMB não estiverem em uso)
echo 'blacklist cifs' >> /etc/modprobe.d/blacklist-cifs.conf
rmmod cifs 2>/dev/null || true
depmod -a
A explorabilidade exige cifs-utils >= 6.14 instalado e namespaces de usuário sem privilégios habilitados. As distribuições confirmadas como vulneráveis na configuração padrão incluem AlmaLinux 8/9, RHEL 8/9, CloudLinux 8/9/10 e várias versões do Ubuntu/Debian com cifs-utils presente.
Distribuições onde o SELinux/AppArmor padrão impede a exploração: Ubuntu 26.04, Fedora 40–44, CentOS Stream 10, Rocky Linux 10, AlmaLinux 10, SLES 16, openSUSE Leap 16.
Não afetadas: Amazon Linux 2, Kali Linux 2019.4/2020.4 (as versões do cifs-utils não possuem troca de namespace).
Para kernels de distribuições RHEL/CentOS/Amazon, o script segue o aviso do fornecedor, pois o status do backport não pode ser determinado de forma confiável apenas pela string de versão.
bash >= 4.0awk, grep, cut, find, sort)CAP_SYSLOG) é necessário para a verificação de símbolo do kernel (FIX_SYMBOL)Este script é fornecido para fins defensivos — para ajudar administradores a avaliar e remediar a exposição. Ele realiza verificações somente leitura e não faz alterações no sistema. O exploit PoC não está incluído nem vinculado aqui; consulte o aviso do pesquisador original para isso.
| Verificação | Descrição |
|---|
KERNEL_VERSION | Compara o kernel em execução com as versões corrigidas a montante (nota: pacotes das distribuições ainda estão sendo lançados) |
CIFS_UTILS | Detecta a instalação do cifs-utils e a versão explorável (>= 6.14) |
CIFS_MODULE | Verifica se o módulo do kernel CIFS está carregado, embutido ou na lista negra |
USERNS | Lê o sysctl kernel.unprivileged_userns_clone ou user.max_user_namespaces |
REQUESTKEY_RULE | Verifica se há uma regra cifs.spnego ativa chamando cifs.upcall |
MAC_POLICY | Detecta SELinux ou AppArmor em modo enforcing (bloqueia a exploração em distribuições corrigidas) |
CONTAINER_CAPS | Em contêineres: verifica a presença de CAP_SYS_ADMIN (permite userns sem restrições) |
CONTAINER_PROC | Em contêineres: verifica acesso de escrita a /proc/sys (contêiner privilegiado) |
FIX_SYMBOL | Se o CIFS estiver carregado e /proc/kallsyms for legível: verifica se o símbolo do commit de correção está presente |