¿Qué son las tareas programadas de Windows?
El Programador de tareas ejecuta programas al arrancar, al iniciar sesión, según un calendario, ante un evento o cuando el equipo está inactivo. Windows incluye cientos de tareas propias y los instaladores de software añaden más. También es una de las formas más habituales que usan los atacantes para mantener el acceso a un equipo (MITRE ATT&CK T1053.005).
Cada tarea existe en dos lugares: una definición XML en disco y una caché en el subárbol del registro SOFTWARE, que es la que realmente carga el Programador de tareas. Comparar ambas es la forma de encontrar tareas ocultas, manipuladas o cuyos archivos se eliminaron.
Dónde se guardan las evidencias
- C:\Windows\System32\Tasks\ — un archivo XML por tarea (UTF-16LE, sin extensión): autor, fecha de registro, desencadenadores, cuenta con la que se ejecuta, configuración y acciones (línea de comandos, controlador COM).
- SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache — Tree (rutas de tareas con los valores Id, Index y SD) y Tasks\{GUID} (Path, Hash, Actions, Triggers y DynamicInfo con los FILETIME de creación y última ejecución).
- C:\Windows\Tasks\*.job — trabajos heredados del Programador de tareas 1.0: aplicación, parámetros, autor, hora de la última ejecución.
- Registros relacionados (no se analizan aquí): los event IDs 4698–4702 de Security cuando la auditoría de acceso a objetos está activada, y Microsoft-Windows-TaskScheduler/Operational (106 registrada, 140 actualizada, 141 eliminada, 200/201 acción iniciada/completada).
Qué comprueba esta herramienta
- Tareas ocultas: una entrada Tree del TaskCache sin su valor SD (la técnica «Tarrask»), invisible para schtasks y la consola, pero que sigue ejecutándose.
- Archivos eliminados o plantados: tareas registradas sin archivo XML y archivos XML sin registro; archivos XML editados después del registro (hash del TaskCache) y acciones del registro que difieren del archivo.
- Contenido sospechoso: PowerShell codificado (lo decodificamos por ti), LOLBins, comandos en rutas de red o con escritura de usuario, SYSTEM o privilegios más altos en tareas que no son de Microsoft, tareas ocultas que no son de Microsoft, nombres de aspecto aleatorio y tareas registradas recientemente.
- Marcas de tiempo: fecha de registro, creación en el TaskCache, última ejecución y última ejecución correcta, límites de inicio de los desencadenadores y horas de última escritura de las claves del registro, en una única cronología filtrable.
Limitaciones
- Los registros de transacciones del registro no se aplican: se señala un subárbol «sucio», pero faltan los cambios que aún están en SOFTWARE.LOG1/LOG2.
- Los valores binarios del TaskCache (DynamicInfo, Actions, Triggers) no están documentados; su estructura procede de ingeniería inversa pública. Solo se decodifican la cabecera de Triggers y el principal, no cada registro de desencadenador.
- Las fechas del XML, las horas de los desencadenadores y las horas de los .job son hora local sin zona; el desfase se deduce cuando es posible y se muestra.
- No se hace carving de claves del registro ni de archivos XML eliminados; para eso hay que buscar en los registros de eventos y en las instantáneas de volumen.
Cómo obtener los archivos
- Recoge C:\Windows\System32\Tasks (y C:\Windows\Tasks) y el subárbol SOFTWARE con KAPE (ScheduledTasks + RegistryHivesSystem), Velociraptor (Windows.Triage.Targets) o con reg save y una copia de la carpeta.
- Conserva la estructura de carpetas (…\Windows\System32\Tasks, …\Windows\System32\config\SOFTWARE) para que las tareas se emparejen con el subárbol correcto cuando un ZIP contiene varios equipos.
- Recoge la carpeta Tasks completa: los archivos XML que faltan solo se señalan cuando la mayoría de las tareas registradas tienen el suyo.
Preguntas frecuentes
¿Se suben mis archivos a algún sitio?
No. El parser, incluidos sus lectores de registro y de XML, está escrito en Rust compilado a WebAssembly y se ejecuta en un Web Worker de tu navegador. No existe ningún endpoint de subida.
¿Cómo encuentra las tareas ocultas (Tarrask)?
El Programador de tareas solo muestra una tarea si su clave TaskCache\Tree tiene un valor SD (descriptor de seguridad). Un malware con privilegios de SYSTEM puede eliminar ese valor: la tarea desaparece de schtasks y de la consola, pero sigue ejecutándose. La herramienta señala cada clave Tree que tiene un Id de tarea pero no SD, y muestra la hora de última escritura de la clave.
¿Por qué necesito tanto la carpeta Tasks como el subárbol SOFTWARE?
Cada uno cuenta la mitad de la historia. El archivo XML es la definición legible; el TaskCache es lo que realmente carga el Programador de tareas. Las tareas registradas sin archivo XML, los archivos que nunca se registraron, los XML editados tras el registro y las acciones del registro que difieren del archivo solo aparecen al comparar ambos.
¿Por qué están desplazadas las horas?
Windows escribe la fecha de registro y las horas de los desencadenadores en el XML de la tarea como hora local sin zona horaria, mientras que las horas del TaskCache están en UTC. La herramienta deduce el desfase del equipo comparando ambas en las mismas tareas, y también puedes configurarlo tú.
¿Una tarea señalada es maliciosa?
No necesariamente. Los hallazgos son pistas de triaje: hay actualizadores de terceros que se ejecutan como SYSTEM desde ProgramData y herramientas de administración que usan PowerShell codificado. Lee la explicación de cada hallazgo y contrástala con otros artefactos.