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
SnatchBox — SnatchBox (CVE-2020-27935) é uma vulnerabilidade de escape de sandbox e um exploit que afeta o macOS até a versão 10.15.x | Kitploit
Ferramentas/GitHubGitHub/liji32/snatchbox
Análise de VulnerabilidadesExploraçãoEngenharia ReversaDesenvolvimento de PayloadsExploração de Binários
GitHubliji32/snatchbox

SnatchBox

SnatchBox (CVE-2020-27935) é uma vulnerabilidade de escape de sandbox e um exploit que afeta o macOS até a versão 10.15.x

Ver Repositório
3251há 5 anosRevisado pelo Kitploit

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

SnatchBox

O SnatchBox (CVE-2020-27935) é uma vulnerabilidade de fuga da sandbox que afeta o macOS até a versão 10.15, bem como as primeiras versões beta do macOS 11.0. O impacto mais significativo do SnatchBox é que ele permite que um editor malicioso escape da sandbox não opcional da Mac App Store e obtenha acesso completo a todos os arquivos do usuário, quebrando o modelo de segurança da App Store no macOS.

A Vulnerabilidade

O fato de que no macOS, ao contrário do iOS por exemplo, uma tarefa do espaço do usuário se coloca voluntariamente em uma sandbox é vulnerável por design. Como esta é uma tarefa que um autor potencialmente malicioso tem controle quase total de seus mapeamentos de memória e conteúdos, e o código executado antes da inicialização da sandbox (por exemplo, o próprio dyld, ou o runtime Objective-C) analisa o conteúdo deste binário potencialmente malicioso, dados cuidadosamente elaborados podem ser usados para obter execução de código antes da inicialização da sandbox. Se o processo nunca executasse nenhum código, incluindo código dyld, antes de ser forçado a uma sandbox, isso não teria sido um problema, pois a execução antecipada de código não traria ganhos para o ataque nesse caso. É conceitualmente semelhante ao sandbox bypass de Saagar Jha, exceto que contorna as mitigações recém-introduzidas e as validações da App Store.

Exploração antes do 10.15

Antes do macOS 10.15, a exploração deste bug é bastante simples. Criar-se-ia um binário que contém uma categoria Objective-C para uma classe usada antes da inicialização da sandbox (como OS_xpc_object) e sobrescreveria um método (de preferência um herdado para evitar avisos em runtime) que é usado antes da inicialização da sandbox (como , que é chamado implicitamente no primeiro acesso a uma classe). Como as categorias são carregadas antes da inicialização da sandbox, e o primeiro acesso a (ou outras classes vítimas adequadas) é feito após o carregamento das categorias e antes da inicialização da sandbox, o método fornecido pelo atacante (ou outro método vítima adequado) será chamado antes da inicialização da sandbox, permitindo acessar dados fora do container, por exemplo. Alternativamente, o atacante pode substituir a referência a (que inicializa a sandbox) por uma função do tipo nop para (potencialmente condicionalmente) desativar a sandbox mesmo após retomar a execução.

+initialize
OS_xpc_object
+initialize
_libsecinit_initializer

Exploração no 10.15 e 11.0 beta

O runtime Objective-C usado no macOS 10.15 não é vulnerável à técnica de exploração detalhada anteriormente, porque as categorias não são carregadas antes de didCallDyldNotifyRegister ser definido, fazendo com que nosso método +initialize seja chamado apenas após a inicialização da sandbox.

No entanto, map_images ainda é chamado em nosso binário, tornando possível alterar dados do runtime de maneiras não intencionais que nos permitiriam executar código antes da inicialização da sandbox. A exploração completa e comentada está em main.c, mas abordarei os detalhes básicos aqui. Criamos uma estrutura de classe Objective-C cujo ponteiro data aponta para um local em libxbc.dylib. Esse local deve ser escolhido de forma que flags tenha o bit 31 (RW_REALIZED) definido, para que o runtime não tente realizar esta classe inválida e trave, e firstSubclass deve compartilhar seu endereço com o isa de uma classe que queremos sobrescrever. Outra (meta) classe herdará desta classe inválida e fornecerá seu próprio método +initialize. Adicionamos a subclasse a __objc_nlclslist para que o runtime realize esta classe.

