Que sont les tâches planifiées Windows ?
Le Planificateur de tâches exécute des programmes au démarrage, à l’ouverture de session, selon un calendrier, sur un événement ou lorsque la machine est inactive. Windows embarque des centaines de tâches qui lui sont propres, et les installateurs de logiciels en ajoutent d’autres. C’est aussi l’un des moyens les plus courants pour un attaquant de conserver l’accès à une machine (MITRE ATT&CK T1053.005).
Chaque tâche existe à deux endroits : une définition XML sur disque et un cache dans la ruche de registre SOFTWARE, que le Planificateur de tâches charge réellement. C’est en comparant les deux que l’on trouve les tâches masquées, altérées ou dont les fichiers ont été supprimés.
Où se trouvent les traces
- C:\Windows\System32\Tasks\ — un fichier XML par tâche (UTF-16LE, sans extension) : auteur, date d’enregistrement, déclencheurs, compte d’exécution, paramètres et actions (ligne de commande, gestionnaire COM).
- SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache — Tree (chemins des tâches avec les valeurs Id, Index et SD) et Tasks\{GUID} (Path, Hash, Actions, Triggers et DynamicInfo avec les FILETIME de création et de dernière exécution).
- C:\Windows\Tasks\*.job — tâches héritées du Planificateur de tâches 1.0 : application, paramètres, auteur, heure de dernière exécution.
- Journaux associés (non analysés ici) : événements Security 4698–4702 lorsque l’audit de l’accès aux objets est activé, et Microsoft-Windows-TaskScheduler/Operational (106 enregistrée, 140 mise à jour, 141 supprimée, 200/201 action démarrée/terminée).
Ce que vérifie l’outil
- Tâches masquées : une entrée Tree du TaskCache sans sa valeur SD (la technique « Tarrask ») — invisible pour schtasks et la console, mais toujours exécutée.
- Fichiers supprimés ou déposés : tâches enregistrées sans fichier XML et fichiers XML sans enregistrement ; fichiers XML modifiés après l’enregistrement (hash du TaskCache) et actions du registre qui diffèrent du fichier.
- Contenu suspect : PowerShell encodé (décodé pour vous), LOLBins, commandes dans des chemins réseau ou modifiables par l’utilisateur, privilèges SYSTEM ou les plus élevés pour des tâches non Microsoft, tâches non Microsoft masquées, noms d’apparence aléatoire et tâches enregistrées récemment.
- Horodatages : date d’enregistrement, création dans le TaskCache, dernière exécution et dernière exécution réussie, bornes de début des déclencheurs et heures de dernière écriture des clés de registre, sur une chronologie unique et filtrable.
Limites
- Les journaux de transactions du registre ne sont pas rejoués : une ruche « dirty » est signalée, mais les modifications encore présentes dans SOFTWARE.LOG1/LOG2 manquent.
- Les valeurs binaires du TaskCache (DynamicInfo, Actions, Triggers) ne sont pas documentées ; leur structure provient de travaux publics de rétro-ingénierie. Seuls l’en-tête Triggers et le principal sont décodés, pas chaque enregistrement de déclencheur.
- Les dates XML, les heures des déclencheurs et les heures des .job sont en heure locale sans fuseau ; le décalage est déduit lorsque c’est possible, et affiché.
- Les clés de registre et les fichiers XML supprimés ne sont pas récupérés par carving ; c’est dans les journaux d’événements et les clichés instantanés de volume qu’il faut les chercher.
Comment obtenir les fichiers
- Collectez C:\Windows\System32\Tasks (et C:\Windows\Tasks) ainsi que la ruche SOFTWARE avec KAPE (ScheduledTasks + RegistryHivesSystem), Velociraptor (Windows.Triage.Targets) ou reg save et une copie du dossier.
- Conservez l’arborescence (…\Windows\System32\Tasks, …\Windows\System32\config\SOFTWARE) pour que les tâches soient rapprochées de la bonne ruche lorsqu’un ZIP contient plusieurs machines.
- Collectez le dossier Tasks complet : les fichiers XML manquants ne sont signalés que lorsque la plupart des tâches enregistrées ont le leur.
FAQ
Mes fichiers sont-ils envoyés quelque part ?
Non. Le parseur — y compris ses lecteurs de registre et de XML — est écrit en Rust, compilé en WebAssembly, et s’exécute dans un Web Worker de votre navigateur. Il n’existe aucun point de téléversement.
Comment détecte-t-il les tâches masquées (Tarrask) ?
Le Planificateur de tâches ne liste une tâche que si sa clé TaskCache\Tree possède une valeur SD (descripteur de sécurité). Un logiciel malveillant disposant des droits SYSTEM peut supprimer cette valeur : la tâche disparaît de schtasks et de la console mais continue de s’exécuter. L’outil signale chaque clé Tree qui a un Id de tâche mais pas de SD, et affiche l’heure de dernière écriture de la clé.
Pourquoi faut-il à la fois le dossier Tasks et la ruche SOFTWARE ?
Chacun raconte la moitié de l’histoire. Le fichier XML est la définition lisible ; le TaskCache est ce que le Planificateur de tâches charge réellement. Les tâches enregistrées sans fichier XML, les fichiers jamais enregistrés, les XML modifiés après l’enregistrement et les actions du registre qui diffèrent du fichier n’apparaissent qu’en comparant les deux.
Pourquoi les heures sont-elles décalées ?
Windows écrit la date d’enregistrement et les heures des déclencheurs dans le XML des tâches en heure locale sans fuseau horaire, alors que les heures du TaskCache sont en UTC. L’outil déduit le décalage de la machine en comparant les deux pour les mêmes tâches, et vous pouvez le définir vous-même.
Une tâche signalée est-elle malveillante ?
Pas nécessairement. Les constats sont des pistes de triage : des outils de mise à jour tiers s’exécutent en tant que SYSTEM depuis ProgramData, certains outils d’administration utilisent du PowerShell encodé. Lisez l’explication de chaque constat et corroborez avec d’autres artefacts.