Skip to content

Validar hallazgos de RecentFileCache: pivotes y falsos positivos

Qué hacer cuando una entrada sospechosa sale a la superficie: cómo confirmar la ejecución, qué cruzar, y los patrones de falso positivo más frecuentes.

Publicado el 4 min de lectura

Una ruta de apariencia sospechosa en RecentFileCache.bcf es una pista, no un veredicto. El artefacto te dice que AppCompat vio un archivo — nada más. Este post es el checklist que ejecutas antes de escribir "el atacante ejecutó C:\Users\Public\update.exe" en tu informe.

La cadena de validación

Un hallazgo de "ejecutado" de alta confianza para una sola ruta suele ser una cadena de tres o cuatro artefactos coincidiendo:

RecentFileCache (ruta vista)
       ↓
Prefetch (timestamp de ejecución + contador)         ← mejor corroborador individual
       ↓
Amcache.hve (SHA-1, editor, estado de instalación)   ← metadatos más ricos de la misma época
       ↓
MFT / $LogFile (creación, borrado, registro MFT)     ← cuándo/cómo se movió el archivo
       ↓
Binario en disco → hash → VT / threat intel          ← identidad

Detente en cualquier escalón si contradice los de arriba. Una ruta en .bcf sin Prefetch y sin entrada Amcache significa una de: (a) el archivo fue visto pero nunca ejecutado, (b) el archivo se ejecutó pero Prefetch está deshabilitado / la entrada caducó, (c) ProgramDataUpdater nunca disparó antes del apagado. Las tres son comunes.

Especificidades por pivote

Prefetch

El archivo relevante es C:\Windows\Prefetch\<NOMBRE_MAYUS>-<HASH_8_HEX>.pf. Dos rutas que producen el mismo basename dan archivos prefetch distintos porque el hash incorpora la ruta del ejecutable. Usa el hermano prefetch-parser del lado cliente, o PECmd.exe en Windows.

Lectura de confianza:

  • Prefetch existe, contador de lanzamientos ≥ 1, última ejecución dentro de horas de la ventana de incidente → confirmación fuerte de ejecución.
  • Prefetch existe, contador = 1, última ejecución = fecha de creación del archivo → ejecutado una vez poco después del drop, consistente con "ejecutó el dropper".
  • Sin Prefetch a pesar de múltiples artefactos corroborantes → considera si Prefetch estaba deshabilitado (HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters\EnablePrefetcher) — paso anti-forense conocido.

Amcache.hve

Mismo directorio que .bcf. Parsea con amcache-parser. Campos clave a leer:

  • SHA-1 — pivotar a VT o a tu store interno. Un hash aquí significa que AppCompat hasheó el archivo en el momento de promoción.
  • Publisher + PublisherName — vacío significa que el binario no estaba firmado. La mayoría del malware cae aquí.
  • LastWritten de la clave — cuándo se tocó la clave de registro por última vez. El timestamp más cercano a ejecución que te da el registro.
  • AppPath — la ruta que Amcache registró. Compara contra la ruta en .bcf; las discrepancias surgen cuando el archivo se movió.

MFT y $LogFile

Usa MFTECmd.exe o mft-parser para sacar el registro MFT del binario. Quieres:

  • $STANDARD_INFORMATION Created, Modified, Accessed, MFT-changed — la foto completa de timestamps, incluidos indicios de timestomping (e.g. $SI Modified ≠ $FILE_NAME Modified).
  • Entradas $LogFile que registran creación, rename o borrado del archivo — útil cuando el archivo ya no está en disco.

Hash en disco → threat intel

Si la ruta aún resuelve, certutil -hashfile <path> SHA256 (Win7+) o Get-FileHash (PowerShell) te da un SHA-256 en segundos. Pivota a VirusTotal, MalwareBazaar, la base de IOC de tu EDR, MISP interno, etc.

Falsos positivos que pillan

No toda ruta rara es maliciosa. Los patrones siguientes queman analistas cada trimestre:

  • Desempaquetados MSI por sesión. Muchos instaladores extraen a C:\Users\<user>\AppData\Local\Temp\{GUID}\setup.exe y ejecutan desde ahí. Parece textbook-sospechoso; normalmente legítimo. Valida con la naturaleza firmada del instalador padre y la edad de la carpeta temp.
  • Rutas de cuarentena de protección de endpoint. Algunos productos AV mueven los archivos detectados a C:\ProgramData\<Vendor>\Quarantine\.... La ruta parece alarmante pero el archivo ya está neutralizado.
  • Artefactos de build / CI en máquinas de dev. Las máquinas de desarrollador tienen D:\build\bin\Debug\app.exe, C:\Users\dev\source\repos\foo\bin\foo.exe, etc. que coinciden con "unidad rara + basename de apariencia aleatoria" pero son perfectamente normales en contexto.
  • Auto-actualizadores estilo Squirrel. Apps como Discord, Atom, VS Code depositan binarios versionados bajo %LOCALAPPDATA%\<App>\app-<version>\<App>.exe y se vuelven a ejecutar. Parece "un único binario que se relocaliza una y otra vez" — es solo auto-update.
  • El caché "Click-to-Run" de Office. C:\Program Files\Common Files\microsoft shared\ClickToRun\... produce muchas variantes de ruta; aprende la forma para dejar de pivotar en ellas.
  • Caché de paquetes de Windows Update. C:\Windows\SoftwareDistribution\Download\<GUID>\... es normal.

Modelo mental práctico: rutas temp/AppData con un instalador padre firmado ejecutándolas una vez y nunca más son ruido. Las mismas rutas invocadas repetidamente por un binario sin firma no lo son.

La frase del informe

Una vez tu cadena aguanta, la frase defendible en un informe se ve así:

"RecentFileCache.bcf, Prefetch y Amcache.hve muestran consistentemente que C:\Users\Public\update.exe estaba presente en el sistema; Prefetch registra dos ejecuciones el 2026-05-23 entre las 14:11 y las 14:17 UTC; Amcache registra el SHA-1 d2b7…f0c1, que coincide con la muestra de VirusTotal vista por primera vez el 2026-05-20 con detecciones de N proveedores."

Si alguno de esos tres artefactos falta, degrada el lenguaje ("un archivo en esta ruta fue observado por el escáner AppCompat") en consecuencia.

Siguiente

El post final cubre qué haría un atacante para silenciar toda esta cadena — y las señales que lo delatan cuando lo intenta.

Artículos relacionados

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.
El formato BCF es una cabecera, una lista de rutas UTF-16LE con prefijo de longitud, y se acabó. Aquí está lo que significa cada byte y por qué nada ha cambiado desde 2009.
Un endpoint Win7 marcado por el SOC, 14 rutas en el BCF, tres dignas de una segunda mirada. Una cadena de corroboración realista y cuánto contribuyó realmente el BCF.