Skip to content

La tâche d'évaluation Application Experience : quand le BCF est écrit, et quand il est vidé

Le cycle de vie du BCF tient en une seule tâche planifiée. Comprenez quand ProgramDataUpdater s'exécute, quand il vide le fichier, et comment repérer un appraiser désactivé.

Publié le 7 min de lecture

RecentFileCache.bcf ne s'écrit pas tout seul. Il existe une seule tâche planifiée, Microsoft\Windows\Application Experience\ProgramDataUpdater, qui pilote l'intégralité du cycle de vie du fichier. Comprenez cette tâche et vous comprenez l'artefact. Passez à côté et vous interpréterez mal ce que signifie réellement un BCF vide ou un BCF périmé.

C'est un billet sur une tâche planifiée et la demi-douzaine de choses que vous devez savoir à son sujet.

Ce que fait la tâche

ProgramDataUpdater est l'appraiser d'Application Experience. Sur un hôte Windows 7 SP1, il exécute la passe d'inventaire des programmes : il parcourt les binaires exécutés récemment, les évalue pour les besoins de shim/compatibilité, met à jour les jeux de données d'évaluation locaux et vide le fichier de travail.

Le fichier de travail est RecentFileCache.bcf. Chaque fois que la tâche s'exécute avec succès, le fichier est tronqué à son en-tête. Les nouvelles exécutions s'accumulent dans le BCF jusqu'à la passe suivante. Ce cycle constitue tout le mécanisme.

La tâche est définie dans C:\Windows\System32\Tasks\Microsoft\Windows\Application Experience\ProgramDataUpdater. C'est un fichier XML que vous pouvez lire directement. Sur une installation propre de Win7 SP1, le déclencheur ressemble à ceci dans l'esprit (la formulation exacte varie) :

  • Un déclencheur quotidien, généralement à une heure creuse aléatoire.
  • Un déclencheur supplémentaire à l'ouverture de session utilisateur, avec un délai aléatoire.
  • Une dépendance à la fenêtre de maintenance, ce qui signifie qu'elle peut différer si la machine est occupée.

La cadence en pratique est à peu près quotidienne, mais ce n'est pas exactement 24 heures. La tâche peut sauter si la machine était éteinte, sur batterie, activement utilisée, ou avait un report de fenêtre de maintenance ouvert. J'ai vu la tâche passer quatre ou cinq jours entre les exécutions sur un portable normal qui n'était allumé que de manière intermittente.

Ce qui vide le fichier

Trois choses, par ordre décroissant de fréquence :

  1. L'appraiser s'est exécuté avec succès. C'est le chemin normal. Le fichier est tronqué à un en-tête avec zéro entrée. Les métadonnées du système de fichiers persistent.
  2. Le fichier a été supprimé manuellement. Rare. Certains scripts "removers de télémétrie" ciblent ce fichier. Certains outils IR aussi, à l'époque où l'artefact était moins connu. Si le fichier a disparu mais que l'appraiser est configuré pour s'exécuter, attendez-vous à ce que l'OS le recrée au prochain événement d'exécution.
  3. Un reset système ou une opération d'imaging. Efface le fichier avec tout le reste.

Ce qui ne vide pas le fichier :

  • Les redémarrages.
  • Les mises à jour Windows (presque jamais).
  • La désactivation de Defender ou de tout autre produit de sécurité.
  • Un utilisateur qui vide la corbeille.
  • Le nettoyage de disque.

Si le BCF est vide et que vous ne pouvez pas l'expliquer par l'une des trois causes ci-dessus, regardez de plus près. L'explication la plus courante dans une vraie investigation est que l'appraiser a tourné la nuit dernière et que vous avez manqué la fenêtre. C'est un état parfaitement normal.

Ce qui désactive la tâche

La stratégie de groupe peut désactiver Application Experience entièrement :

  • Computer Configuration\Administrative Templates\Windows Components\Application Compatibility\Turn off Application Telemetry
  • Computer Configuration\Administrative Templates\Windows Components\Application Compatibility\Turn off Inventory Collector

Les deux basculent le même comportement sous-jacent. Sur un hôte joint à un domaine avec une politique de confidentialité stricte, attendez-vous à ce que la tâche soit désactivée. Le BCF va s'accumuler.

La tâche peut aussi être désactivée localement :

  • schtasks /Change /TN "\Microsoft\Windows\Application Experience\ProgramDataUpdater" /Disable
  • Édition directe du XML de la tâche dans C:\Windows\System32\Tasks\.
  • Set-ScheduledTask -Disable via PowerShell.

Le côté registre de l'état désactivé apparaît sous HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks\ et \Tree\Microsoft\Windows\Application Experience\ProgramDataUpdater. Le parser de Registry vous donnera à la fois la valeur Enabled et la ligne de commande enregistrée.

Un appraiser désactivé est bruyant aux bons endroits, silencieux ailleurs. La tâche n'apparaît pas dans le flux d'alertes Defender. Elle ne génère pas d'événement de sécurité. Vous devez aller la chercher.

Détecter un appraiser désactivé depuis EVTX

