Application Experience y ProgramDataUpdater: cómo se llena .bcf
Recorriendo el servicio de Windows 7 y la tarea programada que escriben RecentFileCache.bcf, y qué significa ese ciclo de vida para las ventanas de triage.
RecentFileCache.bcf no aparece por magia. Un servicio específico la escribe en tiempo de ejecución y una tarea programada concreta la vacía con cadencia. Conocer ambos es lo que te permite razonar hasta dónde llega el artefacto, con qué frecuencia cambia y dónde están sus puntos ciegos.
El servicio Application Experience
En Windows 7 el servicio está registrado como AeLookupSvc ("Application Experience"). Es la mitad en tiempo de ejecución de la infraestructura de Application Compatibility, que existe para detectar binarios conocidos como malos en Windows más nuevos y aplicar silenciosamente shims de compatibilidad para que el software heredado siga funcionando.
En un lanzamiento típico de ejecutable ocurren dos cosas:
- El image loader consulta
sysmain.sdbpara shims que coincidan con el binario. - El servicio Application Experience registra que el binario fue visto, para que la tarea de mantenimiento offline pueda evaluarlo más tarde para elegibilidad de shim.
RecentFileCache.bcf es el buffer de staging para el paso 2. No es un log a largo plazo. Existe para alimentar el siguiente pase de mantenimiento, y punto.
ProgramDataUpdater
La tarea programada que consume el buffer es:
\Microsoft\Windows\Application Experience\ProgramDataUpdater
Hace tres cosas en orden:
- Lee
C:\Windows\AppCompat\Programs\RecentFileCache.bcf. - Recorre cada ruta, huellea el ejecutable y actualiza el conjunto de registros de Amcache.hve.
- Reescribe
RecentFileCache.bcf. A veces más corto, a veces vacío, a veces reemplazado por completo.
La tarea está registrada para correr en idle del sistema o al logon, gobernada por el framework de Automatic Maintenance. En un escritorio sano la ves dispararse aproximadamente a diario. En un kiosco que solo corre en horario laboral, la ventana entre escrituras puede estirarse a días.
Qué significa esto para la triage
La frescura del artefacto es función del último pase de ProgramDataUpdater, no de cualquier lanzamiento individual. Consecuencias prácticas:
- El
LastWriteTimedel archivo es una cota superior de cuándo ProgramDataUpdater se completó por última vez. Útil, pero no por entrada. No lo metas en una línea de tiempo de ejecución como si lo fuera. - Si un sistema fue comprometido, usado brevemente y apagado antes del siguiente pase, el binario malicioso vive en
RecentFileCache.bcfy aún no ha sido promocionado aAmcache.hve. Eso hace de la BCF el único artefacto que lleva la pista. - Tras un pase exitoso, una entrada puede desaparecer de la BCF mientras persiste en
Amcache.hve. Lee siempre los dos juntos. Una ruta ausente en la BCF pero presente en Amcache con unaLastWrittenreciente de la clave es el estado normal post-promoción.
Qué no aterriza en .bcf
La pipeline de Application Experience solo capta los binarios que pasan por el image loader normal con hooks AppCompat activos. Lo siguiente la rodea sistemáticamente:
- Inyección de DLL reflectiva y loaders PE en memoria.
- Drivers y payloads kernel-mode (otro camino de código).
- Cadenas LOLBin donde el lanzador es un binario firmado y el payload real es un script o scriptlet COM (
mshta.exe,regsvr32.exe /i). - Antiforense que deshabilita directamente
AeLookupSvc.
Si tienes motivos para creer que se usó alguno, la ausencia en RecentFileCache no es una señal de "no se ejecutó". Es silencio, no evidencia.
Qué huella deja un atacante si lo suprime
Vale la pena conocer el rastro de auditoría para las jugadas obvias. Parar o deshabilitar AeLookupSvc enciende los eventos 7036 y 7040 del Service Control Manager en el log del sistema. Deshabilitar o borrar la tarea ProgramDataUpdater enciende 141/142 en Microsoft-Windows-TaskScheduler%4Operational.evtx. Ambos se cubren en detalle en Detectar manipulación de RecentFileCache.
Una BCF que no se ha tocado en meses en una máquina de uso diario debería levantar una ceja aunque no encuentres eventos de service-control ni de tareas. A veces el atacante deshabilitó la tarea editando el XML del Task Scheduler en disco, y los eventos disparan en la cuenta equivocada o se pierden. Cruza contra los logs System y Application en EVTX y contra el estado del registro para el servicio.
Cadencia en números
Valores aproximados de hosts sanos, útiles como baseline de cordura:
- Estación, usuario diario: ProgramDataUpdater dispara cada 18 a 30 horas.
- Servidor (idle bajo): cada 2 a 5 días.
- Kiosco encendido solo en horario laboral: cuando Automatic Maintenance puede colarlo, a menudo cada 3 a 7 días.
- Host donde nunca se alcanza idle (carga pesada): puede pasar una semana o más entre pases.
Una BCF caducada un mes en un host que sabes que está activo a diario es significativa. Una BCF caducada una semana en un servidor es normal.