Quando o runtime realiza nossa subclasse, o que acontece antes da inicialização da sandbox, ele chamará addSubclass em nossa superclasse inválida e subclasse, o que substituirá o isa da vítima por um ponteiro para nossa subclasse, efetivamente substituindo todos os seus métodos pelo nosso +initialize. Quando nosso método +initialize é chamado, o que será antes da inicialização da sandbox se escolhermos uma classe vítima adequada, podemos novamente substituir referências a _libsecinit_initializer por nops (condicionalmente ou não) e corrigir as alterações no runtime que fizemos para retomar a execução sem travar posteriormente.

Demonstração Fornecida

A demonstração fornecida pode ser construída executando make, criando um arquivo em ~/Documents/SecretDocument.txt e executando SnatchBox.app/Contents/MacOS/SnatchBox a partir do terminal (um bundle é criado porque é exigido por com.apple.security.app-sandbox, mas ainda é um programa de linha de comando). O binário construído é assinado com com.apple.security.app-sandbox, o que normalmente impediria o acesso a ~/Documents/SecretDocument.txt (pois não está em nosso container), mas será capaz de ler seus dados mesmo assim. Devido a alterações na estrutura do runtime, esta demonstração não funcionará no macOS 10.14 e anteriores sem modificações, mas funcionará no 10.15 e 11.0 (Testado: 10.15.4, 10.15.7 e 11.0 Beta (20A5354i)). As duas técnicas de exploração podem ser combinadas para atingir ambas as versões do runtime, mas tal demonstração não é fornecida.

Exemplo de execução:

root@kitploit:~
CatalinaVM:SnatchBox lior$ make
mkdir -p SnatchBox.app/Contents/MacOS/
clang -O3 -Wall -framework Foundation main.m -o SnatchBox.app/Contents/MacOS/SnatchBox
cp Info.plist SnatchBox.app/Contents/
codesign --force --sign - SnatchBox.app --entitlements ent.xml
CatalinaVM:SnatchBox lior$ echo "Quack"> ~/Documents/SecretDocument.txt
CatalinaVM:SnatchBox lior$ codesign -d --entitlements :- SnatchBox.app/Contents/MacOS/SnatchBox 
Executable=/Volumes/SharedFolders/Home/Projects/SnatchBox/SnatchBox.app/Contents/MacOS/SnatchBox
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.app-sandbox</key>
    <true/>
    <key>com.apple.security.files.user-selected.read-only</key>
    <true/>
</dict>
</plist>
CatalinaVM:SnatchBox lior$ SnatchBox.app/Contents/MacOS/SnatchBox 
Found libsecinit_initializer at 0x7fff72309124
Found libSystem.B.dylib at 0x7fff6f0de000
Found __DATA at 0x7fff984eeca0
Replacing libsecinit_initializer reference at 0x7fff984eed48 with a nop
2020-12-18 16:31:48.196 SnatchBox[804:8043] Attempting to read protected file: /Users/lior/Documents/SecretDocument.txt
2020-12-18 16:31:48.197 SnatchBox[804:8043] Escaped sandbox! The contents are: <51756163 6b0a>

Impacto

Como mencionado anteriormente, isso permite criar um aplicativo da Mac App Store que não é executado em uma sandbox, apesar de ser obrigado a fazê-lo pela política da App Store. A vulnerabilidade também pode ser usada em um framework, que pode ser usado por aplicativos da App Store que de outra forma seriam legítimos. Por último, pode até ser combinado com algo semelhante a "Xcode Ghost" para injetar em massa código malicioso que é executado fora da sandbox em aplicativos da App Store.

Correção

A Apple corrigiu a exploração durante a fase de testes beta do macOS 11.0 adicionando uma chamada a malloc_size em realizeClassWithoutSwift. Isso confirma que, se uma classe está marcada como realizada (RW_REALIZED, como nossa classe falsa), ela realmente tem um ponteiro de dados válido, mallocado, com o tamanho correto (0x20 bytes). Se não for o caso, o runtime abortará com uma mensagem semelhante a realized class 0x100002078 has corrupt data pointer 0x7fff88c00948. A correção também foi aplicada ao iOS, iPadOS, tvOS e watchOS; mesmo que não sejam diretamente afetados.

Baixar ferramenta