BAM vs UserAssist: dos evidencias de ejecución por usuario
BAM y UserAssist vinculan la ejecución con un usuario. Comparamos ubicación, marcas de tiempo, contadores, lanzamientos gráficos o en segundo plano y retención.
TL;DR. Ambos artefactos dicen qué usuario ejecutó qué. BAM (colmena SYSTEM, por SID) capta los procesos sin importar cómo se lanzaron — salvo rutas extraíbles/de red y programas de consola lanzados desde la línea de comandos —, pero solo guarda la última marca de tiempo durante una semana aproximadamente. UserAssist (el NTUSER.DAT de cada usuario) solo ve los lanzamientos hechos a través del shell del Explorador, pero añade contador de ejecuciones, contador y tiempo de foco, y los conserva mucho más tiempo. Cuando discrepan, la diferencia suele estar en la forma de lanzamiento.
La mayoría de las comparativas ponen BAM junto a artefactos globales al sistema (Prefetch, ShimCache, Amcache). El vecino más interesante, sin embargo, es UserAssist, el otro gran artefacto de ejecución por usuario. Contexto sobre BAM: la guía completa de BAM/DAM.
De un vistazo
| BAM | UserAssist | |
|---|---|---|
| Colmena | SYSTEM (un archivo por equipo) | NTUSER.DAT (uno por perfil de usuario) |
| Clave | Services\bam\State\UserSettings\<SID> | Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count |
| Atribución | Nombre de la clave = SID | La colmena pertenece al usuario |
| Nombre del valor | Ruta de dispositivo NT o nombre de paquete | Ruta ofuscada con ROT13, a menudo con un GUID de Known Folder |
| Marcas de tiempo | Un FILETIME (última actividad registrada) | FILETIME de última ejecución |
| Contadores | Ninguno | Número de ejecuciones, contador de foco, tiempo de foco |
| Qué se registra | Procesos vistos por bam.sys (Windows 10 1709+) | Lanzamientos a través del shell del Explorador |
| Retención | ~7 días, purga al arrancar | Larga |
| Puntos ciegos | Rutas extraíbles/de red, herramientas de consola desde la línea de comandos | Todo lo que no se lanza a través del Explorador |
Fuentes: Suhanov, BAM internals; libyal winreg-kb, UserAssist; Didier Stevens, UserAssist.
UserAssist en dos minutos
Bajo UserAssist, cada subclave GUID sigue una categoría; desde Windows 7, {CEBFF5CD-ACE2-4F4F-9178-9926F41749EA} cubre los lanzamientos de ejecutables y {F4E57C4B-2036-45F0-A9AB-443BCFE33D9F} los de accesos directos (libyal). Los nombres de valor son la ruta del programa con ROT13 aplicado a las letras — P:\Jvaqbjf\... es C:\Windows\.... Las rutas suelen empezar por un GUID de Known Folder en lugar de una letra de unidad.
Los datos del valor (72 bytes desde Windows 7) contienen el contador de ejecuciones en el offset 4, el contador de foco en el offset 8, el tiempo de foco en el offset 12 y el FILETIME de última ejecución en el offset 60 (libyal). libyal enumera lo que registra la clave: lanzamientos desde el Panel de control, el menú Inicio y los accesos directos, el cuadro Ejecutar, las teclas de acceso rápido, Quick Launch y otras vías del Explorador.
Decodificar a mano un nombre de valor
ROT13 desplaza cada letra 13 posiciones y deja intactos números y signos: es su propio inverso. Toma este nombre de valor de UserAssist:
P:\Jvaqbjf\Flfgrz32\pzq.rkr
Desplaza las letras 13 posiciones y obtienes C:\Windows\System32\cmd.exe. Todas las herramientas de UserAssist lo hacen por ti, pero reconocer esta forma ayuda cuando recorres una colmena en bruto con un visor, o cuando una búsqueda de cmd.exe en la colmena en bruto no devuelve nada: el nombre en claro no está guardado ahí.
BAM en dos minutos
Una clave por SID en la colmena SYSTEM, un REG_BINARY por ejecutable cuyos primeros 8 bytes son un FILETIME actualizado al iniciar y al terminar el proceso; unos siete días de retención; nada para soportes extraíbles ni recursos de red (Suhanov). Detalles: dónde está la clave BAM y el formato de los valores.
Dónde discrepan — y por qué
| Visto en | Causa típica |
|---|---|
| Solo BAM | Lanzado por un script, una línea de comandos (programas que no son de consola), un servicio o tarea que se ejecuta como el usuario, ejecución remota; o se vació UserAssist |
| Solo UserAssist | Más antiguo que la semana de BAM; ejecutado desde un USB o un recurso de red (lanzado desde el Explorador, pero BAM excluye la ruta); ejecutable borrado y equipo reiniciado |
| Ambos | Lanzado recientemente desde el Explorador y desde un disco local |
| Ninguno | Programa de consola iniciado desde cmd.exe/PowerShell, o ambos limpiados |
La primera fila es donde BAM se gana su sitio: las herramientas de ataque rara vez pasan por el menú Inicio. En el caso ficticio de movimiento lateral, PsExec64.exe y rclone.exe bajo svc_backup son exactamente el tipo de lanzamientos que no esperarías ver en UserAssist y que BAM sí muestra.
La segunda fila es donde UserAssist se gana el suyo: el historial. Si el incidente empezó tres semanas antes de la recopilación, BAM probablemente estará vacío para la primera fase, mientras que UserAssist puede mostrar todavía la primera ejecución de una herramienta con su contador.
Colmenas distintas, recopilaciones distintas
- BAM: una colmena
SYSTEM(+ registros) cubre a todos los usuarios del equipo. - UserAssist: un
NTUSER.DAT(+ntuser.dat.LOG1/LOG2) por perfil, enC:\Users\<nombre>\. Los perfiles borrados se llevan su UserAssist; las claves de BAM de ese SID viven en SYSTEM, así que pueden sobrevivir al perfil hasta que se purguen.
Una recopilación de KAPE con los targets de registro suele traer ambos (KapeFiles). Nuestro BAM/DAM Parser se ocupa de la parte de SYSTEM; los artefactos de NTUSER.DAT como UserAssist se leen con Registry Parser o con las herramientas de la comparación de analizadores.
Marcas de tiempo: comparar con cuidado
Ambas son FILETIME en UTC, pero no significan lo mismo:
- La última ejecución de UserAssist se escribe cuando el Explorador lanza el programa.
- BAM se actualiza al crearse y al terminar el proceso, así que para una misma ejecución puede ser posterior a la hora de UserAssist si el programa siguió abierto.
Una hora de BAM unas horas posterior a la de UserAssist para la misma ruta no es, por tanto, una contradicción; puede ser el cierre del programa.
Antiforense
Ambos son datos de registro normales. Los valores de UserAssist pueden borrarlos el propio usuario o utilidades de limpieza, ya que la colmena es suya; las entradas de BAM pueden borrarse con privilegios suficientes y desaparecen solas al cabo de una semana, o cuando se borra el ejecutable y se reinicia el equipo (limitaciones de BAM). Un usuario con UserAssist vacío mientras BAM muestra programas de aspecto interactivo (navegador, Office) merece una segunda mirada.
Lista de comprobación de la investigación
- Analiza BAM para todos los SID del equipo (una colmena SYSTEM los cubre todos).
- Analiza UserAssist en el
NTUSER.DATde cada perfil, incluidos los de cuentas que creas irrelevantes. - Para cada programa de interés, anota: ¿está en BAM? ¿en UserAssist? ¿contador? ¿últimas horas en ambos?
- Explica cada discrepancia con la tabla anterior (forma de lanzamiento, antigüedad, tipo de ruta) antes de calificar algo de sospechoso.
- Recurre a Prefetch y a los registros de eventos para las filas que sigan sin cuadrar.
Preguntas frecuentes
¿Qué diferencia hay entre BAM y UserAssist?
BAM está en la colmena SYSTEM, una clave por SID, con una sola marca de tiempo reciente por ejecutable y alrededor de una semana de retención. UserAssist está en el NTUSER.DAT de cada usuario, registra los lanzamientos hechos a través del shell del Explorador y conserva contador, tiempo de foco y hora de última ejecución durante mucho más tiempo.
¿Por qué un programa aparece en BAM pero no en UserAssist?
UserAssist registra los lanzamientos a través del shell del Explorador (menú Inicio, escritorio, accesos directos, cuadro Ejecutar). Los programas iniciados por un script, una línea de comandos, un servicio o una herramienta remota no pasan por ahí, pero pueden generar igualmente una entrada en BAM.