Back to Intelligence

Cairn AI-Agent Orchestration Abuse: LLM-Driven Spring Batch Exploitation & Server Takeover — OTX Intelligence Brief

SA
Security Arsenal Team
November 14, 2026
11 min read

Executive Threat Summary

AlienVault OTX pulse data published 2026-11-14 confirms a watershed moment in offensive operations: security researchers have documented the first verified incident in which large language model-driven AI agents autonomously executed substantial portions of a real-world intrusion. The attack required no authentication, no zero-days, and no novel malware — instead, the adversary weaponized an exposed job-submission feature on an Apache Tomcat server running Spring Batch, combined with Cairn, an open-source AI agent orchestration platform, to plan and execute the kill chain at machine speed.

The full attack — initial access through privilege escalation to complete server takeover — concluded in under 24 hours. This collapses traditional dwell-time assumptions. Detection windows measured in days are now measured in minutes. The adversary profile remains unattributed, but the tradecraft signals a broader trend: agentic AI tooling is lowering the skill floor for automated exploitation while raising the tempo ceiling for defenders.

Key takeaway for enterprise defenders: internet-facing application frameworks with unauthenticated administrative or job-submission endpoints are now viable targets for fully automated attack execution. Assume any exposed orchestration, batch, or CI/CD surface will be probed and exploited by AI-driven agents within hours of exposure.

Attack Chain Reconstruction

Based on the pulse's referenced investigation, the observed kill chain:

  1. Reconnaissance (automated) — The Cairn-orchestrated agent enumerated internet-facing Apache Tomcat instances and identified Spring Batch job-submission endpoints lacking authentication controls.
  2. Initial Access — Arbitrary job submission through the exposed Spring Batch endpoint (MITRE ATT&CK T1190 — Exploit Public-Facing Application). No credentials or session tokens were required.
  3. Execution — Attacker-controlled job parameters were used to achieve command execution in the Tomcat service context (T1059 — Command and Scripting Interpreter).
  4. Privilege Escalation — The agent enumerated local privilege escalation paths (service misconfigurations, writable binaries, kernel/service weaknesses) and escalated from the Tomcat service account to root/SYSTEM-level control.
  5. Objective — Full server takeover. In credential-rich environments, servers of this class routinely hold application secrets, database connection strings, API keys, and session material — making this campaign squarely relevant to credential-theft risk modeling even where no dedicated infostealer payload was deployed.

Threat Actor / Malware Profile

Cairn (Abused Open-Source AI Agent Orchestration Platform)

  • Nature: Cairn is a legitimate open-source framework for orchestrating autonomous LLM agents. In this incident it was repurposed as an offensive execution engine — the agent planned steps, generated payloads/commands, interpreted output, and iterated without human-in-the-loop delays.
  • Distribution / Delivery: No malware dropper was required. The 'payload' was attacker-generated job definitions and shell commands submitted directly through the legitimate Spring Batch job-submission API. This is living-off-the-land at the application layer — there are no file hashes to block.
  • Payload behavior: On-the-fly command generation (shell scripts, encoded commands), environment enumeration (env, printenv, config file reads of application.properties / application.yml), and credential material harvesting from Spring configuration, Tomcat tomcat-users.xml, and environment variables.
  • C2 communication: Tasking and exfiltration ride outbound HTTP/HTTPS from the compromised host to attacker infrastructure. Because the agent generates requests dynamically, expect non-standard user agents, burst-pattern request timing inconsistent with human operators, and possible use of legitimate LLM API endpoints as relay points.
  • Persistence mechanism: Post-takeover persistence typically includes new local accounts, SSH authorized_keys injection, systemd service/cron installation, and potentially malicious Spring Batch job definitions scheduled to re-execute attacker code.
  • Anti-analysis techniques: The absence of static malware artifacts defeats hash-based and signature detection. Commands are generated uniquely per run, defeating YARA and IOC-list matching. The only reliable detection surface is behavioral: unauthenticated job submissions, anomalous child processes of the Tomcat JVM, and burst-tempo network patterns.

Adversary Profile

  • Attribution: Unknown. The use of open-source agentic tooling with no bespoke malware suggests either an early-adopter criminal actor or a red-team-grade capability in the wild.
  • Skill level: Paradoxically low-to-moderate — this is the strategic concern. Cairn-style orchestration commoditizes multi-stage exploitation.
  • Targeting: Opportunistic — any internet-exposed Spring Batch / Tomcat job-submission surface. Industry-agnostic scanning logic.

