
Análisis educativo en profundidad de la protección antimalware integrada de Apple: bases de datos de firmas, reglas YARA, integración con Gatekeeper, binarios de remediación y flujo de detección de macOS.
Continuando con mi serie de entradas de blog sobre introducción a macOS, he decidido dedicar una breve entrada a XProtect.
XProtect es el antivirus y sistema de firmas de malware integrado de Apple para macOS.
Funciona como parte de XProtectService, que analiza aplicaciones y otro contenido ejecutable en busca de firmas de malware conocidas.
XProtect trabaja en segundo plano y Apple lo actualiza silenciosamente mediante el mecanismo XProtectRemediator (más sobre esto más adelante).
Tiene 3 funciones principales:
El directorio /Library/Apple/System/Library/CoreServices/XProtect.bundle es el paquete principal que contiene la configuración de XProtect y las definiciones de firmas.
Es un directorio de solo lectura del sistema y Apple lo actualiza silenciosamente mediante las actualizaciones de XProtect.
Dentro de él, podemos encontrar algunos archivos de interés, todos actualizados periódicamente por Apple y protegidos por Protección de Integridad del Sistema (SIP).
El archivo /Library/Apple/System/Library/CoreServices/XProtect.bundle/Contents/Resources/XProtect.plist almacena las firmas de malware que XProtect utiliza para detectar amenazas conocidas.
Contiene entradas que asignan familias de malware a reglas de detección específicas, incluidos hashes y patrones de nombres de archivo.
Aquí hay un ejemplo de una familia 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>46617364654153</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>
Esto es bastante legible para humanos; lo único digno de mención es que el argumento string en cada coincidencia está en representación hexadecimal, p. ej., 002D00730061006C00740020002D00410020002D00610020002D00640020007C002000620061007300680020002D0073 corresponde a -salt -A -a -d | bash -s.
Esto es, por supuesto, una mina de oro para los autores de malware, que saben exactamente qué patrones evitar.
El archivo /Library/Apple/System/Library/CoreServices/XProtect.bundle/XProtect.meta.plist es un archivo de metadatos que define reglas adicionales para XProtect, incluidas políticas de aplicación y información de versiones.
Especifica qué versiones de macOS aplican ciertas reglas de XProtect y las acciones tomadas tras la detección, así como listas negras para plugins.
Aquí hay un ejemplo:
<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 puedes ver, estos contienen información de versión para plugins "en lista negra", por ejemplo.
En versiones recientes, XProtect parece haber comenzado a soportar YARA.
El archivo /Library/Apple/System/Library/CoreServices/XProtect.bundle/Contents/Resources/XProtect.yara contiene varias reglas YARA en formato de texto; aquí hay un breve ejemplo:
rule XProtect_MACOS_SLEEPYSTEGOSAURUS_SYM {
meta:
description = "MACOS.SLEEPYSTEGOSAURUS.SYM"
uuid = "BB4F7D16-C939-4047-A9AF-E74E7B51FAC1"
strings:
$a1 = { 45 78 65 63 43 6D 64 }
$a2 = { 47 65 74 48 6F 73 74 49 6E 66 6F }
$a3 = { 52 75 6E 53 63 72 69 70 74 }
$a4 = { 52 75 6E 53 63 72 69 70 74 55 72 6C }
$a5 = { 4C 61 75 6E 63 68 50 6C 69 73 74 }
$a6 = { 43 68 65 63 6B 50 72 6F 63 65 73 73 }
$a7 = { 43 68 65 63 6B 49 6E }
$a8 = { 52 75 6E 43 6D 64 46 69 6C 65 }
$a9 = { 53 68 6F 77 48 74 6D 6C }
$a10 = { 50 6C 69 73 74 48 65 6C 70 65 72 }
$a11 = { 4C 61 75 6E 63 68 64 48 65 6C 70 65 72 }
$a12 = { 43 6F 6D 6D 61 6E 64 46 69 6C 65 }
$a13 = { 57 72 69 74 65 50 6C 69 73 74 }
$a14 = { 4A 53 4F 4E 46 69 6C 65 50 72 6F 63 65 73 73 6F 72 }
$a15 = { 43 68 72 6F 6D 65 48 65 6C 70 65 72 }
$a16 = { 53 61 6E 64 62 6F 78 65 72 }
condition:
Macho and filesize < 2MB and all of them
}
Esta no es una entrada de blog sobre reglas YARA, pero como antes: esto es una mina de oro para los autores de malware (p. ej., 43 68 65 63 6B 50 72 6F 63 65 73 73 es CheckProcess).
Aquí puedes ver cómo Apple diseñó XProtect para integrarse con Gatekeeper, aunque este archivo es utilizado principalmente por syspolicyd.
El archivo /Library/Apple/System/Library/CoreServices/XProtect.bundle/Contents/Resources/gk.db es una base de datos SQLite que contiene una "lista negra" de hashes de archivos e IDs de equipo a bloquear.
Puedes verla con la utilidad sqlite3:
jbo@McJbo ~ $ sqlite3 "/Library/Apple/System/Library/CoreServices/XProtect.bundle/Contents/Resources/gk.db" .schema
CREATE TABLE settings (name TEXT, value TEXT, PRIMARY KEY (name));
CREATE TABLE blocked_hashes (hash BLOB, hash_type INTEGER, flags INTEGER, PRIMARY KEY (hash, hash_type));
CREATE TABLE blocked_teams (team_id TEXT, flags INTEGER, PRIMARY KEY (team_id));
jbo@McJbo ~ $ sqlite3 "/Library/Apple/System/Library/CoreServices/XProtect.bundle/Contents/Resources/gk.db" "SELECT * FROM blocked_teams LIMIT 5;"
F9X83Q5222|1
Q6XAB4776L|0
DK5C9Y86C8|0
8VK2WEPW22|0
5LWMEF3EX3|0
jbo@McJbo ~ $
Esta es nuevamente información interesante para los autores de malware, por ejemplo, para saber cuándo el ID de equipo que usaron para firmar su malware está en el radar de Apple.
Mientras que el binario XProtect se encuentra en /Library/Apple/System/Library/CoreServices/XProtect.app/Contents/MacOS/, encontrarás binarios adicionales allí.
Esos son archivos de remediación para familias específicas:
jbo@McJbo ~ $ ls -l /Library/Apple/System/Library/CoreServices/XProtect.app/Contents/MacOS/
total 47256
-rwxr-xr-x 1 root wheel 513696 Feb 27 16:54 XProtect
-rwxr-xr-x 1 root wheel 2498784 Feb 27 16:54 XProtectRemediatorAdload
-rwxr-xr-x 1 root wheel 2367952 Feb 27 16:54 XProtectRemediatorBadGacha
-rwxr-xr-x 1 root wheel 2053968 Feb 27 16:54 XProtectRemediatorBlueTop
-rwxr-xr-x 1 root wheel 2332752 Feb 27 16:54 XProtectRemediatorBundlore
-rwxr-xr-x 1 root wheel 2299648 Feb 27 16:54 XProtectRemediatorCardboardCutout
-rwxr-xr-x 1 root wheel 2333248 Feb 27 16:54 XProtectRemediatorColdSnap
-rwxr-xr-x 1 root wheel 2052736 Feb 27 16:54 XProtectRemediatorCrapyrator
-rwxr-xr-x 1 root wheel 2859040 Feb 27 16:54 XProtectRemediatorDolittle
-rwxr-xr-x 1 root wheel 2205520 Feb 27 16:54 XProtectRemediatorDubRobber
-rwxr-xr-x 1 root wheel 2334752 Feb 27 16:54 XProtectRemediatorEicar
-rwxr-xr-x 1 root wheel 2053120 Feb 27 16:54 XProtectRemediatorFloppyFlipper
-rwxr-xr-x 1 root wheel 2053616 Feb 27 16:54 XProtectRemediatorGenieo
-rwxr-xr-x 1 root wheel 2053504 Feb 27 16:54 XProtectRemediatorGreenAcre
-rwxr-xr-x 1 root wheel 2332800 Feb 27 16:54 XProtectRemediatorKeySteal
-rwxr-xr-x 1 root wheel 4659088 Feb 27 16:54 XProtectRemediatorMRTv3
-rwxr-xr-x 1 root wheel 2382448 Feb 27 16:54 XProtectRemediatorPirrit
-rwxr-xr-x 1 root wheel 2333024 Feb 27 16:54 XProtectRemediatorRankStank
-rwxr-xr-x 1 root wheel 2299728 Feb 27 16:54 XProtectRemediatorRoachFlight
-rwxr-xr-x 1 root wheel 2384416 Feb 27 16:54 XProtectRemediatorSheepSwap
-rwxr-xr-x 1 root wheel 2053232 Feb 27 16:54 XProtectRemediatorSnowBeagle
-rwxr-xr-x 1 root wheel 2350624 Feb 27 16:54 XProtectRemediatorSnowDrift
-rwxr-xr-x 1 root wheel 2019712 Feb 27 16:54 XProtectRemediatorToyDrop
-rwxr-xr-x 1 root wheel 2105696 Feb 27 16:54 XProtectRemediatorTrovi
-rwxr-xr-x 1 root wheel 2332768 Feb 27 16:54 XProtectRemediatorWaterNet
jbo@McJbo ~ $
Una nueva aplicación de sistema XProtect almacenada como /Library/Apple/System/Library/CoreServices/XProtect.app se introdujo en macOS Monterey y es responsable de ejecutar XProtect Remediator.
A diferencia del XProtect tradicional (que usaba principalmente detección basada en firmas), XProtect Remediator analiza y elimina activamente malware de los sistemas infectados.
Se ejecuta como un proceso en segundo plano y puede eliminar automáticamente amenazas detectadas sin intervención del usuario.
El directorio /Library/Apple/System/Library/CoreServices/XProtect.app/Contents/Resources contiene scripts de remediación y lógica de detección adicional para el análisis activo.
El archivo /Library/Apple/System/Library/CoreServices/XProtect.app/Contents/Resources/com.apple.XProtect.agent.scan.plist contiene configuraciones sobre cuándo ejecutar análisis periódicos.
Por ejemplo:
<key>com.apple.XProtect.PluginService.agent.slow.scan</key>
<dict>
<key>Repeating</key>
<true/>
<key>PowerNap</key>
<true/>
<key>CPUIntensive</key>
<true/>
<key>DiskIntensive</key>
<true/>
<key>AllowBattery</key>
<false/>
<key>Priority</key>
<string>Utility</string>
<key>Interval</key>
<integer>604800</integer>
</dict>
Esto muestra ciertas condiciones de rendimiento e incluso el período del análisis (604800 segundos = una vez cada 7 días).
Algunos de vosotros habréis oído hablar de MRT (Malware Removal Tool).
Almacenado en /Library/Apple/System/Library/CoreServices/MRT.app, MRT es otro componente de seguridad de macOS que trabaja junto con XProtect.
Es responsable de eliminar el malware que XProtect ha detectado y opera silenciosamente en segundo plano.
MRT es más agresivo que XProtect a la hora de erradicar amenazas detectadas y puede eliminar archivos maliciosos incluso si se están ejecutando actualmente.
Ten en cuenta que, a diferencia de XProtect, MRT no mantiene archivos de configuración: todo está integrado en el binario.
Incluso mirar las cadenas del binario principal (/Library/Apple/System/Library/CoreServices/MRT.app/Contents/MacOS/MRT) revela cadenas interesantes, p. ej.:
import sys,base64;exec(base64.b64decode('
import sys,base64,warnings;warnings.filterwarnings('ignore');exec(base64.b64decode('
import sys;import re, subprocess;cmd = "ps -ef | grep Little\ Snitch | grep -v grep"
Cuando un archivo se descarga mediante un navegador o una aplicación (p. ej., Safari, Mail, Mensajes), se marca con un atributo de cuarentena (com.apple.quarantine): ya mencioné ese atributo en mi entrada de blog anterior sobre Gatekeeper.
Gatekeeper comprueba si el archivo está firmado y notarizado. Si no lo está, el usuario recibe una advertencia antes de la ejecución.
Si se permite la ejecución, XProtect analiza el archivo contra sus firmas de malware conocidas (de XProtect.plist, XProtect.yara, etc.).
Si se detecta malware, el sistema impide la ejecución. Si el malware es conocido y puede remediarse, XProtect Remediator o MRT pueden eliminarlo o neutralizarlo.
Apple actualiza XProtect, MRT y XProtect Remediator silenciosamente en segundo plano mediante el proceso XProtectService.
A principios de este año, CheckPoint publicó una entrada de blog sobre una muestra de malware denominada Banshee.
Esto recibió bastante atención porque utilizaba el mismo algoritmo de cifrado que los binarios de XProtect Remediator usan para "ocultar sus reglas YARA".
El algoritmo en sí es simple:
def macos_xprotect_string_decryption(encrypted: bytes, encr_key: int) -> str:
"""
Author: @Check Point Research
Decrypts MacOS Xprotect binaries & Banshee Stealer encrypted strings.
"""
decrypted = "".join(
chr(
(encr_key >> ((i * 8) & 0x38) & 0xFF) ^ encrypted[i]
)
for i in range(len(encrypted))
)
return decrypted.partition("\\x00")[0]
Obviamente, los autores de malware pensaron que este algoritmo no se puede firmar estáticamente (ya que está garantizado que generará falsos positivos).
Encontré un código similar en la mayoría de los binarios de remediación, p. ej.:
10000592a if (data_1000ffe7e != 0)
10000592c void* rax_1 = &data_1000fb0a0
100005933 int64_t i = 0
100005951 do
100005940 *rax_1 = *rax_1 ^ (0x363a34363a303900 u>> (i.b & 0x38)).b
100005943 i = i + 8
100005947 rax_1 = rax_1 + 1
100005951 while (i != 0x26ef0)
100005953 data_1000ffe7e = 0
El investigador de seguridad que inicialmente descubrió esto (ald3ns) ha lanzado una herramienta llamada XPR-dump que parece seguir funcionando con la versión más reciente de XProtect. ¡Definitivamente deberías echarle un vistazo!
La conclusión más importante de esta entrada de blog es que XProtect juega al gato y al ratón con los atacantes (como cualquier antivirus): las listas negras, la ejecución de YARA o las simples firmas estáticas están todas en el ámbito.
El hecho de que esos archivos se desplieguen en todos los endpoints y sean fáciles de analizar hace que sea bastante fácil para los autores de malware encontrar evasiones simples para muchas de esas comprobaciones.
¡Mantente atento!
Jonathan Bar Or (https://jonathanbaror.com)