En la Conferencia Mundial de Desarrolladores (WWDC) de 2019, Apple anunció el lanzamiento de macOS Catalina y, junto con eso, las extensiones de sistema y algo que llamaron Endpoint Security Framework, o ESF.
Al año siguiente, en WWDC2020, hablaron sobre cómo construir herramientas (o aplicaciones) de seguridad para endpoints aprovechando ESF.
Una conversación sobre Endpoint Security de WWDC2019
Antes de entrar en detalle, vale la pena mencionar que, en algún momento desde su lanzamiento, ESF cambió de nombre, o al menos se pidió ser más específico al respecto. Por eso, haré lo posible por referirme a él como Endpoint Security o ES, aunque debo admitir que las viejas costumbres cuestan de dejar.
Solo un PSA de parte del equipo de ingeniería que trabaja en esto: no existe un único "Endpoint Security Framework" ni "ESF", es simplemente "Endpoint Security" o "ES" para abreviar, combinado opcionalmente con "API" si quieres sonar más sofisticado 👍
Just a PSA on behalf of the engineering folks who work on it: There is no single "Endpoint Security Framework" or "ESF", it's just "Endpoint Security" or "ES" for short, optionally combined with "API" if you want to be extra-fancy 👍
— Pepijn Bruienne 🐶🌲🧀💴 (@bruienne) October 6, 2022
Endpoint Security es un tema bastante complejo y profundo. Tomaría horas (¿días?) cubrir todo lo que ES puede hacer, pero quiero abordarlo desde algunos ángulos: una descripción general de alto nivel, un análisis más profundo de su funcionamiento y cómo los ingenieros de detección pueden potencialmente aprovechar parte de la información que ES ofrece.
Descripción general de alto nivel
Empecemos con un recorrido de alto nivel, no demasiado técnico, antes de sumergirnos en lo más profundo. Endpoint Security está disponible para quienes usan macOS Catalina, es decir, 10.15 o superior. Si no tienes este sistema operativo o uno más reciente, deberías tenerlo (a menos que tu equipo literalmente no pueda correr nada más nuevo). Una de las cosas más importantes para mantenerte a ti—y a tu Mac—seguro es mantener tu software y sistema operativo actualizados. Las fallas suelen corregirse con actualizaciones suplementarias o de seguridad, así que usar un sistema operativo desactualizado puede hacerte a ti o a tus usuarios más vulnerables a los exploits.
Para el usuario final, ES probablemente no significa mucho, pero para el software que corre en su Mac, significa mucho más. Empecemos por lo que ES permite. Su función principal es permitir que las aplicaciones busquen actividad maliciosa al dar visibilidad sobre ciertas partes del sistema. La actividad que ES devuelve luego se puede analizar, ya sea por una persona o por un servicio automatizado. Se puede revisar y, por lo tanto, bloquear esa actividad. Así es como operan los antivirus (AV) tradicionales de macOS: aprovechando Endpoint Security.
En contraste con ofrecer a las aplicaciones mayor visibilidad e información mediante ES, está la expansión de Apple de lo que yo llamo 'transparencia para el usuario final', que le da al usuario final conocimiento sobre lo que las aplicaciones hacen en el sistema. Aunque esto implica más alertas para el usuario y podría llevar a la fatiga por alertas, es un diseño intencional de Apple para dar a los usuarios más información sobre qué aplicaciones tienen acceso y visibilidad sobre su sistema. Esto significa que, al instalar cualquier tipo de extensión de sistema (en la que ES normalmente está incluido), sin importar si usa ES o no, se requiere aprobación explícita del usuario final (aunque esto no necesariamente aplica a los usuarios inscritos en un MDM, pero esa es una historia para otra publicación de blog).
No solo el usuario deberá aprobar la extensión de sistema, sino que también deberá otorgar permisos de Acceso Total al Disco (FDA) a la aplicación de ES. Por suerte, si esta aplicación usa una extensión de sistema, al instalarla, la solicitud de FDA se completa previamente con la Configuración del Sistema, lo que facilita un poco que el usuario o administrador acepte esta solicitud de FDA.
Profundizando más
Si exploramos un poco más a fondo, Endpoint Security es una API en C, que forma parte del framework de Extensiones de Sistema. La idea era que ES reemplazara algunas funciones distintas de macOS: la KPI de KAuth, las extensiones de kernel (kexts) y el registro de auditoría OpenBSM. Las extensiones de sistema son permisos otorgados por Apple para acceder a algunos de estos eventos de sistema de nivel más bajo. Si eres desarrollador, necesitarías tener el permiso com.apple.developer.endpoint-security.client para usar ES. Esto significa que tu aplicación podría desarrollarse para usar los eventos que genera Endpoint Security.
Un mecanismo de seguridad adicional que utiliza este proceso es la firma de código. Para solicitar y luego usar este permiso, debes contar con una licencia de desarrollador, o ID de Desarrollador/Equipo. Esta cadena alfanumérica de 10 dígitos vincula tu software con el desarrollador. Aunque existe lo que se conoce como un ID de equipo malicioso (alguien que usa su ID de Equipo con fines maliciosos), esto añade una capa extra de seguridad al proceso.
Al crear una extensión de sistema de ES, primero creas tu cliente de ES.
Una vez que tienes tu cliente, eliges a qué tipos de eventos quieres suscribirte mediante un flujo de eventos: ES_EVENT_TYPE_NOTIFY_EXEC, ES_EVENT_TYPE_AUTH_MOUNT, etc., etc.
Existen dos tipos de eventos, eventos NOTIFY y eventos AUTH (puedes ver el evento NOTIFY en la captura de pantalla anterior). Los eventos notify son justamente eso: te notifican que ocurrió un evento. Los eventos auth son distintos porque tu aplicación tiene la oportunidad de actuar frente a ellos primero, es decir, podrías potencialmente bloquear la ejecución de un proceso si te suscribes al evento ES_EVENT_TYPE_AUTH_EXEC.
Cuando tu aplicación recibe los mensajes del cliente que creaste, si se trata de un evento auth, puedes manejar esos casos. Esto se logra cuando tu aplicación pone en cola los mensajes y luego los maneja según las condiciones establecidas por la aplicación.
Como todo esto se maneja sin salir del kernel, si tu aplicación está configurada para bloquear ese proceso, se puede detener antes de que ejecute sus comandos.
Las extensiones del sistema, en general, también persisten, así que cuando el sistema arranca, estas extensiones se ejecutan e inician de inmediato. No necesitan iniciarse o activarse manualmente una vez que arranca la máquina, lo que puede hacer que tu aplicación funcione como un elemento de 'configúralo y olvídate'.
Detecciones
Es posible usar reglas de Sigma o escribir predicados con NSPredicate que pueden respaldarse con datos de ES. Estos se pueden ingerir en un SIEM para capturar e iterar sobre esos datos. Estas reglas te permiten observar eventos, o potencialmente, en el caso de eventos AUTH, actuar contra los procesos según tu lógica dentro de la aplicación.
Existen herramientas como eslogger de Apple (ver abajo), ESFPlayground de The Mitten Mac, o Appmon de Chris Ross que pueden imprimir datos sin procesar de eventos de Endpoint Security.
La salida es un robusto blob json con un montón de información que se puede analizar y procesar. Abajo tenemos un evento ES_EVENT_TYPE_NOTIFY_EXEC, o 'exec event', que ocurrió cuando simplemente abrimos la aplicación Calculadora.
La información que da este objeto, como event::exec::target::executable::path, te da la ruta del ejecutable, mientras que event::exec::args muestra los argumentos, como un arreglo, que se ejecutaron. Podríamos observar estos campos y, según su contenido, tomar una decisión informada según lo observado. Eso puede incluir cuál es la ruta, o usar alguna expresión regular para verificar casos muy específicos.
Algunos de los distintos tipos de eventos que pueden ser útiles al buscar detectar amenazas son:
Para mí, ES_EVENT_TYPE_NOTIFY_EXEC me da el beneficio más inmediato al analizar malware de macOS. Si vemos la muestra de abajo, podemos ver que el malware Shlayer ejecuta algunos comandos desde la línea de comandos. Podemos ver todos los argumentos, en un arreglo, que Shlayer ejecuta aquí. El comando real es openssl enc -base64 -d -aes-256-cbc -nosalt -pass pass:10595727573, que podemos ver en la línea 135 de esta salida de ES.
Vale la pena señalar que, aunque la información que estos eventos dan visibilidad es valiosa, algunos de estos eventos también pueden ser muy ruidosos, especialmente si tienes mucho ruido en tu sistema (un MDM que ejecuta constantemente system_profiler, por ejemplo 🙈).
Además, existen algunas constantes que los analistas de detección pueden encontrar útiles.
La lista completa de eventos está disponible en es_event_type_t, y, obviamente, se pueden usar de cualquier manera que encuentres valiosa.
Epílogo
Endpoint Security, aunque todavía es relativamente nuevo en comparación con otras funciones de macOS, es posiblemente uno de los mayores cambios de juego para el stack de seguridad de macOS. Da información y contexto invaluables sobre los procesos y archivos que se ejecutan y cambian en tu sistema. Por dentro, es complejo, pero con muchas herramientas distintas es posible entender bien qué está pasando en tu sistema y protegerte contra actividad maliciosa.
ES está diseñado para dar a las aplicaciones de seguridad acceso más detallado a los eventos del sistema, todo mientras pueden evitar la interacción directa con el kernel. Al final, esto reitera la postura de Apple sobre proteger a sus usuarios finales.