IOC Analysis

This pulse published with zero indicators — indicators were restricted to the original pulse subscribers. That absence is itself analytically significant: this attack produces almost no classical IOCs. There are no malware hashes, no static C2 domains, and no reusable URLs. SOC teams must therefore operationalize this intelligence through behavior, not artifacts:

  • Network indicators to build internally: flag outbound connections from Tomcat/Java processes to non-business destinations; alert on HTTP POSTs to Spring Batch job endpoints (/batch/jobs, /jobs, custom job launcher paths) originating from IPs with no authenticated session history.
  • Host artifacts to hunt: suspicious child processes of java.exe / java (especially cmd.exe, powershell.exe, /bin/sh, /bin/bash, curl, wget, nc); new local users; modified ~/.ssh/authorized_keys; new systemd units or cron entries; anomalous entries in Spring Batch job repository tables (BATCH_JOB_EXECUTION) with attacker-controlled job names/parameters.
  • Tooling: Sysmon (Event ID 1, 3, 8) for process lineage; EDR network modules for Java-initiated egress; application-layer WAF/API gateway logs for unauthenticated job-submission attempts; Sigma/Sentinel analytics below for automated coverage.

Detection Engineering

YAML
---
title: Suspicious Child Process Spawned by Java/Tomcat Process
id: 7f3a1c2e-9b41-4e2a-a1c8-cairn0001a1
status: experimental
description: Detects shell, scripting, or network utility processes spawned by Java/Tomcat — consistent with AI-agent-driven command execution via Spring Batch job submission abuse (Cairn orchestration incident).
author: Security Arsenal Threat Intelligence
date: 2026/11/15
references:
    - https://reliaquest.com/blog/threat-spotlight-how-ai-agents-turned-one-exposed-endpoint-into-a-server-takeover
logsource:
    category: process_creation
    product: windows
detection:
    selection_parent:
        ParentImage|endswith:
            - '\java.exe'
            - '\javaw.exe'
            - '\tomcat9.exe'
            - '\tomcat8.exe'
            - '\catalina.exe'
    selection_child:
        Image|endswith:
            - '\cmd.exe'
            - '\powershell.exe'
            - '\pwsh.exe'
            - '\wscript.exe'
            - '\cscript.exe'
            - '\certutil.exe'
            - '\bitsadmin.exe'
            - '\curl.exe'
            - '\wget.exe'
            - '\net.exe'
            - '\net1.exe'
            - '\whoami.exe'
    condition: selection_parent and selection_child
falsepositives:
    - Legitimate Spring Batch jobs invoking scripts — baseline per-application job behavior
level: high
tags:
    - attack.execution
    - attack.t1059
    - attack.t1190
---
title: Linux Shell or Recon Utility Spawned by Java/Tomcat Service
id: 7f3a1c2e-9b41-4e2a-a1c8-cairn0002b2
status: experimental
description: Detects interactive shells and reconnaissance utilities spawned by Java/Tomcat on Linux — indicator of LLM-agent command execution following Spring Batch endpoint exploitation.
author: Security Arsenal Threat Intelligence
date: 2026/11/15
references:
    - https://reliaquest.com/blog/threat-spotlight-how-ai-agents-turned-one-exposed-endpoint-into-a-server-takeover
logsource:
    category: process_creation
    product: linux
detection:
    selection_parent:
        ParentImage|endswith:
            - '/java'
            - '/jsvc'
    selection_child:
        Image|endswith:
            - '/sh'
            - '/bash'
            - '/dash'
            - '/zsh'
            - '/curl'
            - '/wget'
            - '/nc'
            - '/ncat'
            - '/python'
            - '/python3'
            - '/perl'
            - '/id'
            - '/whoami'
            - '/env'
            - '/cat'
    condition: selection_parent and selection_child
falsepositives:
    - Application jobs that legitimately call system scripts — tune against known job names
level: high
tags:
    - attack.execution
    - attack.t1059.004
    - attack.t1190
---
title: Persistence Artifacts Consistent With Post-Takeover Activity
id: 7f3a1c2e-9b41-4e2a-a1c8-cairn0003c3
status: experimental
description: Detects SSH key injection, cron/systemd persistence creation, or new local account creation executed by web-service accounts — consistent with persistence following AI-agent-orchestrated server takeover.
author: Security Arsenal Threat Intelligence
date: 2026/11/15
logsource:
    category: process_creation
    product: linux
