Ítems de inicio y base de datos BTM en macOS
Los ítems de inicio y el almacén Background Task Management (Ventura+) listan ítems, agentes y daemons con desarrollador, team ID y estado de aprobación.
- Ubicación
- /private/var/db/com.apple.backgroundtaskmanagement/BackgroundItems-v*.btm
- Prueba
- Qué ítems de inicio, agentes y daemons se registraron, de qué desarrollador, y si se permitieron
- Marcas de tiempo
- Fechas NSKeyedArchiver (Mac absolute time, UTC) más las horas del sistema de archivos
- Acceso
- root y Full Disk Access (almacén BTM); usuario propietario (backgrounditems.btm heredado)
- Retención
- Hasta que se elimina el ítem o sfltool resetbtm reconstruye el almacén
- Adquisición
- Aftermath, sfltool dumpbtm, ditto
Herramientas
Comparar todas las herramientas- DumpBTMCLI · código abierto
- bgiparserCLI · código abierto
- PlasoCLI · código abierto
- sfltoolCLI · incluido en macOS
Qué es
Los ítems de inicio (Login Items) son apps y auxiliares que se inician cuando un usuario inicia sesión. Su almacenamiento ha cambiado dos veces, lo que da tres formatos. Hasta macOS 10.12 residían en un plist de preferencias; desde 10.13 High Sierra los guardaba un archivo backgrounditems.btm por usuario, como datos de bookmark. macOS 13 Ventura introdujo Background Task Management (BTM): un único almacén del sistema, gestionado por backgroundtaskmanagementd, que controla conjuntamente ítems de inicio, launch agents y launch daemons, alimenta el panel Ítems de inicio de Ajustes del Sistema y avisa al usuario cuando se añade un nuevo ítem en segundo plano.
Para los investigadores, BTM es valioso porque atribuye cada ítem a un desarrollador y a un team ID, y puede conservar un registro después de que desaparezcan el plist o la app que lo crearon.
Dónde se encuentra
| macOS | Ruta | Formato | Protección |
|---|---|---|---|
| hasta 10.12 | ~/Library/Preferences/com.apple.loginitems.plist | plist | Usuario |
| 10.13-12 | ~/Library/Application Support/com.apple.backgroundtaskmanagementagent/backgrounditems.btm | Plist binario, NSKeyedArchiver con blobs de bookmark | Usuario |
| 13 Ventura+ | /private/var/db/com.apple.backgroundtaskmanagement/BackgroundItems-v<N>.btm | Plist binario, NSKeyedArchiver | root + Full Disk Access |
| Todas | /private/var/db/com.apple.xpc.launchd/loginitems.<UID>.plist | plist | Ítems de inicio de Service Management (SMLoginItemSetEnabled) |
El <N> cambia con las versiones (v4 era el nombre usado cuando salió Ventura, v7 se vio en 13.2 y se ha documentado v16 en versiones recientes), y pueden quedar archivos de versiones anteriores junto al actual. Recopila todos los archivos .btm de la carpeta. BTM contiene los ítems de todos los usuarios, indexados por usuario.
Qué prueba
- Que se registró un ítem de inicio, un agente/daemon heredado o un trabajo
SMAppServiceincluido en una app, y para qué usuario. - El nombre del desarrollador y el team identifier de la firma de código, el bundle identifier y la app padre.
- La ruta del ejecutable y la URL del plist o del paquete.
- Si el ítem estaba activado, permitido por el usuario u oculto, y si se notificó al usuario.
- Ítems instalados por MDM mediante un payload de Service Management.
No prueba que el ítem se ejecutara. Un registro también puede referirse a un plist o paquete que ya no existe.
Campos clave
sfltool dumpbtm y DumpBTM muestran por cada ítem:
| Campo | Significado |
|---|---|
| UUID | Identificador del registro |
| Name | Nombre visible |
| Developer Name / Team Identifier | Procedentes de la firma de código |
| Type | Campo de bits: 0x2 app, 0x4 ítem de inicio, 0x8 agente, 0x10 daemon, 0x20 desarrollador, 0x10000 heredado, 0x80000 curado |
| Disposition | Campo de bits: 0x1 activado, 0x2 permitido, 0x4 oculto, 0x8 notificado; p. ej. [enabled, allowed, visible, notified] (11) |
| Identifier | Identificador del ítem, a menudo la etiqueta o el bundle ID |
| URL | Ubicación del plist o del paquete |
| Executable Path | Programa que se ejecuta |
| Generation | Contador de generación del registro |
| Assoc. Bundle IDs | Procedentes de AssociatedBundleIdentifiers en el plist |
| Parent Identifier | App contenedora |
En el almacén en bruto (tal como lo expone bgiparser), las claves de cada ítem incluyen uuid, teamIdentifier, disposition, generation, modificationDate, associatedBundleIdentifiers, url, bundleIdentifier, type, identifier, executablePath, container, developerName y executableModificationDate.
Marcas de tiempo
modificationDate y executableModificationDate son valores NSDate dentro del archivo keyed archive, que almacenan Mac absolute time (segundos desde 2001-01-01 UTC); los parsers los convierten. Las horas APFS del propio archivo .btm muestran la última actualización del almacén. En el backgrounditems.btm heredado no hay fechas por ítem: recurre a las horas de archivo, FSEvents y los logs.
Retención
Los registros permanecen hasta que el usuario o el desarrollador elimina el ítem, la app lo da de baja o sfltool resetbtm reconstruye el almacén. Las entradas de log siguen la retención normal del unified log.
Adquisición
# Live, root, Terminal with Full Disk Access
sudo sfltool dumpbtm > ./case/btm_dump.txt
sudo ditto /private/var/db/com.apple.backgroundtaskmanagement ./case/btm
for u in /Users/*; do
f="$u/Library/Application Support/com.apple.backgroundtaskmanagementagent/backgrounditems.btm"
[ -f "$f" ] && sudo cp -p "$f" "./case/bgi_$(basename "$u").btm"
done
# BTM activity
log show --info --predicate 'subsystem == "com.apple.backgroundtaskmanagement"' --last 7d
- Aftermath recopila los ítems de inicio entre los mecanismos de persistencia.
- UAC recopila
loginitems.*.plistde/private/var/db/com.apple.xpc.launchd; añade manualmente la carpeta BTM si tu perfil no la incluye. - No ejecutes nunca
sfltool resetbtmsobre la evidencia: reconstruye la base de datos.
Análisis
- sfltool dumpbtm (incluido en macOS) en el sistema en vivo.
- DumpBTM (objective-see/DumpBTM): equivalente de código abierto que también puede analizar programáticamente un archivo
.btmcopiado (se compila con Xcode). - bgiparser (mnrkbys/bgiparser): analiza tanto el
backgrounditems.btmheredado comoBackgroundItems-v*.btmy genera JSON:python3 bgiparser.py -f ./case/btm/BackgroundItems-v16.btm -o btm.json. - Plugins
macos_background_items_plistymacos_login_items_plistde Plaso; el patrón documentado cubreBackgroundItems-v[3-9].btm, así que renombra o prueba las versiones más recientes.
Consejos para la investigación
- Compara la
URLde cada entrada BTM con el sistema de archivos: una entrada cuyo plist o app ya no existe es una pista sólida de persistencia limpiada. - Un Team Identifier ausente o inesperado en un ítem que imita a un fabricante conocido merece un examen detenido.
- Los ítems con el bit de oculto o con disposición "no notificado" nunca se mostraron al usuario.
- Endpoint Security emite
ES_EVENT_TYPE_NOTIFY_BTM_LAUNCH_ITEM_ADDy..._REMOVEen macOS 13+, así que la telemetría del EDR puede conservar registros que el almacén ya no muestra. - A un nuevo ítem en segundo plano suelen seguirle concesiones de TCC; revisa TCC.db para el mismo bundle ID o ruta.
- Desde cada ítem, continúa hacia su plist en LaunchAgents/LaunchDaemons y hacia las evidencias de Gatekeeper de su binario.