Le log pertinent est Microsoft-Windows-TaskScheduler%4Operational.evtx. Les IDs d'événements intéressants :

  • 106 : tâche enregistrée. Cherchez l'utilisateur qui l'a enregistrée. Sur une installation par défaut, c'est SYSTEM au moment du setup de la machine. Un 106 pour ProgramDataUpdater daté après la construction de la machine est un signe que quelqu'un a réenregistré la tâche, peut-être après l'avoir supprimée et recréée avec des paramètres différents.
  • 141 : tâche supprimée. Un 141 pour ProgramDataUpdater est intéressant. Cela signifie que la tâche a été retirée, ce qui est plus agressif que de la désactiver.
  • 200 : action démarrée. La présence d'événements 200 vous dit que la tâche s'est réellement exécutée. Des événements 200 manquants pendant des semaines sont un drapeau rouge.
  • 201 : action terminée. À apparier avec 200 pour confirmer une exécution propre.
  • 129 : processus de tâche créé. Confirme que la tâche a engendré son action.
  • 325 : tâche déclenchée. La plus utile pour l'analyse de cadence.

Si le log opérationnel a un flux sain d'événements 200/201 pour ProgramDataUpdater, l'appraiser tourne et vide le BCF selon le planning. Si ces événements s'arrêtent à une date spécifique et que le BCF est correspondamment périmé, quelque chose a changé à cette date. C'est le point de pivot pour l'investigation.

Le parser EVTX gère ce type de log. Le schéma est dense mais le filtre est simple : Channel = "Microsoft-Windows-TaskScheduler/Operational" et TaskName = "\Microsoft\Windows\Application Experience\ProgramDataUpdater".

Ce que la tâche touche et sur quoi vous pouvez pivoter

Quand ProgramDataUpdater s'exécute, il fait plus que vider le BCF. Il met à jour plusieurs clés de registre et l'Amcache.hve sur les hôtes Win8+ (sans rapport avec notre périmètre Win7). Sur Win7 spécifiquement, la passe d'appraiser interagit avec :

  • HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\ et ses sous-clés.
  • HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Compatibility Assistant\.
  • C:\Windows\AppCompat\Programs\Install\ pour les entrées de suivi d'installeurs.

Les horodatages de dernière écriture de AppCompatFlags\Compatibility Assistant\Persisted sur Win7 sont un horodatage corroborant utile pour "quand l'appraiser a tourné pour la dernière fois." Comparez cela à l'horodatage de dernière modification de RecentFileCache.bcf lui-même. Ils devraient être très proches. Un écart important signifie que l'appraiser a été interrompu ou que le fichier a été modifié hors-bande.

Un mode de défaillance spécifique à connaître

J'ai vu un problème consistant avec l'appraiser sur Win7 SP1 : si la machine a été re-imagée à partir d'un master sysprepé et que le task scheduler estampille la tâche avec un temps de déclenchement futur, l'appraiser peut sauter sa première exécution planifiée. Le BCF grossit. Le correctif est bénin : la prochaine ouverture de session utilisateur déclenche la tâche et le fichier se vide. Mais entre-temps, vous pouvez trouver un BCF anormalement gros sur une image fraîchement déployée. Bon à savoir pour ne pas surinterpréter un gros fichier sur une machine connue comme propre.

L'autre mode de défaillance est plus délibéré. Un attaquant avec des droits admin peut désactiver la tâche, exécuter ses outils, puis la réactiver. La passe d'appraiser suivante vide le BCF et efface les preuves. La fenêtre est courte (un cycle de tâche) mais la technique fonctionne. Détection : cherchez un 141 (tâche supprimée) ou un changement d'état dans la valeur TaskCache\Tree\...\Enabled du registre, puis comparez aux horodatages de RecentFileCache.bcf et des exécutions que vous enquêtez. Si la tâche a été désactivée-puis-réactivée autour du moment de l'activité suspectée, traitez le BCF comme compromis pour cette fenêtre.

Workflow pratique

Quand vous atterrissez sur un hôte Win7 et que le BCF compte :

  1. Acquérez le BCF. Maintenant. Avant la prochaine passe d'évaluation.
  2. Tirez Microsoft-Windows-TaskScheduler%4Operational.evtx.
  3. Tirez les hives du registre, spécifiquement SOFTWARE et SYSTEM pour l'état de la tâche et AppCompatFlags.
  4. Tirez le journal USN pour pouvoir voir les opérations FileWrite | Close et FileDelete | Close contre RecentFileCache.bcf lui-même.
  5. Comparez l'heure de dernière modification du BCF au plus récent événement 200 pour ProgramDataUpdater. Ils devraient être à quelques secondes l'un de l'autre.

Si ces deux horodatages divergent, quelqu'un a touché le fichier en dehors de l'appraiser. C'est plus intéressant que tout ce qu'il y a dans le fichier.

Pour aller plus loin

Si quelqu'un a désactivé cette tâche sur un hôte qui n'a pas de raison de politique de confidentialité pour le faire, c'est votre ligne de départ pour l'investigation, pas le BCF lui-même.

Articles liés

Pas d'horodatages, pas de hashes, pas d'attribution utilisateur, pas de tracking de script. Le RecentFileCache.bcf est plus étroit que sa réputation. Voici ce vers quoi se tourner.
Un artefact court, spécifique, qui n'existe que sur Windows 7 et Server 2008 R2, mais quand vous l'avez, c'est l'une des preuves les plus propres d'exécution récente en DFIR.
Le BCF et l'AmCache résolvent des problèmes qui se chevauchent sur des versions différentes de Windows. Savoir lequel vous avez, et pourquoi, décide de ce que vous pouvez affirmer.