detection:
    selection_user:
        User|contains:
            - 'tomcat'
            - 'www-data'
            - 'nobody'
    selection_cmd:
        CommandLine|contains:
            - 'authorized_keys'
            - 'useradd'
            - 'adduser'
            - '/etc/cron'
            - 'crontab'
            - 'systemctl enable'
            - '/etc/systemd/system/'
            - 'chmod +s'
    condition: selection_user and selection_cmd
falsepositives:
    - Deployment automation (Ansible, CI pipelines) running under service accounts
level: critical
tags:
    - attack.persistence
    - attack.t1098
    - attack.t1053
    - attack.t1543
KQL — Microsoft Sentinel / Defender
// Hunt: AI-agent-driven Spring Batch exploitation & post-exploitation behavior
// Covers: Java/Tomcat spawning shells, recon burst patterns, persistence via service accounts
let Lookback = 14d;
union
(
    DeviceProcessEvents
    | where TimeGenerated > ago(Lookback)
    | where InitiatingProcessFileName in~ ("java.exe", "javaw.exe", "tomcat9.exe", "java", "jsvc")
    | where FileName in~ ("cmd.exe", "powershell.exe", "pwsh.exe", "sh", "bash", "curl", "wget", "nc", "python3", "whoami", "id", "env")
    | project TimeGenerated, DeviceName, InitiatingProcessFileName, FileName, ProcessCommandLine, AccountName, InitiatingProcessCommandLine
    | extend HuntSignal = "Java/Tomcat spawned shell or recon tool"
),
(
    DeviceNetworkEvents
    | where TimeGenerated > ago(Lookback)
    | where InitiatingProcessFileName in~ ("java.exe", "javaw.exe", "java", "jsvc")
    | where RemotePort in (80, 443, 8443, 4444, 8080)
    | where RemoteUrl !has_any ("microsoft.com", "oracle.com", "maven.org", "spring.io") // tune to known business destinations
    | summarize ConnectionCount = count(), Destinations = make_set(RemoteIP, 20) by DeviceName, InitiatingProcessFileName, bin(TimeGenerated, 10m)
    | where ConnectionCount > 40 // burst tempo inconsistent with human-driven sessions
    | extend HuntSignal = "High-tempo egress from Java process — possible agentic C2/exfil"
)
| order by TimeGenerated desc;
PowerShell
# Security Arsenal - Cairn/Spring Batch Takeover Hunt Script
# Checks Windows hosts for post-exploitation artifacts consistent with the OTX-reported incident.
# Run elevated. Review output before taking containment action.

$Report = @()

Write-Host "[*] Checking for suspicious child processes of Java/Tomcat (last 24h)..." -ForegroundColor Cyan
$Procs = Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4688; StartTime=(Get-Date).AddDays(-1)} -ErrorAction SilentlyContinue |
    Where-Object { $_.Message -match 'java.exe|javaw.exe|tomcat9.exe' -and $_.Message -match 'cmd.exe|powershell.exe|curl.exe|whoami.exe|net.exe' }
if ($Procs) {
    $Report += "[ALERT] Java/Tomcat spawned shells/tools: $($Procs.Count) events"
    $Procs | Select-Object -First 10 | ForEach-Object { $Report += $_.Message.Substring(0, [Math]::Min(400, $_.Message.Length)) }
} else { $Report += "[OK] No suspicious Java child processes found." }

Write-Host "[*] Checking for recently created local accounts..." -ForegroundColor Cyan
$NewUsers = Get-LocalUser | Where-Object { $_.Enabled -eq $true } | ForEach-Object {
    $evt = Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4720; StartTime=(Get-Date).AddDays(-7)} -ErrorAction SilentlyContinue |
        Where-Object { $_.Message -match $_.Name }
    if ($evt) { $_ }
}
if ($NewUsers) { $Report += "[ALERT] Local accounts created in last 7 days: $($NewUsers.Name -join ', ')" }
else { $Report += "[OK] No new local accounts detected." }

