Saltar al contenido

PersistenciaEjecución

Í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

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

macOSRutaFormatoProtección
hasta 10.12~/Library/Preferences/com.apple.loginitems.plistplistUsuario
10.13-12~/Library/Application Support/com.apple.backgroundtaskmanagementagent/backgrounditems.btmPlist binario, NSKeyedArchiver con blobs de bookmarkUsuario
13 Ventura+/private/var/db/com.apple.backgroundtaskmanagement/BackgroundItems-v<N>.btmPlist binario, NSKeyedArchiverroot + Full Disk Access
Todas/private/var/db/com.apple.xpc.launchd/loginitems.<UID>.plistplistÍ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 SMAppService incluido 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:

CampoSignificado
UUIDIdentificador del registro
NameNombre visible
Developer Name / Team IdentifierProcedentes de la firma de código
TypeCampo de bits: 0x2 app, 0x4 ítem de inicio, 0x8 agente, 0x10 daemon, 0x20 desarrollador, 0x10000 heredado, 0x80000 curado
DispositionCampo de bits: 0x1 activado, 0x2 permitido, 0x4 oculto, 0x8 notificado; p. ej. [enabled, allowed, visible, notified] (11)
IdentifierIdentificador del ítem, a menudo la etiqueta o el bundle ID
URLUbicación del plist o del paquete
Executable PathPrograma que se ejecuta
GenerationContador de generación del registro
Assoc. Bundle IDsProcedentes de AssociatedBundleIdentifiers en el plist
Parent IdentifierApp 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.*.plist de /private/var/db/com.apple.xpc.launchd; añade manualmente la carpeta BTM si tu perfil no la incluye.
  • No ejecutes nunca sfltool resetbtm sobre 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 .btm copiado (se compila con Xcode).
  • bgiparser (mnrkbys/bgiparser): analiza tanto el backgrounditems.btm heredado como BackgroundItems-v*.btm y genera JSON: python3 bgiparser.py -f ./case/btm/BackgroundItems-v16.btm -o btm.json.
  • Plugins macos_background_items_plist y macos_login_items_plist de Plaso; el patrón documentado cubre BackgroundItems-v[3-9].btm, así que renombra o prueba las versiones más recientes.

Consejos para la investigación

  • Compara la URL de 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_ADD y ..._REMOVE en 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.

Ver también