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é.
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 :
- 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.
- 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.
- 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 TelemetryComputer 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 -Disablevia 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
SYSTEMau moment du setup de la machine. Un106pourProgramDataUpdaterdaté 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
141pourProgramDataUpdaterest 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
200vous dit que la tâche s'est réellement exécutée. Des événements200manquants pendant des semaines sont un drapeau rouge. - 201 : action terminée. À apparier avec
200pour 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 :
- Acquérez le BCF. Maintenant. Avant la prochaine passe d'évaluation.
- Tirez
Microsoft-Windows-TaskScheduler%4Operational.evtx. - Tirez les hives du registre, spécifiquement
SOFTWAREetSYSTEMpour l'état de la tâche et AppCompatFlags. - Tirez le journal USN pour pouvoir voir les opérations
FileWrite | CloseetFileDelete | ClosecontreRecentFileCache.bcflui-même. - Comparez l'heure de dernière modification du BCF au plus récent événement
200pourProgramDataUpdater. 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
- Microsoft, référence du Task Scheduler. Le schéma XML et les types de déclencheurs comptent à la lecture de la définition de tâche.
- Mandiant, Tracking ProgramDataUpdater for forensic value. L'analyse originale couvre l'interaction de la tâche avec le BCF.
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.