Write-Host "[*] Checking scheduled tasks registered under service accounts..." -ForegroundColor Cyan
$Tasks = Get-ScheduledTask | Where-Object {
    $_.Principal.UserId -match 'SYSTEM|NETWORK SERVICE|LOCAL SERVICE' -and
    $_.Date -and ([datetime]$_.Date) -gt (Get-Date).AddDays(-7) -and
    $_.TaskPath -notlike '\Microsoft*'
}
if ($Tasks) { $Report += "[REVIEW] Recently registered non-Microsoft tasks: $($Tasks.TaskName -join ', ')" }
else { $Report += "[OK] No suspicious scheduled tasks." }

Write-Host "[*] Checking Tomcat service network connections..." -ForegroundColor Cyan
$JavaPids = (Get-Process java,javaw,tomcat9 -ErrorAction SilentlyContinue).Id
foreach ($p in $JavaPids) {
    $conns = Get-NetTCPConnection -OwningProcess $p -State Established -ErrorAction SilentlyContinue |
        Where-Object { $_.RemoteAddress -notmatch '^(10\.|192\.168\.|172\.(1[6-9]|2[0-9]|3[01])\.|127\.)' }
    if ($conns) { $Report += "[REVIEW] Java PID $p external connections: $($conns.RemoteAddress -join ', ')" }
}

Write-Host "[*] Checking for SSH authorized_keys modifications..." -ForegroundColor Cyan
$sshKeys = Get-ChildItem -Path "C:\Users" -Recurse -Filter "authorized_keys" -ErrorAction SilentlyContinue |
    Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-7) }
if ($sshKeys) { $Report += "[ALERT] Recently modified authorized_keys: $($sshKeys.FullName -join ', ')" }
else { $Report += "[OK] No recent authorized_keys modifications." }

$Report | Out-File "$env:TEMP\cairn_hunt_report.txt"
Write-Host "`n===== HUNT REPORT =====" -ForegroundColor Yellow
$Report | ForEach-Object { Write-Host $_ }
Write-Host "Report saved to $env:TEMP\cairn_hunt_report.txt" -ForegroundColor Green

Response Priorities

Immediate (0-4 hours)

  • Enumerate exposure: scan your external attack surface for Apache Tomcat instances and Spring Batch endpoints (/batch/*, /jobs, actuator endpoints). Take any unauthenticated job-submission interface offline or behind authentication immediately.
  • Deploy behavioral detections: activate the Sigma rules above; Java/Tomcat spawning shells is a high-fidelity signal with low legitimate noise in most environments.
  • Hunt: run the PowerShell hunt script and Sentinel query across all application servers, prioritizing internet-facing systems.
  • Block at the edge: restrict outbound egress from application servers to documented business destinations only.

24 Hours

  • Credential rotation: because server takeover exposes Spring configuration secrets, database connection strings, API keys, and Tomcat user credentials, treat any confirmed-compromised host as a full credential exposure event. Rotate all secrets stored on or referenced by affected hosts, including downstream database and cloud credentials.
  • Session and token invalidation: revoke active sessions and API tokens minted from affected servers.
  • Log review: pull Spring Batch job repository records (BATCH_JOB_EXECUTION, BATCH_JOB_EXECUTION_PARAMS) and Tomcat access logs for the prior 30 days; look for job submissions with no corresponding authenticated user and abnormal job names/parameters.

1 Week

  • Architecture hardening: enforce authentication and authorization on all job-submission, actuator, and administrative endpoints; place Spring Batch admin surfaces behind an authenticated API gateway or remove them from internet-facing services entirely.
  • Egress control: implement default-deny outbound firewall policy for application server VLANs — agentic attacks depend on outbound connectivity for C2 and exfiltration.
  • Process control: deploy application allow-listing or EDR rules preventing Java/Tomcat from spawning interactive shells in production.
  • Assume-tempo planning: update incident response playbooks for sub-24-hour machine-speed intrusions — automated containment triggers (host isolation on high-fidelity signals) rather than human-gated response.

Analyst Assessment

This pulse represents an inflection point: the commoditization of autonomous offensive agents means the window between exposure and full compromise has collapsed from weeks to hours. Organizations cannot rely on IOC-driven defense against attacks that generate their tooling on the fly. The durable controls are architectural: authenticated endpoints, egress restrictions, behavioral process-lineage detection, and secrets management that assumes host compromise. Treat every unauthenticated application feature on your perimeter as a pre-positioned foothold for an AI-driven adversary.

Related Resources

Security Arsenal Incident Response Managed SOC & MDR Services AlertMonitor Threat Detection From The Dark Side Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.