
Mergulho educacional aprofundado na proteção integrada contra malware da Apple: bancos de dados de assinaturas, regras YARA, integração com o Gatekeeper, binários de remediação e fluxo de detecção do macOS.
Dando continuidade à minha série de posts sobre introdução ao macOS, decidi dedicar um pequeno post ao XProtect.
O XProtect é o sistema antivírus e de assinaturas de malware integrado da Apple para macOS.
Ele opera como parte do XProtectService, que verifica aplicações e outros conteúdos executáveis em busca de assinaturas de malware conhecidas.
O XProtect funciona em segundo plano e é atualizado silenciosamente pela Apple por meio do mecanismo XProtectRemediator (mais sobre isso adiante).
Ele tem 3 funções principais:
O diretório /Library/Apple/System/Library/CoreServices/XProtect.bundle é o bundle principal que contém a configuração do XProtect e as definições de assinaturas.
Este é um diretório de sistema somente leitura e é atualizado silenciosamente pela Apple por meio de atualizações do XProtect.
Dentro dele, podemos encontrar alguns arquivos de interesse, todos atualizados periodicamente pela Apple e protegidos pela Proteção de Integridade do Sistema (SIP).
O arquivo /Library/Apple/System/Library/CoreServices/XProtect.bundle/Contents/Resources/XProtect.plist armazena assinaturas de malware usadas pelo XProtect para detectar ameaças conhecidas.
Ele contém entradas que mapeiam famílias de malware para regras de detecção específicas, incluindo hashes e padrões de nomes de arquivo.
Aqui está um exemplo de uma família de malware - Bundalore:
<dict>
<key>Description</key>
<string>OSX.Bundlore.D</string>
<key>LaunchServices</key>
<dict>
<key>LSItemContentType</key>
<string>com.apple.application-bundle</string>
</dict>
<key>Matches</key>
<array>
<dict>
<key>MatchFile</key>
<dict>
<key>NSURLTypeIdentifierKey</key>
<string>com.apple.applescript.script</string>
</dict>
<key>MatchType</key>
<string>Match</string>
<key>Pattern</key>
<string>46617364554153</string>
</dict>
<dict>
<key>MatchFile</key>
<dict>
<key>NSURLTypeIdentifierKey</key>
<string>com.apple.applescript.script</string>
</dict>
<key>MatchType</key>
<string>Match</string>
<key>Pattern</key>
<string>20006500630068006F002000</string>
</dict>
<dict>
<key>MatchFile</key>
<dict>
<key>NSURLTypeIdentifierKey</key>
<string>com.apple.applescript.script</string>
</dict>
<key>MatchType</key>
<string>Match</string>
<key>Pattern</key>
<string>20007C0020006F00700065006E00730073006C00200065006E00630020002D006100650073002D003200350036002D0063006600620020002D007000610073007300200070006100730073003A</string>
</dict>
<dict>
<key>MatchFile</key>
<dict>
<key>NSURLTypeIdentifierKey</key>
<string>com.apple.applescript.script</string>
</dict>
<key>MatchType</key>
<string>Match</string>
<key>Pattern</key>
<string>002D00730061006C00740020002D00410020002D00610020002D00640020007C002000620061007300680020002D0073</string>
</dict>
</array>
</dict>
Isso é bastante legível para humanos; a única parte digna de nota é que o argumento string em cada correspondência está em representação hexadecimal, por exemplo, 002D00730061006C00740020002D00410020002D00610020002D00640020007C002000620061007300680020002D0073 corresponde a -salt -A -a -d | bash -s.
Isso é, obviamente, uma mina de ouro para autores de malware, que sabem exatamente quais padrões evitar.
O arquivo /Library/Apple/System/Library/CoreServices/XProtect.bundle/XProtect.meta.plist é um arquivo de metadados que define regras adicionais para o XProtect, incluindo políticas de aplicação e informações de versionamento.
Ele especifica quais versões do macOS aplicam determinadas regras do XProtect e as ações tomadas após a detecção, bem como listas negras para plugins.
Aqui está um exemplo:
<key>JavaWebComponentVersionMinimum</key>
<string>1.6.0_45-b06-451</string>
<key>PlugInBlacklist</key>
<dict>
<key>10</key>
<dict>
<key>com.apple.java.JavaAppletPlugin</key>
<dict>
<key>MinimumPlugInBundleVersion</key>
<string>14.8.0</string>
<key>PlugInUpdateAvailable</key>
<true/>
</dict>
<key>com.apple.java.JavaPlugin2_NPAPI</key>
<dict>
<key>MinimumPlugInBundleVersion</key>
<string>14.8.0</string>
<key>PlugInUpdateAvailable</key>
<true/>
</dict>
<key>com.macromedia.Flash Player ESR.plugin</key>
<dict>
<key>MinimumPlugInBundleVersion</key>
<string>18.0.0.382</string>
<key>PlugInUpdateAvailable</key>
<true/>
</dict>
<key>com.macromedia.Flash Player.plugin</key>
<dict>
<key>MinimumPlugInBundleVersion</key>
<string>32.0.0.101</string>
<key>PlugInUpdateAvailable</key>
<true/>
</dict>
<key>com.microsoft.SilverlightPlugin</key>
<dict>
<key>MinimumPlugInBundleVersion</key>
<string>5.1.41212.0</string>
<key>PlugInUpdateAvailable</key>
<true/>
</dict>
<key>com.oracle.java.JavaAppletPlugin</key>
<dict>
<key>MinimumPlugInBundleVersion</key>
<string>1.8.51.16</string>
<key>PlugInUpdateAvailable</key>
<true/>
</dict>
</dict>
</dict>
Como você pode ver, eles contêm informações de versão para plugins na "lista negra", por exemplo.
Em versões recentes, o XProtect parece ter começado a suportar YARA.
O arquivo /Library/Apple/System/Library/CoreServices/XProtect.bundle/Contents/Resources/XProtect.yara contém várias regras YARA em formato de texto; aqui está um pequeno exemplo dele: