
Análisis educativo en profundidad de los bundles de aplicaciones de macOS, los archivos plist y el comportamiento de los procesos launchd, con notas de seguridad ofensiva sobre el empaquetado de payloads como archivos .app y la evasión de la monitorización del árbol de procesos.
Transicionar a macOS desde Linux o Windows puede sentirse como caminar por una tierra nueva y desconocida. Dado que Linux es de código abierto y Windows está bien documentado y es muy popular (y macOS no es ninguna de las dos cosas, exactamente), macOS puede resultar desafiante en ocasiones. En esta entrada de blog, pretendo hablar sobre algunas de las primeras cosas que podrías notar en macOS: ¡Apps, Apps por todas partes!
Si vienes de un entorno Windows o Linux, el concepto de Apps puede parecer extraño. Todos sabemos que los hilos son "unidades de ejecución" y que los procesos son contenedores de hilos con su propio espacio de direcciones; ¿qué más hay que saber? Bueno, los procesos rara vez se despliegan en un único archivo. Tanto en Windows como en Linux hay muchas cosas que el código podría necesitar para funcionar; algunas de ellas son:
.dll, .so). Por ejemplo, la biblioteca de runtime de C (msvcr<version>.dll en Windows, libc-<version>.so) así como otras dependencias.PE, que tiene directorios; uno de ellos es el directorio de recursos (incluso algo documentado aquí) que puede contener recursos (imágenes, cadenas y otros). Los recursos también podrían cargarse dinámicamente desde el disco, por supuesto.PE (lee aquí) o en archivos de catálogo (es decir, externamente).xml, ini, json) y el Registro de Windows.Bueno, macOS pone un fuerte énfasis en los Application Bundles. La idea es empaquetar (casi) todo lo necesario para que el programa se ejecute en una estructura de directorios, incluyendo recursos, información de localización, etc. Por supuesto, no todo puede empaquetarse de forma ordenada (como la biblioteca de runtime de C, por ejemplo), pero eso sigue significando que las cosas están empaquetadas de forma ordenada: no hay necesidad de navegar por un enorme Registro o leer páginas de manual para ubicaciones oscuras de archivos de configuración. Los application bundles son simplemente directorios que terminan en .app, aunque la interfaz de usuario oculta la extensión .app (y el hecho de que es un directorio).
Desde la perspectiva de un atacante, esto es interesante, ya que un Application Bundle puede tener iconos arbitrarios y ocultar la extensión .app; la entrega de malware podría lograrse engañando a un usuario desprevenido para que haga clic en dicha app. Por ejemplo, piensa en un archivo Resume.app con un icono de PDF.
La estructura de directorios de un Application Bundle puede examinarse fácilmente, obviamente con la App Calculator integrada:
jbo@McJbo ~ % cd /System/Applications/Calculator.app
jbo@McJbo Calculator.app % ll
total 0
drwxr-xr-x 3 root wheel 96 Mar 17 21:34 .
drwxr-xr-x 43 root wheel 1376 Mar 17 21:34 ..
drwxr-xr-x 9 root wheel 288 Mar 17 21:34 Contents
jbo@McJbo Calculator.app % cd Contents
jbo@McJbo Contents % ll
total 16
drwxr-xr-x 9 root wheel 288 Mar 17 21:34 .
drwxr-xr-x 3 root wheel 96 Mar 17 21:34 ..
-rw-r--r-- 1 root wheel 2147 Mar 17 21:34 Info.plist
drwxr-xr-x 3 root wheel 96 Mar 17 21:34 MacOS
-rw-r--r-- 204 root wheel 8 Mar 17 21:34 PkgInfo
drwxr-xr-x 4 root wheel 128 Mar 17 21:34 PlugIns
drwxr-xr-x 54 root wheel 1728 Mar 17 21:34 Resources
drwxr-xr-x 3 root wheel 96 Mar 17 21:34 _CodeSignature
-rw-r--r-- 1 root wheel 461 Mar 17 21:34 version.plist
jbo@McJbo Contents % cd MacOS
jbo@McJbo MacOS % ll
total 344
drwxr-xr-x 3 root wheel 96 Mar 17 21:34 .
drwxr-xr-x 9 root wheel 288 Mar 17 21:34 ..
-rwxr-xr-x 1 root wheel 540912 Mar 17 21:34 Calculator
jbo@McJbo MacOS %
Como puedes ver, Calculator.app es un directorio. Dentro hay un único elemento: otro directorio llamado Contents.
Bajo Contents hay múltiples elementos:
Info.plist - contiene metadatos de la App. Más sobre esto más adelante.MacOS - contiene el ejecutable principal de la App (como se puede ver en el tercer listado de directorio).PkgInfo - no obligatorio. Un archivo binario que contiene información del paquete.PlugIns - no obligatorio. Un directorio que podría contener plugins para la App. Calculator tiene dos: uno para "Básica y científica" y otro para "Hexadecimal" (realmente no sé por qué hicieron esa separación, ni me importa).Resources - no obligatorio. Como su nombre sugiere, contiene recursos. Puedes encontrar varios elementos allí, incluyendo un archivo .icns con iconos, así como directorios con el sufijo .lprroj que están relacionados con la localización._CodeSignature - no obligatorio. Como su nombre sugiere - contiene información de firma de código.version.plist - no obligatorio, contiene información de versión.Ten en cuenta que hay muy pocos elementos que sean oficialmente requeridos. De hecho, ¡podemos crear nuestra primera App sin siquiera compilar nada!
Pero primero debemos hablar sobre ese archivo Info.plist.
Cuanto más miras macOS, más encontrarás esos extraños archivos. No son más que archivos de configuración glorificados.
Siempre tendrán una extensión .plist, que es solo una forma abreviada de llamar a su nombre formal: archivos Property list.
Desafortunadamente, hay 3 formatos diferentes de plist mantenidos por Apple:
xml, legible por humanos.json, no muy utilizado.bplist como magic number.Afortunadamente, hay una utilidad llamada plutil que soporta todos los formatos. Para mostrar un archivo plist, simplemente usa plutil -p. Por ejemplo:
jbo@McJbo Contents % plutil -p Info.plist | head -n 20
{
"BuildMachineOSBuild" => "22A380007"
"CFBundleDevelopmentRegion" => "English"
"CFBundleExecutable" => "Calculator"
"CFBundleGetInfoString" => "10.14, Copyright © 2000-2018, Apple Inc."
"CFBundleHelpBookFolder" => "Calculator.help"
"CFBundleHelpBookName" => "com.apple.Calculator.help"
"CFBundleIconFile" => "AppIcon"
"CFBundleIconName" => "AppIcon"
"CFBundleIdentifier" => "com.apple.calculator"
"CFBundleInfoDictionaryVersion" => "6.0"
"CFBundleName" => "Calculator"
"CFBundlePackageType" => "APPL"
"CFBundleShortVersionString" => "10.16"
"CFBundleSignature" => "????"
"CFBundleSupportedPlatforms" => [
0 => "MacOSX"
]
"CFBundleVersion" => "223"
"CTIgnoreUserFonts" => 1
jbo@McJbo Contents %