Análisis forense de tareas programadas: guía completa
Análisis forense de tareas programadas: XML de tareas, clave TaskCache del registro, archivos .job heredados y registros de eventos, y cómo correlacionarlos.
Resumen. Una tarea programada de Windows deja hasta cuatro tipos de evidencia: una definición XML en C:\Windows\System32\Tasks, una copia en el registro dentro del hive SOFTWARE, bajo TaskCache, a veces un archivo .job heredado en C:\Windows\Tasks y registros en los logs de eventos (Security 4698 a 4702, TaskScheduler/Operational 106, 140, 141, 200, 201). Recópilelos todos, correlacione el XML con el registro por la ruta de la tarea, compárelos y trate cada atributo sospechoso como una pista que verificar, no como un veredicto.
Las tareas programadas son uno de los mecanismos de persistencia más habituales en Windows. MITRE ATT&CK las recoge como T1053.005 Scheduled Task, empleadas para persistencia, ejecución y escalada de privilegios. También son uno de los lugares con más ruido en un sistema limpio: una instalación nueva de Windows 11 registra bastante más de un centenar de tareas de Microsoft. El trabajo del investigador consiste en encontrar las pocas que no deberían estar ahí y fecharlas.
Esta guía es la puerta de entrada de la serie. Cada sección enlaza con un artículo más detallado.
Las cuatro fuentes de evidencia
| Fuente | Ubicación | Qué aporta | Para profundizar |
|---|---|---|---|
| XML de la tarea | C:\Windows\System32\Tasks\<folder>\<name> (sin extensión) | Definición completa: autor, fecha de registro, desencadenadores, principal, configuración, acciones | Anatomía del XML de una tarea |
| TaskCache | HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache | Tree (nombres, Id, Index, SD), Tasks (ruta, hash, acciones, desencadenadores, horas de ejecución) | Análisis forense del registro TaskCache |
.job heredado | C:\Windows\Tasks\*.job | Trabajos binarios de Task Scheduler 1.0, última hora de ejecución | Análisis forense de archivos .job |
| Logs de eventos | Security.evtx, Microsoft-Windows-TaskScheduler%4Operational.evtx | Quién registró, actualizó o eliminó una tarea, y cuándo se ejecutó | Este artículo, más abajo |
Microsoft documenta el esquema XML en la referencia Task Scheduler Schema. La estructura del registro y el formato .job están documentados solo en parte: el formato .job se especifica en MS-TSCH, mientras que los valores binarios de TaskCache se conocen sobre todo gracias a la ingeniería inversa de la comunidad, en particular el análisis de TaskCache de cyber.wtf y el winreg-kb de libyal.
Dónde está cada archivo en cada versión de Windows, y cómo recopilarlo sin perder datos, se explica en dónde se almacenan las tareas programadas y cómo adquirirlas.
Por qué el registro importa tanto como el XML
Muchas listas de comprobación se quedan en la carpeta de XML. No basta. El servicio Programador de tareas guarda su propia copia de cada tarea registrada en la clave TaskCache del hive SOFTWARE, dividida en dos:
Tree\<task path>contiene una clave por tarea, con el mismo nombre que la tarea, y los valoresId(el GUID de la tarea),IndexySD, el descriptor de seguridad que controla quién puede ver y modificar la tarea.Tasks\{GUID}contiene los datos de la tarea:Path,URI,Author,Date,Hash,Actions,TriggersyDynamicInfo, un valor binario con la creación de la tarea, su última ejecución y el último resultado.
Tres consecuencias para una investigación:
- Borrar el archivo XML no anula el registro de la tarea. La entrada del registro, y a menudo la propia tarea, permanecen. Una tarea que solo existe en TaskCache merece un examen detenido.
- Eliminar el valor
SDoculta la tarea aschtasks /queryy a la consola del Programador de tareas. Es la técnica que Microsoft describió para el malware Tarrask en abril de 2022. Consulte Tarrask y las tareas programadas ocultas. - El registro guarda metadatos de ejecución que el XML no tiene.
DynamicInforegistra cuándo se creó la tarea y cuándo se ejecutó por última vez, además del último código de resultado, algo que el XML nunca recoge.
La hora, y la trampa del XML
El Date de RegistrationInfo y el StartBoundary de los desencadenadores son valores XML dateTime. La API de Microsoft admite un desfase respecto a UTC (YYYY-MM-DDTHH:MM:SS(+-)HH:MM, véase Trigger.StartBoundary), pero las tareas creadas desde la consola o con schtasks no suelen almacenar ningún desfase: el valor está en la hora local de la máquina. El propio ejemplo del evento 4698 de Microsoft lo muestra: el evento se registra a las 2015-09-23T02:03:06Z mientras que el XML de la tarea incluido indica <Date>2015-09-22T19:03:06.9258653</Date>, siete horas antes, en una máquina situada en una zona UTC-7.
Las marcas de tiempo de TaskCache (DynamicInfo, horas de última escritura de las claves) son FILETIME en UTC. Comparar ambas para una misma tarea es la forma más sencilla de deducir el desfase de la máquina. Más detalles en anatomía del XML de una tarea y en la entrada del glosario sobre StartBoundary.
Logs de eventos: útiles cuando existen
| Log | ID de evento | Significado | Notas |
|---|---|---|---|
| Security | 4698 | Tarea programada creada | Contiene el XML completo de la tarea (Microsoft Learn) |
| Security | 4699 | Tarea eliminada | |
| Security | 4700 / 4701 | Tarea habilitada / deshabilitada | |
| Security | 4702 | Tarea actualizada | |
| TaskScheduler/Operational | 106 | Tarea registrada | Nombre de la tarea y usuario que la registra, sin la definición |
| TaskScheduler/Operational | 140 | Tarea actualizada | |
| TaskScheduler/Operational | 141 | Tarea eliminada | |
| TaskScheduler/Operational | 200 / 201 | Acción iniciada / completada | Prueba de que la tarea se ejecutó realmente |
Los eventos de Security requieren la subcategoría Audit Other Object Access Events, que no está habilitada por defecto en la mayoría de los puestos de trabajo. El canal Operational es el que controla el interruptor "Enable All Tasks History" de la consola del Programador de tareas; en muchos sistemas está desactivado o conserva poco historial. Interprete la ausencia de eventos como "no registrado", no como "no ocurrió". Varios investigadores también han demostrado que las tareas escritas directamente en el registro pueden evitar por completo tanto el 4698 como el 106 (Binary Defense). Si dispone de los logs, analícelos con el EVTX parser y cruce los resultados con los datos de las tareas.
Qué buscar
Una lista breve, desarrollada en cómo detectar tareas programadas maliciosas:
- Comandos en carpetas con permiso de escritura para el usuario:
C:\Users\Public,C:\ProgramData,%TEMP%,AppData. - PowerShell codificado (
-EncodedCommand) y hosts de scripts o LOLBins comorundll32,regsvr32,mshtaocertutil. - Tareas que no son de Microsoft y se ejecutan como SYSTEM o con
HighestAvailable. - Tareas en la raíz de la biblioteca o con nombres de apariencia aleatoria, un patrón que la propia guía de supervisión de Microsoft destaca.
- Tareas ocultas (
<Hidden>true</Hidden>) con un autor que no es Microsoft, y entradas de TaskCache sin valor SD. - Discrepancias: XML presente sin entrada en el registro, entrada en el registro sin XML, o un
Hashque no coincide con el XML en disco. - Fechas de registro recientes próximas a la ventana del incidente.
Cada punto tiene explicaciones inocentes. Los actualizadores de los fabricantes viven en ProgramData; los scripts del departamento de TI usan -EncodedCommand. Los indicadores acotan la búsqueda; lo que decide es la corroboración.
Un flujo de trabajo que se sostiene
- Adquiera
C:\Windows\System32\Tasks(de forma recursiva),C:\Windows\SysWOW64\Tasks,C:\Windows\Tasks, el hive SOFTWARE con sus logs de transacciones.LOG1/.LOG2y los logs Security y TaskScheduler/Operational. Los targetsScheduledTasksyRegistryHivesSystemde KAPE cubren los archivos y los hives (KapeFiles). - Analice a la vez el XML, los
.joby TaskCache, y correlacione cada archivo XML con su entrada de TaskCache por la ruta de la tarea. - Compruebe la integridad: tareas solo en el registro, solo en disco, sin SD, discrepancias de hash, y si el hive estaba sucio (dirty) cuando se copió.
- Normalice la hora: deduzca o fije el desfase UTC para las horas XML sin zona; mantenga los FILETIME del registro en UTC.
- Priorice con la lista de atributos sospechosos anterior y después corrobore con evidencias de ejecución de procesos (Prefetch, Amcache) y con los logs de eventos.
El Scheduled Tasks Parser realiza los pasos 2 a 4 en el navegador: suelte las carpetas, el hive o un ZIP de KAPE/Velociraptor y correlacionará el XML con TaskCache, comprobará los hashes, marcará las tareas ocultas y las que solo existen en el registro, y exportará a CSV o JSON. No se sube nada. El recorrido completo está en cómo analizar tareas programadas en el navegador.
Preguntas frecuentes
¿Dónde almacena Windows las tareas programadas?
En tres lugares: una definición XML por tarea en C:\Windows\System32\Tasks, una copia en el registro en HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache y, solo para tareas heredadas, archivos .job binarios en C:\Windows\Tasks.
¿Qué es la fuente de verdad, el archivo XML o el registro?
En Windows 8 y posteriores, el servicio Programador de tareas trabaja a partir de los datos de TaskCache en el registro; los archivos XML se mantienen sincronizados con ellos. Una tarea puede sobrevivir en el registro después de borrar su archivo XML, así que recopile y compare siempre ambos.
¿Qué ID de evento registran la creación de tareas programadas?
En Security, 4698 (creada, con el XML completo de la tarea), 4699 (eliminada), 4700 (habilitada), 4701 (deshabilitada) y 4702 (actualizada), que requieren la directiva Audit Other Object Access Events; y en TaskScheduler/Operational, 106 (registrada), 140 (actualizada), 141 (eliminada), 200 (acción iniciada) y 201 (acción completada).
Lecturas recomendadas
- Microsoft Learn, Task Scheduler Schema.
- Microsoft, [MS-TSCH]: Task Scheduler Service Remoting Protocol.
- Microsoft Threat Intelligence, Tarrask malware uses scheduled tasks for defense evasion (abril de 2022).
- cyber.wtf, Windows Registry Analysis: Tasks (2022).
- MITRE ATT&CK, T1053.005 Scheduled Task.