Skip to content

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.

Publicado el 8 min de lectura

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

FuenteUbicaciónQué aportaPara profundizar
XML de la tareaC:\Windows\System32\Tasks\<folder>\<name> (sin extensión)Definición completa: autor, fecha de registro, desencadenadores, principal, configuración, accionesAnatomía del XML de una tarea
TaskCacheHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCacheTree (nombres, Id, Index, SD), Tasks (ruta, hash, acciones, desencadenadores, horas de ejecución)Análisis forense del registro TaskCache
.job heredadoC:\Windows\Tasks\*.jobTrabajos binarios de Task Scheduler 1.0, última hora de ejecuciónAnálisis forense de archivos .job
Logs de eventosSecurity.evtx, Microsoft-Windows-TaskScheduler%4Operational.evtxQuié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 valores Id (el GUID de la tarea), Index y SD, 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, Triggers y DynamicInfo, un valor binario con la creación de la tarea, su última ejecución y el último resultado.

Tres consecuencias para una investigación:

  1. 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.
  2. Eliminar el valor SD oculta la tarea a schtasks /query y 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.
  3. El registro guarda metadatos de ejecución que el XML no tiene. DynamicInfo registra 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

LogID de eventoSignificadoNotas
Security4698Tarea programada creadaContiene el XML completo de la tarea (Microsoft Learn)
Security4699Tarea eliminada
Security4700 / 4701Tarea habilitada / deshabilitada
Security4702Tarea actualizada
TaskScheduler/Operational106Tarea registradaNombre de la tarea y usuario que la registra, sin la definición
TaskScheduler/Operational140Tarea actualizada
TaskScheduler/Operational141Tarea eliminada
TaskScheduler/Operational200 / 201Acción iniciada / completadaPrueba 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 como rundll32, regsvr32, mshta o certutil.
  • 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 Hash que 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

  1. Adquiera C:\Windows\System32\Tasks (de forma recursiva), C:\Windows\SysWOW64\Tasks, C:\Windows\Tasks, el hive SOFTWARE con sus logs de transacciones .LOG1/.LOG2 y los logs Security y TaskScheduler/Operational. Los targets ScheduledTasks y RegistryHivesSystem de KAPE cubren los archivos y los hives (KapeFiles).
  2. Analice a la vez el XML, los .job y TaskCache, y correlacione cada archivo XML con su entrada de TaskCache por la ruta de la tarea.
  3. 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ó.
  4. Normalice la hora: deduzca o fije el desfase UTC para las horas XML sin zona; mantenga los FILETIME del registro en UTC.
  5. 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

Artículos relacionados

Lista práctica para detectar tareas programadas maliciosas: rutas escribibles, PowerShell codificado, LOLBins, SYSTEM, tareas ocultas y discrepancias XML/registro.
Qué guarda la clave TaskCache de SOFTWARE para cada tarea programada: Id/Index/SD de Tree, valores de Tasks, DynamicInfo, blobs Actions y Triggers, y el Hash.
Paso a paso: cargue XML de tareas, archivos .job y el hive SOFTWARE en un parser gratuito en el navegador, lea tareas ocultas, ajuste la zona horaria y exporte.