La tarea de evaluación de Application Experience: cuándo se escribe el BCF y cuándo se vacía
El ciclo de vida del BCF depende de una única tarea programada. Entiende cuándo se ejecuta ProgramDataUpdater, cuándo vacía el archivo y cómo detectar un appraiser deshabilitado.
RecentFileCache.bcf no se escribe solo. Existe una única tarea programada, Microsoft\Windows\Application Experience\ProgramDataUpdater, que dirige todo el ciclo de vida del archivo. Entiende esa tarea y entiendes el artefacto. Pásala por alto y vas a malinterpretar lo que un BCF vacío o un BCF rancio significan en realidad.
Este es un post sobre una sola tarea programada y la media docena de cosas que necesitas saber sobre ella.
Qué hace la tarea
ProgramDataUpdater es el appraiser de Application Experience. En un host Windows 7 SP1 ejecuta el pase de inventario de programas: recorre los binarios ejecutados recientemente, los evalúa para fines de shim/compatibilidad, actualiza los conjuntos de datos de evaluación locales y vacía el archivo de trabajo.
El archivo de trabajo es RecentFileCache.bcf. Cada vez que la tarea se ejecuta con éxito, el archivo se trunca a su cabecera. Las nuevas ejecuciones se acumulan en el BCF hasta el siguiente pase. Ese ciclo es todo el mecanismo.
La tarea está definida en C:\Windows\System32\Tasks\Microsoft\Windows\Application Experience\ProgramDataUpdater. Es un archivo XML que puedes leer directamente. En una instalación limpia de Win7 SP1 el trigger se ve más o menos así en espíritu (la redacción exacta varía):
- Un trigger diario, normalmente a una hora aleatoria fuera de las horas pico.
- Un trigger adicional al logon de usuario, con un retraso aleatorio.
- Una dependencia de la ventana de mantenimiento, lo que significa que puede aplazarse si la máquina está ocupada.
La cadencia en la práctica es aproximadamente diaria, pero no son exactamente 24 horas. La tarea puede saltarse si la máquina estuvo apagada, si estuvo con batería, si estaba activamente en uso o si tuvo un aplazamiento de ventana de mantenimiento abierto. He visto la tarea pasar cuatro o cinco días entre ejecuciones en un portátil normal que solo se encendía de forma intermitente.
Qué vacía el archivo
Tres cosas, en orden descendente de frecuencia:
- El appraiser se ejecutó con éxito. Este es el camino normal. El archivo se trunca a una cabecera con cero entradas. Los metadatos del sistema de archivos persisten.
- El archivo fue borrado manualmente. Raro. Algunos scripts "removedores de telemetría" apuntan a este archivo. Algunas herramientas de IR también lo hicieron, allá cuando el artefacto era menos conocido. Si el archivo no está pero el appraiser está configurado para ejecutarse, espera que el sistema operativo lo recree en el siguiente evento de ejecución.
- Un reset del sistema o una operación de imaging. Borra el archivo junto con todo lo demás.
Lo que no vacía el archivo:
- Reinicios.
- Actualizaciones de Windows (casi nunca).
- Deshabilitar Defender o cualquier otro producto de seguridad.
- Que un usuario vacíe la papelera de reciclaje.
- Liberador de espacio en disco.
Si el BCF está vacío y no puedes atribuirlo a una de las tres causas anteriores, mira con más atención. La explicación más común en una investigación real es que el appraiser corrió anoche y se te pasó la ventana. Es un estado perfectamente normal.
Qué deshabilita la tarea
La directiva de grupo puede deshabilitar Application Experience por completo:
Computer Configuration\Administrative Templates\Windows Components\Application Compatibility\Turn off Application TelemetryComputer Configuration\Administrative Templates\Windows Components\Application Compatibility\Turn off Inventory Collector
Ambas conmutan el mismo comportamiento subyacente. En un host unido a dominio con política de privacidad estricta, espera que la tarea esté deshabilitada. El BCF se acumulará.
La tarea también puede deshabilitarse localmente:
schtasks /Change /TN "\Microsoft\Windows\Application Experience\ProgramDataUpdater" /Disable- Edición directa del XML de la tarea en
C:\Windows\System32\Tasks\. Set-ScheduledTask -Disablevía PowerShell.
El lado del registro del estado deshabilitado aparece bajo HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks\ y \Tree\Microsoft\Windows\Application Experience\ProgramDataUpdater. El parser de Registry te dará tanto el valor Enabled como la línea de comandos registrada.
Un appraiser deshabilitado es ruidoso en los lugares correctos, silencioso en otros. La tarea no aparece en el flujo de alertas de Defender. No genera un evento de Security. Tienes que ir a buscarlo.
Detectar un appraiser deshabilitado desde EVTX
El log relevante es Microsoft-Windows-TaskScheduler%4Operational.evtx. Los IDs de evento interesantes:
- 106: tarea registrada. Busca el usuario que la registró. En una instalación por defecto, es
SYSTEMen el momento del setup de la máquina. Un106paraProgramDataUpdatercon fecha posterior a la construcción de la máquina es una señal de que alguien re-registró la tarea, posiblemente después de borrarla y volver a crearla con parámetros diferentes. - 141: tarea borrada. Un
141paraProgramDataUpdateres interesante. Significa que la tarea fue eliminada, lo cual es más agresivo que deshabilitarla. - 200: acción iniciada. La presencia de eventos
200te dice que la tarea realmente corrió. La ausencia de eventos200durante semanas es una bandera roja. - 201: acción completada. Empareja con
200para confirmar una ejecución limpia. - 129: proceso de tarea creado. Confirma que la tarea generó su acción.
- 325: tarea disparada. La más útil para análisis de cadencia.
Si el log operativo tiene un flujo saludable de eventos 200/201 para ProgramDataUpdater, el appraiser está ejecutándose y vaciando el BCF según el calendario. Si esos eventos se detienen en una fecha específica y el BCF está correspondientemente rancio, algo cambió en esa fecha. Ese es el punto de pivote para la investigación.
El parser de EVTX maneja este tipo de log. El esquema es denso pero el filtro es simple: Channel = "Microsoft-Windows-TaskScheduler/Operational" y TaskName = "\Microsoft\Windows\Application Experience\ProgramDataUpdater".
Qué toca la tarea sobre lo que puedes pivotar
Cuando ProgramDataUpdater se ejecuta, hace más que solo vaciar el BCF. Actualiza varias claves del registro y el Amcache.hve en hosts Win8+ (irrelevante para nuestro alcance de Win7). En Win7 específicamente, el pase del appraiser interactúa con:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\y sus subclaves.HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Compatibility Assistant\.C:\Windows\AppCompat\Programs\Install\para entradas de seguimiento de instaladores.
Las marcas de tiempo de última escritura de AppCompatFlags\Compatibility Assistant\Persisted en Win7 son una marca de tiempo corroborante útil para "cuándo corrió el appraiser por última vez." Compara eso con la marca de tiempo de última modificación de RecentFileCache.bcf mismo. Deberían estar muy cerca. Una brecha amplia significa que el appraiser fue interrumpido o el archivo fue modificado fuera de banda.
Un modo de fallo específico que vale la pena conocer
He visto un problema consistente con el appraiser en Win7 SP1: si la máquina ha sido re-imaged desde un master con sysprep y el task scheduler estampa la tarea con un tiempo de trigger futuro, el appraiser puede saltarse su primera ejecución programada. El BCF crece. La solución es benigna: el siguiente logon de usuario dispara la tarea y el archivo se vacía. Pero mientras tanto, puedes encontrar un BCF inusualmente grande en una imagen recién desplegada. Vale la pena tenerlo presente para no sobreinterpretar un archivo grande en una máquina conocida como limpia.
El otro modo de fallo es más deliberado. Un atacante con admin puede deshabilitar la tarea, ejecutar sus herramientas y luego volver a habilitarla. El siguiente pase del appraiser vacía el BCF y borra la evidencia. La ventana es corta (un ciclo de tarea) pero la técnica funciona. Detección: busca un 141 (tarea borrada) o un cambio de estado en el valor TaskCache\Tree\...\Enabled del registro, y luego compara con las marcas de tiempo de RecentFileCache.bcf y las ejecuciones que estás investigando. Si la tarea fue deshabilitada-y-luego-habilitada alrededor del momento de la actividad sospechosa, trata el BCF como comprometido para esa ventana.
Flujo de trabajo práctico
Cuando aterrizas en un host Win7 y el BCF importa:
- Adquiere el BCF. Ahora. Antes del siguiente pase de evaluación.
- Tira
Microsoft-Windows-TaskScheduler%4Operational.evtx. - Tira los hives del registro, específicamente
SOFTWAREySYSTEMpara el estado de la tarea y AppCompatFlags. - Tira el USN journal para poder ver operaciones
FileWrite | CloseyFileDelete | ClosecontraRecentFileCache.bcfmismo. - Compara la hora de última modificación del BCF con el evento
200más reciente paraProgramDataUpdater. Deberían estar a pocos segundos el uno del otro.
Si esas dos marcas de tiempo divergen, alguien tocó el archivo fuera del appraiser. Eso es más interesante que cualquier cosa dentro del archivo.
Lecturas adicionales
- Microsoft, referencia del Task Scheduler. El esquema XML y los tipos de trigger importan al leer la definición de la tarea.
- Mandiant, Tracking ProgramDataUpdater for forensic value. El análisis original cubre la interacción de la tarea con el BCF.
Si alguien deshabilitó esta tarea en un host que no tiene una razón de política de privacidad para hacerlo, esa es tu línea de salida para la investigación, no el BCF mismo.