<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Dhrumil Patel - Elastic Security Labs]]></title>
    <description><![CDATA[Trusted security news & research from the team at Elastic.]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Dhrumil Patel - Elastic Security Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte2c6b841aff36df4/6a88d9784acc96e3f324863d/security-labs-thumbnail.png</url>
      <link>https://www.elastic.co/security-labs/author/dhrumil-patel</link>
    </image>
    <link>https://www.elastic.co/security-labs/author/dhrumil-patel</link>
    <atom:link href="https://www.elastic.co/security-labs/rss/author/dhrumil-patel.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[en]]></language>
    <lastBuildDate>Mon, 14 Sep 2026 12:00:06 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Benchmarking the Agentic SOC: How we evaluate LLMs for security workflows]]></title>
    <description><![CDATA[Public leaderboards can't tell you which LLM to trust in your SOC, so Elastic built an evaluation framework that grades models on the work (tool calls, execution traces, blind judging) across Agent Builder, Attack Discovery, and automatic migration.]]></description>
    <content:encoded><![CDATA[<p>An agentic SOC is only as good as the model driving it. The moment you let an LLM triage an alert, hunt across your telemetry, or author a detection rule, the question stops being "is this a smart model?" and becomes something much more specific: will it pick the right skill, call the right tool in the right order, and reach the right disposition without inventing a result it never actually checked?</p>
<p>That is not a question a general-purpose leaderboard can answer. A model can top every public benchmark and still confidently tell you a malicious loader is "clean" because it narrated a VirusTotal verdict instead of calling VirusTotal. In a SOC, that is not a rounding error. That is a missed intrusion.</p>
<p>So we built an evaluation framework to answer the question directly. It seeds a realistic intrusion into a live Elastic deployment, drives every available model through the same set of security tasks against the same agent, captures not just what each model said but every tool it called and every parameter it passed, and then judges the results blind. This post explains how it works and why we built it the way we did. The results themselves are published and continuously updated in the <a href="https://www.elastic.co/docs/solutions/security/ai/large-language-model-performance-matrix">Large language model performance matrix for Elastic Security</a>.</p>
<h2 id="whygenericllmbenchmarksfailforagentsforsecurity">Why generic LLM benchmarks fail for agents for security</h2>
<p>Public leaderboards measure knowledge and chat quality. They ask a model to recall facts, solve a puzzle, or write a tidy paragraph. Those are real capabilities, but they are the wrong proxy for agentic security work.</p>
<p>Inside an agent, the model is not writing prose. It is making decisions:</p>
<ul>
<li>Which skill does this task need? Alert triage and entity risk-scoring are different jobs with different tools.  </li>
<li>Which tool, with which parameters, in which order? A hash goes to VirusTotal; an on-call question goes to the schedule; a case gets opened once, with the right fields.  </li>
<li>Is the output grounded? Did the model actually run the query and read the result, or did it produce a plausible answer with an empty trace?</li>
</ul>
<p>The most dangerous failure mode in an agentic SOC is the confident, fluent, wrong answer that was never grounded in a tool call. Generic benchmarks reward exactly that, because they only see the final text. To evaluate a SOC agent honestly, you have to grade the work, not the writing.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf218221ce18fe645/6a7c896d9f5251038f664102/image6.gif" alt="The most dangerous answer in a SOC: a fluent model response with no tool call to verify the claim it is making" title="The most dangerous answer in a SOC: a fluent model response with no tool call to verify the claim it is making" /></p>
<h2 id="whatweactuallyneedtomeasure">What we actually need to measure</h2>
<p>We anchored the evaluation on the concrete capabilities a security analyst relies on, most of them built-in Agent Builder skills we shipped in Elastic Security. (For the product side of that story, see our companion post on the <a href="https://www.elastic.co/security-labs/skills-elastic-security-9-4">five Agent Builder skills in Elastic Security</a>.) That gives us seven capability categories:</p>
<p>| Category | What it tests |
| :---- | :---- |
| Alert analysis | Triage an alert, reach the correct disposition, pull related alerts, enrich with threat intel |
| Entity analytics | Investigate hosts and users with purpose-built entity lookups and risk context |
| Threat hunting | Generate and run queries against process, file, and network telemetry to find specific artifacts |
| Detection rules | Author a working detection rule, grounded in research when asked |
| Workflow authoring | Produce a valid, executable automation workflow (verified by actually running it) |
| Triggering workflows | Call the correct backed action for the task (hash lookup, on-call, case creation) |
| Multi-step | Chain several steps in the right order, carrying findings forward without skipping or fabricating |</p>
<p>These categories deliberately straddle two levels of the agent. Alert analysis, entity analytics, threat hunting, and detection rules are built-in Agent Builder skills; workflow authoring exercises the platform workflow capability; and triggering workflows and multi-step response exercise the custom tools and the model's ability to chain them. So the suite measures both things that matter: whether the model routes to the right skill, and whether it then selects and orders the right tools.</p>
<p>Alongside the agent suite, we run two parallel evaluations that apply the same philosophy to different tasks. One is Attack Discovery, which uses an LLM to correlate raw alerts into coherent attack narratives. The other is Automatic Migration, which uses an LLM to translate detection content from another SIEM (Splunk, QRadar, or Microsoft Sentinel) into Elastic rules. Each has its own answer key, so we grade them separately.</p>
<h2 id="theframeworkendtoend">The framework, end to end</h2>
<p>The whole system is one automated flow. Seed the right data, point every model at the same agent and the same prompts, capture the full trace of what each model did, then anonymize and judge.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc6401de86cee918b/6a7c8971448e4e9cea5baca3/image7.gif" alt="The evaluation framework, end to end: the agent suite, Attack Discovery, and Automatic Migration each start from their own data, and all three converge on the same blind obfuscation, judging, and reporting backbone." title="The evaluation framework, end to end: the agent suite, Attack Discovery, and Automatic Migration each start from their own data, and all three converge on the same blind obfuscation, judging, and reporting backbone." /></p>
<p>The design principle throughout: hold everything constant except the model. Same agent, same skills and tools, same data, same prompts. The only variable that changes between runs is which model is answering. That is what makes the comparison fair.</p>
<h2 id="seedingarealisticrange">Seeding a realistic range</h2>
<p>You cannot benchmark an investigation without something to investigate. Real product telemetry is noisy, sensitive, and non-reproducible, so we generate a synthetic intrusion instead.</p>
<p>The scenario is the Chrysalis backdoor campaign we detailed in our <a href="https://www.elastic.co/security-labs/speeding-apt-attack-discovery-confirmation-with-attack-discovery-workflows-and-agent-builder">earlier Attack Discovery</a> post: a DLL side-loading attack on a Windows host, <code>srv-win-defend-01</code>, where a legitimate-looking <code>BluetoothService.exe</code> loads a malicious <code>log.dll</code>. A simulator seeds the alerts, endpoint telemetry, threat-intel documents, and an on-call schedule that make the scenario coherent enough for an agent to actually work through.</p>
<p>One methodology detail matters here. The "malicious loader" in the scenario carries the <a href="https://en.wikipedia.org/wiki/EICAR_test_file">EICAR test file</a> hash. EICAR is the industry-standard harmless test string that every antivirus engine flags as malicious by design. Using it as the stand-in loader means VirusTotal returns a stable, unambiguous "malicious" verdict on every run, we never touch real malware, and the ground truth never drifts. A correct model reports "malicious, flagged by many engines." A model that says "clean" or never calls VirusTotal is wrong, deterministically.</p>
<p>There is a second dataset in play, a set of eight independent detection episodes producing roughly 95 alerts, which we use as the ground truth for Attack Discovery. And this is where the most important operational rule lives:</p>
<p><em>The two suites need different, mutually exclusive alert data. Attack Discovery runs against the clean episodes-only index, because its answer key assumes exactly those threats are present. Agent Builder runs with the Chrysalis intrusion seeded on top, because its prompts reference Chrysalis entities. Mix them, and both answer keys become meaningless.</em></p>
<p>Getting this wrong does not throw an error. It silently corrupts the results. So the harness treats the index state as a first-class step: prep the correct data, print the alert counts, and pause for an explicit go-ahead before a single model request is sent.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt13b7c90c64cc9616/6a7c897451156a40212bca0f/image3.png" alt="Ground truth by construction. Each suite grades against a fixed answer key we built on purpose, and the EICAR test hash makes the VirusTotal verdict identical on every run, with no real malware involved." title="Ground truth by construction. Each suite grades against a fixed answer key we built on purpose, and the EICAR test hash makes the VirusTotal verdict identical on every run, with no real malware involved." /></p>
<h2 id="theagentundertest">The agent under test</h2>
<p>Every model drives the same agent: the full Elastic AI Agent, with all of Elastic Security's built-in skills enabled (alert analysis, threat hunting, entity analytics, detection-rule editing, and more), extended with five custom, workflow-backed tools from the Chrysalis scenario. Skills and tools sit side by side on the agent. The built-in skills carry the investigative capabilities, and each one, when the model reaches for it, unlocks its own underlying tools. The five custom tools below bolt on the response actions the scenario needs:</p>
<p>| Tool | What it does |
| :---- | :---- |
| vt.hash.lookup | Analyze a file hash with VirusTotal |
| check.on.call.schedule | Query the on-call schedule for the current responder |
| create.case | Open a case in Elastic Security |
| create.channel | Create a Slack channel for incident coordination |
| get.time | Get the current time for naming and timestamps |</p>
<p>These are live tools hitting live systems, including a real Slack connector. When a model decides to open a case or spin up an incident channel, it actually happens. That is deliberate: we want to measure what the model does when the tools are real and the side effects are real, not whether it can describe calling them.</p>
<p>Because those side effects accumulate, the harness cleans up after every call. Authored validation workflows are deleted, and any Slack channels the agent created are archived through the same connector the agent used. Cases are intentionally kept for later inspection.</p>
<p>The agent is given a two-phase playbook in its instructions. First a <strong>confirmation phase</strong>: verify the hash on VirusTotal, hunt the logs for corroborating activity, ground the finding in research, and reach a verdict. Then a <strong>response phase</strong>, entered only when the threat is confirmed: get the time, find the on-call responder, open a case, and spin up an incident channel. It is explicitly told not to open cases or channels for benign or low-confidence findings unless asked. That structure gives every model the same operating procedure, so what we are measuring is how well each one executes it, not whether it happened to guess the workflow.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta7c4190416ccbf85/6a7c8977437e0fd5e9dd56f7/image1.gif" alt="The agent's two-phase playbook. Every model gets the same operating procedure; the gate in the middle is the judgment test, since escalating a benign finding is as wrong as missing a real one." title="The agent's two-phase playbook. Every model gets the same operating procedure; the gate in the middle is the judgment test, since escalating a benign finding is as wrong as missing a real one." /></p>
<p>The model routing is the elegant part. Every model on the deployment is exposed as an inference connector, and the converse API takes a <code>connector_id</code> per call. So swapping models is a one-field change. The agent, its tools, its instructions, and the data underneath it never move.</p>
<h2 id="thepromptmatrix">The prompt matrix</h2>
<p>The suite is 21 prompts: three variants for each of the seven capabilities, all revolving around the same Chrysalis incident so the run reads like one coherent investigation rather than disconnected trivia. Prompts are written the way an analyst actually talks, and some carry attachments, the latest alert document or a detection rule to edit, so the model has real context to work from.</p>
<p>The three variants per capability are not just repetition. They escalate the difficulty in a deliberate way:</p>
<ul>
<li><strong>Variant A is the clear single-skill ask.</strong> The task names what it wants, and there is one obviously right tool for the job.  </li>
<li><strong>Variant B is realistic.</strong> It reads like a real analyst request, with enough context to be actionable but no explicit instruction on which tool to reach for.  </li>
<li><strong>Variant C is ambiguous, routing under pressure.</strong> It is underspecified or slightly misleading, so the model has to infer intent and still pick the right capability. This is where weaker models overreach or grab the wrong tool.</li>
</ul>
<p>To make the escalation concrete, here is one capability, alert analysis, across all three variants:</p>
<ul>
<li><strong>A (clear):</strong> "Take a look at this alert and tell me what's going on. Is it something I should worry about, and what's your recommended disposition?" (latest alert attached)  </li>
<li><strong>B (realistic):</strong> "We've got alerts firing on srv-win-defend-01. Triage what's in the alert queue for that host, are these related to the same incident, and which entities do they share?"  </li>
<li><strong>C (ambiguous):</strong> "I'm seeing noise on srv-win-defend-01. Is this a real threat or a false positive? Pull in any threat intel that would help me decide."</li>
</ul>
<p>Same capability, escalating difficulty: A names the task and the right tool is obvious, B forces the model to infer intent from context, and C is underspecified and slightly misleading, so the model has to resist the "false positive" framing and still investigate.</p>
<p>A few representative prompts across the other capabilities:</p>
<ul>
<li><strong>Threat hunting:</strong> "Hunt for signs of the Chrysalis backdoor on srv-win-defend-01. Look for BluetoothService.exe execution, suspicious DLL loads, and any C2 network or DNS activity. Walk me through what you discover."  </li>
<li><strong>Triggering workflows:</strong> "The Chrysalis loader hash is \&lt;loader-hash&gt;. Check this hash against VirusTotal and tell me the verdict, how many engines flagged it and what threat name."  </li>
<li><strong>Multi-step:</strong> "There's a confirmed Chrysalis incident on srv-win-defend-01. Verify the loader hash on VirusTotal, check the on-call schedule, open a critical Security case, then spin up a Slack incident channel with the on-call responder and post the case summary and top IOCs."</li>
</ul>
<p>The multi-step prompts are where models separate. They require ordering, carrying a finding from one step into the next, and knowing when not to act. One variant explicitly says "don't escalate if it's benign," which tests judgment: since the scenario is a true positive, the correct behavior is to escalate, and a model that bails out has misread the evidence.</p>
<h2 id="whatasinglellmevaluationrunlookslike">What a single LLM evaluation run looks like</h2>
<p>Before we scale to every model, it helps to watch a single prompt run end to end. The harness dispatches the prompt to the converse API, the agent routes to the right skill, and from there the work is real. It verifies the loader hash on VirusTotal, generates and runs an ES|QL hunt that turns up the corroborating events, checks the on-call schedule and resolves the responder in Slack, opens a critical case, and spins up an incident channel with the verdict and the top IOCs. Then the harness verifies the side effects and archives the channel it created. Every step, every tool call, every parameter and result, is captured as it happens.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8f11e71f69fb9e5b/6a7c897abdcff07344c3d1cd/image8.gif" alt="One prompt, executed end to end against live systems. The captured trace on the right is the evidence we grade later; the same choreography runs for all 21 prompts against every model." title="One prompt, executed end to end against live systems. The captured trace on the right is the evidence we grade later; the same choreography runs for all 21 prompts against every model." /></p>
<p>That is one prompt. A full sweep is 21 prompts against every model in the catalog, more than 500 evaluated conversations, each one recorded in full.</p>
<h2 id="capturingtooltracestokensandlatencyinagentworkflows">Capturing tool traces, tokens and latency in agent workflows</h2>
<p>This is the part that makes the framework more than a chatbot bake-off. For every single call, we capture the final answer and the full execution trace: the ordered steps the agent took, each reasoning turn, each tool it invoked with the exact parameters, the tool's result, plus token usage, latency, and the conversation and round identifiers. When a task routes through a built-in skill, the trace shows the model loading that skill first and then calling the tools the skill unlocks; when it uses a custom tool like <code>vt.hash.lookup</code>, the call shows up directly. Either way, the tool calls are the evidence.</p>
<p>Here is a real captured step from a triggering-workflows prompt, trimmed for length. The model was asked to verify the loader hash on VirusTotal:</p>
<pre><code>{
  "steps": [
    {
      "type": "reasoning",
      "reasoning": "The user provided a file hash for the 'Chrysalis loader' and requested a VirusTotal verdict, including the number of flagging engines and the threat name. I will use the vt_hash_lookup tool to retrieve this."
    },
    {
      "type": "tool_call",
      "tool_id": "vt.hash.lookup",
      "params": { "hash": "275a021b...fd0f" },
      "results": [
        { "last_analysis_stats": { "malicious": 65, "undetected": 3 } }
      ]
    }
  ],
  "response": {
    "message": "The hash was flagged by 65 engines on VirusTotal..."
  }
}
</code></pre>
<p>That trace is the evidence. It lets us answer the questions a final answer alone cannot:</p>
<ul>
<li>Did the model actually call <code>vt.hash.lookup</code>, or did it assert a verdict with no tool call? (If the latter, the answer is unsubstantiated, no matter how confident.)  </li>
<li>Did it use the purpose-built entity tools, or fall back to a generic search and invent a risk score?  </li>
<li>For threat hunting, is there an executed query in the trace, or just a claim of findings?</li>
</ul>
<p>For workflow authoring, we go one step further and capture objective ground truth. When a model writes a workflow, the harness actually creates it, enables it, runs it, and polls the execution to a terminal status. The result is not a judgment call about whether the YAML "looks right." It either validated and executed against the live system or it did not.</p>
<h2 id="blindllmevaluationhowweremovemodelbiasfromscoring">Blind LLM evaluation: how we remove model bias from scoring</h2>
<p>Once the matrix has run, every model has produced 21 traces. Scoring them by hand, knowing which vendor produced which output, is a recipe for bias. So we anonymize first.</p>
<p>A deterministic obfuscation step strips the model names and relabels everything Model A, Model B, Model C, and so on, consistently across every report and across both suites, so the same model wears the same label everywhere. It also scrubs identity giveaways out of the traces themselves, the connector ids and slugified vendor names that leak into things like workflow tags, while leaving legitimate vendor mentions in tool output intact. With more than two dozen models in a run, the judge, whether a human or an LLM, sees only the labels and the traces.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt00eaf353d6a6ae2d/6a7c897ee3a21900c399981d/image4.gif" alt="Blind LLM evaluation strips model names to anonymous labels before scoring to remove bias from security benchmarking." title="Blind LLM evaluation strips model names to anonymous labels before scoring to remove bias from security benchmarking." /></p>
<p>The judging rubric grades every capability on a 1 to 10 scale and weighs two things at once:</p>
<ul>
<li><strong>Answer quality:</strong> correctness against the ground-truth answer key, soundness of the disposition, depth, and actionability.  </li>
<li><strong>Tool and skill selection:</strong> did the model call and use the right tool for the job, in a reasonable order, without a pile of irrelevant calls or fabricated results?</li>
</ul>
<p>And the rule that keeps the whole thing honest:</p>
<p><em>No tool call, no credit. A plausible answer produced without the supporting tool calls the task required is capped at 6 out of 10, because the result is unsubstantiated. A confident wrong answer scores lower than a hedged correct one. Evidence over eloquence.</em></p>
<p>Reliability is tracked separately from quality. Some attempts error out or time out; those are counted as reliability failures and excluded from the quality average rather than being silently folded in. A model that is brilliant when it works but fails a third of the time is a different proposition from one that is merely good but never falls over, and the report shows both.</p>
<h2 id="whatthissurfacesthatleaderboardsmiss">What this surfaces that leaderboards miss</h2>
<p>Because we grade the trace and not the prose, the framework consistently surfaces failure modes that a text-only benchmark would score as passing:</p>
<ul>
<li><strong>Fabricated verdicts.</strong> A model asserts a hash is malicious, or benign, without ever calling VirusTotal. Fluent, confident, and unsubstantiated.  </li>
<li><strong>Skipping purpose-built tools.</strong> For entity questions, a model leans on a generic search and invents a risk score instead of calling the entity lookups that would return the real one.  </li>
<li><strong>Workflows that do not run.</strong> Authored YAML that reads perfectly but fails validation or execution against the live system. The prose was fine; the automation was broken.  </li>
<li><strong>Reasoning strong, tool use weak.</strong> Some models narrate an excellent investigation plan and then do not execute it. Others quietly do exactly the right thing with minimal commentary. Only the trace tells them apart.</li>
</ul>
<p>The headline finding is not "model X wins." It is that ranking flips depending on the capability. A model that is excellent at open-ended threat-hunting reasoning can be middling at the disciplined tool selection that multi-step response demands. The right model for an agentic SOC is a per-capability decision, and this framework is what lets you make it with evidence instead of vibes.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltce29d0adc1159806/6a7c89818fc2d0336a3e89d1/image2.gif" alt="Illustrative per-capability scores (anonymized as Model A-Z). The leader changes as the capability changes, which is exactly why we publish a per-capability profile instead of a single number." title="Illustrative per-capability scores (anonymized as Model A-Z). The leader changes as the capability changes, which is exactly why we publish a per-capability profile instead of a single number." /></p>
<h2 id="evaluatingattackdiscoveryhowllmscorrelatealertsintoattacknarratives">Evaluating Attack Discovery: how LLMs correlate alerts into attack narratives</h2>
<p>The Attack Discovery suite runs the same philosophy on a different task. Attack Discovery has no tools; the model works purely from the alert context it is handed. Every model gets the identical clean corpus of roughly 95 alerts, which we constructed to contain exactly eight independent intrusions, one per host, spanning macOS, Windows, and Linux and built from real, publicly documented malware families. That number, eight, is the single most important figure in the evaluation. A top-tier model produces eight clean discoveries. Weaker ones surface a fraction of them, merge distinct intrusions into one blurry narrative, or over-split a single attack into several.</p>
<p>We grade the output on four axes, each on the same 1 to 10 scale:</p>
<ul>
<li><strong>Coverage:</strong> how completely the eight intrusions are accounted for, penalizing both misses and threats hidden by merging.  </li>
<li><strong>Accuracy:</strong> correct host, malware family, kill chain, and MITRE mapping, with fabrication penalized hard.  </li>
<li><strong>Correlation quality:</strong> the right alerts grouped together, without merging separate intrusions or over-splitting one.  </li>
<li><strong>Actionability:</strong> usable titles and summaries, a correct entity picture, and sensible risk prioritization.</li>
</ul>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt26e534cb1232772e/6a7c898442a1173ac4956209/image5.gif" alt="Attack Discovery evaluation: 95 alerts containing 8 real intrusions, scored on whether LLMs correlate them correctly." title="Attack Discovery evaluation: 95 alerts containing 8 real intrusions, scored on whether LLMs correlate them correctly." /></p>
<p>The guiding principle is that a clean, accurate eight beats a noisy twelve. Surfacing extra "discoveries" that are really fragments of the same attack is not thoroughness, it is noise an analyst has to untangle. As with the agent suite, latency is reported as a secondary signal and never folded into quality, because correlation speed matters operationally when Attack Discovery runs on a schedule, but a fast wrong answer is still wrong.</p>
<h2 id="evaluatingautomaticmigrationusingllmstoportdetectionsfromothersiemstoelastic">Evaluating Automatic Migration: Using LLMs to Port Detections from Other SIEMs to Elastic</h2>
<p>The third suite leaves the agent behind entirely and evaluates a different LLM-powered capability: <a href="https://www.elastic.co/docs/solutions/security/get-started/automatic-migration">Automatic Migration</a>, the feature that ports detection content from other SIEMs into Elastic such as <a href="https://www.elastic.co/blog/automatic-migration-ai-rule-translation">Splunk</a>, <a href="https://www.elastic.co/security-labs/from-qradar-to-elastic">QRadar</a>, and, as of 9.5 release, <a href="https://www.elastic.co/security-labs/sentinel-detection-rules-migration">Microsoft Sentinel</a>. Here the model is not calling tools in a loop, it is doing a bulk translation job, and we grade it on how faithfully it lands. We evaluated it on a Splunk package for this run; the same method applies to any supported source.</p>
<p>The input used are real Splunk detection rules: 52 saved searches built on Sysmon and Windows event telemetry, spanning credential access, defense evasion, discovery, and persistence. Every model migrates the identical package, so the comparison is apples to apples. The wrinkle that makes this hard is macros. Splunk searches lean on reusable macros, and 33 of the 52 rules are macro-only, meaning their entire detection logic lives behind a single macro reference like <code>sysmon_detect_dcsync_execution</code> rather than in the search text itself. So we hand the feature both files it needs, the 52 searches and the 200 macro definitions they depend on, and a faithful migration has to resolve that nesting instead of translating the surface text.</p>
<p>Scoring is deliberately simple and objective. Each of the 52 rules earns a score based on translation fidelity:</p>
<p>| Score | Result | What it means |
| :---- | :---- | :---- |
| 1.0 | Full translation | The Elastic rule reproduces the Splunk detection end to end, with macros expanded, filters preserved, and fields correctly mapped |
| 0.5 | Partial translation | The core intent is captured but with gaps, such as an unresolved macro, a dropped filter or eval, or an incomplete field mapping |
| 0 | Miss | Not translated or translated into something that does not reflect the original detection |</p>
<p>Sum the per-rule points, divide by 52, and multiply by 10 to land on the same 1 to 10 scale as the other suites. The result is a single, legible number for a genuinely messy task: what fraction of a real customer's detection library would survive an automated migration, and how much of it would land clean versus need an analyst's rework.</p>
<h2 id="keytakeaways">Key takeaways</h2>
<ul>
<li><strong>Grade the work, not the writing.</strong> In an agentic SOC, the tool trace is the evidence. Judging final text alone rewards the most dangerous failure mode there is: the confident, ungrounded answer.  </li>
<li><strong>Realistic data plus ground truth is non-negotiable.</strong> A reproducible synthetic intrusion with a known answer key, and strict discipline about which dataset backs which suite, is what makes the results mean anything.  </li>
<li><strong>Hold everything constant except the model.</strong> Same agent, same skills and tools, same prompts, one-field model routing. Fairness comes from the setup, not the scoring.  </li>
<li><strong>Capture the whole trace.</strong> Steps, tool calls, parameters, results, tokens, latency, and objective workflow validation. You cannot diagnose a failure you did not record.  </li>
<li><strong>Judge blind, and separate reliability from quality.</strong> Anonymize before scoring, cap unsubstantiated answers, and never average a model's crashes into its quality score.  </li>
<li><strong>The best model is per-capability.</strong> Rankings flip across alert triage, hunting, rule authoring, and multi-step response. Evaluate for the job you are actually asking the model to do.</li>
</ul>
<h2 id="conclusionwhyevidencebasedllmevaluationmattersforsecurityusecases">Conclusion: Why evidence-based LLM evaluation matters for security use-cases</h2>
<p>Three suites, three very different jobs, one standard of evidence. The agent suite measures whether a model can route to the right skill and drive the right tools in the right order. Attack Discovery measures whether it can turn a wall of alerts into the true set of intrusions, no more and no fewer. Automatic Migration measures whether it can faithfully port a detection library it did not write. Because all three land on the same blind-judged, 1 to 10 scale, every new model that ships gets a complete security profile in one view: where it is strong, where it fails, and whether those failures are quality or reliability.</p>
<p>That evidence is not academic. It is how we decide which models to put in front of security teams, and how we keep re-checking that decision as the model landscape shifts. The agentic SOC is only as trustworthy as the evidence behind the model you put in it. This framework is how we generate that evidence, so that when we say a model is ready to triage your alerts, we can show our work, and we keep the current results live in the <a href="https://www.elastic.co/docs/solutions/security/ai/large-language-model-performance-matrix">Large language model performance matrix for Elastic Security</a>.</p>]]></content:encoded>
    <link>https://www.elastic.co/security-labs/threat-command/llm-benchmarking-agentic-soc</link>
    <guid isPermaLink="false">llm-benchmarking-agentic-soc</guid>
    <category><![CDATA[AI Security]]></category>
    <dc:creator><![CDATA[Dhrumil Patel]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2424dca438532331/6a7c89886c6eaca544f0e4bb/cover.png" length="0" type="image/png"/>
    <pubDate>Tue, 04 Aug 2026 21:59:59 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[One agent, the right skills: Elastic Security 9.4 brings domain expertise on demand to every SOC workflow]]></title>
    <description><![CDATA[Elastic Security 9.4 introduces skills, modular AI capabilities that teach the Elastic AI Agent how to detect, investigate, and hunt like a specialist. This is how they work, and why they matter for the SOC.]]></description>
    <content:encoded><![CDATA[<p>Three things land on you at once: Attack Discovery correlated 12 alerts into a credential-harvesting campaign overnight, your team just onboarded a new fleet of macOS endpoints and needs detection rules for LOLBin abuse, and a risk score spike on a service account just crossed the critical threshold.</p>
<p>In most security operations centers (SOCs), that's three different people, three different workflows, and a morning spent context-switching. In Elastic Security 9.4, it's one conversation.</p>
<p>You open the Elastic AI Agent and start working. The agent doesn't try to handle everything with one giant prompt. Instead, it activates the right <strong>skill</strong> for each task, loading specialized instructions, selected tools, and domain context only when needed. Detection Rule Edit writes your Elasticsearch Query Language (ES|QL) rule. Alert Analysis triages the campaign. Threat Hunting chases the service account. Each skill focuses on one job. Together, they cover the full pipeline.</p>
<p>In this article, we'll walk through the architecture, what each skill does, and how they work together in real scenarios.</p>
<h2 id="theproblemaiassistantsthatknowalittleabouteverything">The problem: AI assistants that know a little about everything</h2>
<p>Most AI assistants are monolithic. One system prompt tries to cover detection, investigation, response, entity analysis, and threat hunting all at once. This creates two problems that compound as capabilities grow.</p>
<p><strong>Context window dilution.</strong> Every instruction, every tool description, every example takes up tokens. When the prompt tries to cover every SOC workflow, the model has less room for the actual data it needs to reason about: your alerts, your entities, your logs. As you add more capabilities, the quality of each one degrades.</p>
<p><strong>Jack-of-all-trades performance.</strong> A prompt that covers everything handles nothing with depth. Ask it to write a detection rule, and it produces something generic. Ask it to investigate an entity, and it misses the nuance of the risk score composition. The model knows a little about many things but lacks the specialized knowledge that makes the output useful.</p>
<p>The industry response has been to build separate agents for separate tasks: a detection agent, a hunting agent, a triage agent. But that fragments the experience. Analysts have to know which agent to use, switch between them, and manually pass context from one to another. The AI becomes a tool-switching exercise rather than a productivity gain.</p>
<p>We needed an architecture that scales to dozens of capabilities without diluting any of them, and without forcing analysts to manage multiple agents.</p>
<h2 id="thesolutionskills">The solution: Skills</h2>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt887345b02bce16fa/6a7d842196b5a6c16e878688/elastic-security-skills.png" alt="" /></p>
<p><em>Skills</em> are a well-established pattern in AI agent architecture, a way to give a generalist model specialized capabilities on demand. In our implementation, a skill is a package of three things: a system prompt tuned for a specific SOC workflow, a curated set of tools selected for the task, and referenced domain content. The concept isn't new. What's new is applying it to security operations with depth: Each skill encodes the reasoning patterns, query templates, and domain knowledge that experienced analysts use daily.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0bb21bb0a242b8c8/6a7d84245588adb8cbee4344/anatomy-elastic-security-skills.png" alt="" /></p>
<p>The architecture rests on three ideas.</p>
<p><strong>Each skill does one job well.</strong> The Threat Hunting skill knows how to formulate hypotheses, iterate on ES|QL queries, identify anomalies, and document findings. It doesn't know how to edit detection rules. That's not a limitation; it's the point. Because each skill focuses on a single intent, it can include richer instructions, better examples, and more precise tool configurations than a monolithic prompt ever could.</p>
<p><strong>Skills work together.</strong> When Alert Analysis encounters a high-risk entity, it references the <a href="https://www.elastic.co/security-labs/entity-analytics-agent-builder">Entity Analytics skill</a> for deeper profiling. When Threat Hunting finds a suspicious binary, it can hand off to the detection pipeline. Multi-step investigations happen without requiring the analyst to orchestrate each handoff.</p>
<p><strong>Nothing loads until it's needed.</strong> Skills activate on demand, not all at once. The agent's context window stays lean as the total number of capabilities grows. You can add a new skill without degrading any existing one, because each operates in its own focused context.</p>
<p>At a glance, the following image shows a skill in action:</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt92919da4b3512184/6a7d8427ead8ec0c15ba7b7a/agent-reasoning-steps.png" alt="Agent reasoning steps loading in multiple skills based on the user’s request." title="Agent reasoning steps loading in multiple skills based on the user’s request." /></p>
<h2 id="fiveskillsforthesecurityoperationspipeline">Five skills for the security operations pipeline</h2>
<p>Elastic Security 9.4 ships five skills that span the core SOC workflows: detection, triage, hunting, entity analysis, and anomaly investigation.</p>
<p>| Skill | Domain | What it does | Example prompt |
|------|--------|--------------|----------------|
| Detection Rule Edit | Detection engineering | Creates and edits detection rules from natural language, maps to MITRE ATT&amp;CK, validates queries | Write a rule to detect DLL sideloading via unsigned DLLs loaded by signed binaries. |
| Alert Analysis | Alert triage | Triages alerts, finds related alerts by shared entities, enriches with threat intelligence and risk scores | Analyze alert 82a1f, is this related to the credential-harvesting campaign? |
| Threat Hunting | Proactive hunting | Runs hypothesis-driven hunts with iterative querying, embedded query templates for common tactics, techniques, and procedures (TTPs) | Hunt for lateral movement from the compromised host in the last 7 days. |
| Entity Analytics | Entity investigation | Profiles entities from the Entity Store: risk scores, behaviors, asset criticality, relationships | Show me the riskiest users this week and what's driving their scores. |
| Security ML Jobs | Anomaly investigation | Investigates anomalies from Security ML jobs, correlates with entity context | What anomalies are associated with svc-backup-prod? |</p>
<p>Three scenarios show how these skills work in practice.</p>
<h3 id="scenario1writingadetectionruleformacoslolbinabuse">Scenario 1: Writing a detection rule for macOS LOLBin abuse</h3>
<p>Your team just onboarded a fleet of macOS endpoints. You have solid detection coverage for Windows living-off-the-land binaries but almost nothing for macOS equivalents. Attackers routinely abuse built-in macOS utilities, like <code>osascript</code>, <code>curl</code>, <code>openssl</code>, and <code>sqlite3</code>, to execute payloads, exfiltrate data, and access credential stores without triggering basic malware detection. You need rules for these, and you need them before the next red team exercise.</p>
<p>You open the Elastic AI Agent and type: <em>Create an ES|QL detection rule for macOS LOLBin abuse. Look for suspicious use of built-in macOS utilities, like osascript, curl, openssl, and sqlite3, being spawned by unexpected parent processes.</em></p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd7565793f5ebdd98/6a7d842a05b7b5eabc188b97/siem-rule.png" alt="" /></p>
<p>The <a href="https://www.elastic.co/security-labs/ai-esql-detection-rule-creation"><strong>Detection Rule Edit</strong></a> skill activates:</p>
<ul>
<li><p>The skill uses <code>platform.core.generate_esql</code>to draft an ES|QL query targeting <code>logs-endpoint.events.process-*</code>, filtering for known macOS LOLBins spawned by unusual parent processes (for example, <code>osascript</code> launched by a web browser, or <code>url</code> invoked by a shell script running from <code>/tmp</code>).</p></li>
<li><p>It maps the rule to MITRE ATT\&amp;CK: <strong>T1059.002, AppleScript</strong>, and <strong>T1105, Ingress Tool Transfer</strong> under the Execution and Command and Control tactics.</p></li>
<li><p>The skill calls <code>security.security_labs_search</code> to check whether Elastic Security Labs has published research on macOS LOLBin techniques, pulling relevant context into the rule's investigation guide.</p></li>
<li><p>It generates the complete rule definition (name, description, severity, risk score, tags, MITRE mapping, schedule, and the validated ES|QL query) and presents it as an editable rule attachment in the conversation.</p></li>
</ul>
<p>You review the query, tune the parent-process allow list to exclude your IT team's legitimate automation scripts, and save. The rule is live. Total time: under five minutes.</p>
<p>Without the skill, this process means switching to the detection rules UI, manually writing ES|QL against the correct indices, researching which macOS utilities qualify as LOLBins, looking up the right MITRE technique IDs, and hoping you haven't missed an edge case. That's 30–60 minutes for an experienced detection engineer, longer for someone less familiar with the macOS process hierarchy.</p>
<h3 id="scenario2attackdiscoverysurfacesacampaign">Scenario 2: Attack Discovery surfaces a campaign</h3>
<p>Overnight, Attack Discovery correlated 12 alerts across three hosts and two users into a single narrative: <em>Credential harvesting via browser credential store access and suspicious authentication patterns.</em> The discovery is sitting in your queue when you arrive.</p>
<p>You click into the agent and ask: <em>Analyze the credential-harvesting discovery. Are these alerts true positives? What's the blast radius?</em></p>
<p><strong>Alert Analysis</strong> goes first. It fetches the correlated alerts using <code>security.alerts</code>, pulling the full alert details: rule names, severities, MITRE techniques, affected entities. Then it uses its inline tool <code>security.alert-analysis.get-related-alerts</code> to find additional alerts sharing entities with the correlated set. It discovers four additional alerts involving the same user (j.martinez) from the past 48 hours, alerts that weren't part of the credential-harvesting campaign pattern but are relevant to the broader investigation of this user's activity. These are failed authentication attempts against a different service, suggesting the attacker is testing stolen credentials across systems.</p>
<p>Next, it queries <code>security.security_labs_search</code> to check whether the observed TTPs match known threat actor playbooks. It finds a match: The technique chain (credential store access → lateral authentication → service enumeration) aligns with a published Elastic Security Labs report on a commodity access broker toolkit.</p>
<p>Finally, it calls <code>security.entity_risk_score</code> to assess the involved entities. <code>j.martinez</code> has a risk score of 87 (critical), already elevated before this campaign due to prior anomalous VPN activity.</p>
<p>The triage is done: true positive, high confidence, expanding blast radius. But you want deeper entity context. What else has <code>j.martinez</code> been doing?</p>
<p>The <strong>Entity Analytics</strong> skill picks up. Using <code>security.get_entity</code>, it pulls the full entity profile: risk score history over 90 days, contributing risk inputs (the current campaign plus two prior anomaly detections), asset criticality (the account has admin access to three production databases), and behavioral patterns. The profile shows that `j.martinez's risk score has increased by 34 points in the last week, well above the significant-change threshold.</p>
<p>You now have the full picture: confirmed campaign, expanding scope, high-value target, and historical context. You ask the agent to create a case with all findings attached. It compiles alert evidence, entity profile, threat intel matches, and recommended containment actions into a single case.</p>
<h3 id="scenario3ananomalyleadstoahunt">Scenario 3: An anomaly leads to a hunt</h3>
<p>While reviewing the morning's anomalies, the Security ML jobs flagged unusual behavior on <code>svc-backup-prod</code>, a service account that normally runs scheduled backup jobs between 2:00 and 4:00 a.m. The anomaly: large outbound data transfers at 11:00 p.m., well outside the normal window, to an IP address the account has never contacted before.</p>
<p>You ask: <em>Investigate the anomalies on svc-backup-prod. What's happening?</em></p>
<p>The <strong>Security ML Jobs</strong> skill starts by calling <code>find.security.ml.jobs</code> to find the relevant ML jobs and anomaly indices, in this case jobs monitoring network traffic patterns and data exfiltration signals. It generates and executes an ES|QL query against `.ml-anomalies-*<code>, filtering for</code>svc-backup-prod` records above the anomaly score threshold. The results show three anomalous sessions over the past week, each with increasing data volume: 2 GB, then 8 GB, and then 23 GB.</p>
<p>Since Entity Store v2 is enabled, the skill extracts the entity's unique identifier and calls <code>security.get_entity</code> to pull the full entity profile. It reveals that <code>svc-backup-prod</code> was recently granted access to a new file share containing customer PII, and its asset criticality is classified as <code>extreme_impact</code>.</p>
<p>The anomaly data is concerning, but you need to dig deeper. You type: <em>Hunt for all network activity from svc-backup-prod to external IPs in the last 30 days. Compare against baseline.</em></p>
<p>The <strong>Threat Hunting</strong> skill takes over. Using <code>platform.core.generate_esql</code> and <code>platform.core.execute_esql</code>, it iteratively builds queries against <code>logs-endpoint.events.network-*</code>:</p>
<ul>
<li><p>First pass: Aggregate all outbound connections by destination IP, ordered by total bytes transferred. The results confirm that the flagged IP (<code>198.51.100.47</code>) accounts for 33 GB of outbound traffic, all within the past 10 days. None before that.</p></li>
<li><p>Second pass: Check the destination IP against DNS resolution patterns. The IP resolves to a recently registered domain (<code>storage-sync-cdn.cloud</code>) with a registrar commonly associated with bulletproof hosting.</p></li>
<li><p>Third pass: Correlate with process telemetry. The connections originate from a process (<code>rsync</code>) that <code>svc-backup-prod</code> normally uses, but it's connecting to an unauthorized destination. The attacker is using a legitimate tool for exfiltration, making rule-based detection difficult.</p></li>
</ul>
<p>The hunt confirms a data exfiltration campaign using living-off-the-land techniques. The Threat Hunting skill documents the hypothesis, queries, and evidence trail. You create a case with containment recommendations: Isolate the host, rotate the service account credentials, and block the destination IP at the network perimeter.</p>
<p>Three skills. One conversation. From anomaly to confirmed exfiltration in minutes, not hours.</p>
<h2 id="underthehoodhowskillsarebuilt">Under the hood: How skills are built</h2>
<p>Each skill is defined as a <code>SkillType</code>, a structured object that bundles everything the agent needs for a specific domain:</p>
<ul>
<li><p><strong>System prompt</strong> (<code>content</code>): The core instructions. This is where domain expertise lives. The Threat Hunting skill, for example, includes a complete hunting process (formulate hypothesis → identify data sources → explore iteratively → identify anomalies → search for IOCs → document findings) with embedded ES|QL templates for common patterns, like lateral movement detection and C2 beaconing analysis.</p></li>
<li><p><strong>Registry tools</strong> (<code>getRegistryTools</code>): The set of platform and security tools the skill can invoke. Each skill gets only the tools it needs. Alert Analysis gets <code>security.alerts</code>, <code>security.security_labs_search</code>, and <code>security.entity_risk_score</code>. Threat Hunting gets <code>platform.core.generate_esql</code>, <code>platform.core.execute_esql</code>, <code>platform.core.search</code>, and <code>platform.core.cases</code>. No skill has access to tools it doesn't need.</p></li>
<li><p><strong>Inline tools</strong> (<code>getInlineTools</code>): Skill-specific tools that only exist within that skill's context. Alert Analysis defines <code>security.alert-analysis.get-related-alerts</code>, a tool that finds alerts sharing entities with a given alert. This tool doesn't exist outside the Alert Analysis skill because no other workflow needs it.</p></li>
<li><p><strong>Referenced content</strong> (<code>referencedContent</code>): Named chunks of domain knowledge that the skill can pull in when needed. The Threat Hunting skill includes embedded ES|QL query templates for lateral movement, C2 beaconing, brute force detection, and rare process execution. These are ready-made patterns that the agent adapts to the specific investigation.</p></li>
</ul>
<p>Because each skill is self-contained, adding a new one (for incident response automation or binary analysis, say) doesn't touch any existing skill. Each operates independently, with its own prompt, its own tools, and its own domain knowledge</p>
<h2 id="skillsintheagenticsoc">Skills in the Agentic SOC</h2>
<p>If you read our <a href="https://www.elastic.co/security-labs/speeding-apt-attack-discovery-confirmation-with-attack-discovery-workflows-and-agent-builder">previous post on Attack Discovery, Workflows, and Elastic Agent Builder</a>, you'll recognize the pattern. In that post, we extended the Threat Hunting Agent with five custom workflow tools (VirusTotal lookups, on-call schedule checks, case creation, Slack channel creation, and time retrieval) to build an automated triage pipeline for advanced persistent threat–level (APT-level) threats.</p>
<p>Skills are the productized evolution of that approach. Instead of requiring each SOC team to build custom agents and wire up individual tools, Elastic Security now ships domain expertise out of the box. The five skills in 9.4 cover the workflows that every SOC runs daily (detection, triage, hunting, entity analysis, and anomaly investigation) with the same composable, tool-backed architecture.</p>
<p>Skills also integrate directly with the rest of the <a href="https://www.elastic.co/blog/ai-cybersecurity-arms-race-agentic-soc">Agentic SOC</a> stack:</p>
<ul>
<li><p><strong>Attack Discovery</strong> generates alerts that can trigger Workflows, which invoke the agent. The agent activates Alert Analysis, Entity Analytics, or Threat Hunting, depending on what the discovery requires.</p></li>
<li><p><strong>Workflows</strong> provide the execution layer, both scripted automation and AI-augmented reasoning. A Workflow can run deterministic actions, like case creation, host isolation, and notification, but it can also invoke the Elastic AI Agent as a step, triggering skill-based reasoning mid-pipeline. This means a single Workflow can isolate a host (scripted), then ask the agent to triage the related alerts using Alert Analysis (AI-driven), and then escalate to Slack (scripted), combining reliability with intelligence.</p></li>
<li><p><strong>Custom tools and Model Context Protocol (MCP)</strong> remain fully available. Skills don't replace customization. They complement it. Teams can still add workflow-backed tools, connect external MCP servers, and extend the agent for their environment-specific needs.</p></li>
</ul>
<p>Security users also benefit from three platform skills that ship alongside the security-specific ones.</p>
<ul>
<li><p><strong>Dashboard Management</strong> lets analysts build and update Kibana dashboards through conversation. After completing the exfiltration investigation in Scenario 3, you could ask the agent: <em>Create a dashboard showing outbound data transfer volume by service account over the last 30 days, with a breakdown by destination IP.</em> The skill generates the visualizations and presents them as an editable attachment, so you go from investigation findings to a shareable executive briefing without switching tools.</p></li>
<li><p><strong>Workflow Authoring</strong> (available as an experimental capability) helps teams write and modify workflow YAML through the agent. Instead of hand-authoring a triage Workflow from scratch, you could ask: <em>Create a workflow that triggers on critical-severity alerts, runs the alert through the AI agent for triage, and creates a Slack channel if it's confirmed as a true positive.</em> The skill generates the YAML definition, validates it, and lets you review before deploying. This turns Workflow creation from a manual authoring task into a conversation.</p></li>
<li><p><strong>Graph Creation</strong> lets analysts visualize entity relationships and attack paths through conversation. After the Alert Analysis skill identifies that j.martinez's compromised credentials were used across three hosts, you could ask: <em>Create a graph showing the relationship between j.martinez, the affected hosts, and the credential-harvesting alerts.</em> The skill generates an interactive node-link visualization showing how entities connect, making it easier to brief stakeholders on attack scope and lateral movement paths.</p></li>
</ul>
<p>The pieces form a layered system: Attack Discovery surfaces threats, skills provide domain expertise for analysis, Workflows execute the response, and platform skills help you build the dashboards, graphic representation, and automation that tie it all together.</p>
<h2 id="keytakeaways">Key takeaways</h2>
<ul>
<li><p><strong>Skills are the unit of AI expertise in the SOC.</strong> Each skill packages domain knowledge, curated tools, and specialized instructions for a single workflow: detection, triage, hunting, entity analysis, or anomaly investigation.</p></li>
<li><p><strong>One agent, not five.</strong> Analysts don't switch between agents. The Elastic AI Agent activates the right skill based on the task, keeping the experience unified and the context connected.</p></li>
<li><p><strong>Composable by design.</strong> Skills reference each other. Alert Analysis hands off to Entity Analytics for deeper profiling. Threat Hunting builds on ML anomaly findings. Investigations flow naturally across skills without manual context transfer.</p></li>
<li><p><strong>Efficient at scale.</strong> Skills load on demand. Adding new skills doesn't degrade existing ones. Each operates in its own focused context window, so quality improves as capabilities grow.</p></li>
<li><p><strong>Built on the Agentic SOC stack.</strong> Skills work with Attack Discovery, Workflows, and custom tools. They make the automation pipeline richer by giving the agent deeper domain expertise at every step.</p></li>
<li><p><strong>Extensible.</strong> The five out-of-the-box skills ship with 9.4, but the architecture supports custom skills. Teams can build skills tailored to their environment, their data sources, and their SOC processes.</p></li>
</ul>
<h2 id="getstarted">Get started</h2>
<p>Skills ship as part of Elastic Security 9.4. They're available out of the box in the Elastic AI Agent with no configuration required. Open a conversation, ask a security question, and the agent activates the right skill.</p>
<p>To learn more, see the <a href="https://www.elastic.co/docs/explore-analyze/ai-features/elastic-agent-builder">Elastic AI Agent documentation</a> and the <a href="https://www.elastic.co/docs/release-notes/security">Elastic Security 9.4 release notes</a>.</p>]]></content:encoded>
    <link>https://www.elastic.co/security-labs/blog/skills-elastic-security-9-4</link>
    <guid isPermaLink="false">skills-elastic-security-9-4</guid>
    <category><![CDATA[AI & Automation]]></category>
    <dc:creator><![CDATA[Dhrumil Patel]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt96d5ab2533d85c79/6a7d842de02fac535c5d354e/cover.png" length="0" type="image/png"/>
    <pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Speeding APT Attack Confirmation with Attack Discovery, Workflows, and Agent Builder]]></title>
    <description><![CDATA[This article walks through how Elastic Security's Attack Discovery, combined with Workflows and Agent Builder, can automatically detect, correlate, and confirm APT-level attacks like Chrysalis while reducing analyst response time from hours to minutes.]]></description>
    <content:encoded><![CDATA[<p><strong>9:15 AM: The Non-Event</strong> - A headline breaks: "<a href="https://www.rapid7.com/blog/post/tr-chrysalis-backdoor-dive-into-lotus-blossoms-toolkit/">Chrysalis Backdoor: A Deep Dive into Lotus Blossom</a>." Your CISO sends a Slack message: "Are we affected?"</p>
<p>In a traditional SOC, you’re about to lose your entire morning to a manual scramble - sifting through dozens of alerts, writing queries, manually checking VirusTotal, and pivoting across index patterns to build a timeline hoping you don’t miss something.</p>
<p>But in an Agentic SOC, the work is already done. Attack Discovery, running on its hourly schedule, had already correlated 5 critical alerts out of 30+ into a single attack narrative: "Malware with DLL Side-Loading Persistence." That discovery automatically triggered a workflow, which handed the findings to an agent. The agent used its tools and verified the malware hash on VirusTotal, searched your logs with ES|QL, checked the on-call schedule, created a case, and spun up a Slack incident channel with the on-call analyst already added, and also generated a CISO-ready summary — all before you sat down for coffee.</p>
<p>You reply to your CISO: "Already confirmed and triaged. The case is open. Here's the link."</p>
<p>This post explains how we built that pipeline: the integration of <a href="https://www.elastic.co/security/ai">Attack Discovery</a>, <a href="https://www.elastic.co/elasticsearch/workflows">Workflows</a>, and <a href="https://www.elastic.co/elasticsearch/agent-builder">Agent Builder</a>.</p>
<h2 id="thethreatchrysalisbackdoorbylotusblossom">The threat: Chrysalis backdoor by Lotus Blossom</h2>
<h3 id="threatactorprofile">Threat actor profile</h3>
<p>| Attribute | Details |
| :---- | :---- |
| <strong>Name</strong> | Lotus Blossom (aka Billbug, Raspberry Typhoon, Spring Dragon) |
| <strong>Origin</strong> | China (state-sponsored) |
| <strong>Active Since</strong> | 2009 |
| <strong>Motivation</strong> | Espionage |
| <strong>Target Sectors</strong> | Government, Telecom, Aviation, Critical Infrastructure, Media |
| <strong>Target Regions</strong> | Southeast Asia, Central America |</p>
<h3 id="campaignoverview">Campaign overview</h3>
<p>Lotus Blossom executed a <strong>supply chain compromise</strong> of Notepad++ update infrastructure:</p>
<ul>
<li><strong>Attack Window:</strong> June 2025 – December 2025 (~6 months)  </li>
<li><strong>Vector:</strong> Hijacked Notepad++ update mechanism (WinGUp)  </li>
<li><strong>Method:</strong> Selective redirection of targeted users to malicious update servers  </li>
<li><strong>Payload:</strong> Previously undocumented "Chrysalis" backdoor  </li>
<li><strong>Discovery:</strong> Rapid7 MDR team, published 2026-02-02</li>
</ul>
<h3 id="chrysalisbackdoorcapabilities">Chrysalis backdoor capabilities</h3>
<p>The Chrysalis backdoor is a sophisticated, feature-rich implant:</p>
<ul>
<li>Custom encryption (LCG, FNV-1a hashing, MurmurHash)  </li>
<li>Reflective DLL loading  </li>
<li>API hashing for evasion  </li>
<li>DLL sideloading via legitimate Bitdefender binary (<code>BluetoothService.exe</code>)  </li>
<li>Full remote access capabilities  </li>
<li>Persistent Windows service installation</li>
</ul>
<h3 id="attackchain">Attack chain</h3>
<pre><code>[1] INITIAL ACCESS
    └── User executes malicious NSIS installer from Desktop
              ↓
[2] EXECUTION
    └── Installer drops files to hidden AppData folder
        ├── BluetoothService.exe (legitimate binary)
        └── log.dll (malicious Chrysalis loader)
              ↓
[3] PERSISTENCE
    └── BluetoothService.exe registered as Windows service
        └── Runs under SYSTEM context
              ↓
[4] DEFENSE EVASION
    └── DLL sideloading via legitimate signed binary
              ↓
[5] COMMAND &amp; CONTROL
    └── DNS beacon to api[.]skycloudcenter[.]com ✅ CONFIRMED
</code></pre>
<h3 id="mitreattckmapping">MITRE ATT&amp;CK mapping</h3>
<p>| Tactic | Technique | ID |
| :---- | :---- | :---- |
| Initial Access | Supply Chain Compromise | T1195.002 |
| Execution | User Execution | T1204.002 |
| Persistence | Windows Service | T1543.003 |
| Defense Evasion | DLL Side-Loading | T1574.002 |
| Command &amp; Control | DNS | T1071.004  |</p>
<h2 id="thechallengespeedvsaccuracy">The Challenge: Speed vs. Accuracy</h2>
<p>When threat intelligence drops on a nation-state APT campaign, SOC teams face a brutal trade-off:</p>
<p><strong>Speed:</strong> Executives want answers <em>now</em>. "Are we compromised?"</p>
<p><strong>Accuracy:</strong> Analysts need time to hunt, correlate, and confirm before making the call.</p>
<p>Traditional workflows require analysts to:</p>
<ol>
<li>Determine the scope of analysis and relevant search criteria  </li>
<li>Manually search for IOCs across multiple data sources  </li>
<li>Correlate alerts that may span days or weeks  </li>
<li>Validate findings against threat intelligence  </li>
<li>Build the attack timeline  </li>
<li>Escalate with confidence</li>
</ol>
<p>This process takes <strong>hours to days</strong>, during which an active attacker may exfiltrate data or move laterally.</p>
<h2 id="thesolutionattackdiscoveryworkflowsagentbuilder">The Solution: Attack Discovery + Workflows + Agent Builder</h2>
<p>Elastic Security's AI-powered automation stack transforms this workflow from manual hunting to <strong>automated confirmation</strong>. But before we dive into the specific setup, it's worth understanding how the building blocks fit together.</p>
<h3 id="agentsworkflowstwoentrypointsonecomposablearchitecture">Agents &amp; Workflows: Two entry points, one composable architecture</h3>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt98a6fa44038416a1/6a7d845033fa8abd131ff9c2/image7.png" alt="Diagram showing the composable relationship between Agents and Workflows" title="Diagram showing the composable relationship between Agents and Workflows" /></p>
<p>Agent Builder gives you two primitives that work together:</p>
<ul>
<li><a href="https://www.elastic.co/docs/explore-analyze/ai-features/elastic-agent-builder"><strong>Agents</strong></a> are the intelligence layer. They reason about a task, decide which tools to call, and adapt based on what they find. An agent can call search tools, MCP tools, and critically - <strong>workflows as tools</strong>.  </li>
<li><a href="https://www.elastic.co/docs/explore-analyze/workflows"><strong>Workflows</strong></a> are the structure layer. They're deterministic pipelines: steps run in order, reliably and repeatably. Any step in a workflow can optionally be an <strong>agent step</strong>, giving it the ability to reason mid-pipeline.</li>
</ul>
<p>The two are fully composable. A workflow can invoke an agent. An agent can call a workflow. An agent step inside a workflow can call another workflow. Every connection is optional allowing you to mix and match based on what the problem demands.</p>
<p>This is what makes the architecture powerful: <strong>agents reason and decide; workflows execute and coordinate</strong>. For our Chrysalis attack scenario, we used both.</p>
<h3 id="ourflow">Our Flow</h3>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfd64249fef405090/6a7d845333fa8a57e61ff9c6/image10.png" alt="" /></p>
<p><strong>The Flow:</strong></p>
<ol>
<li><strong>Many Alerts</strong> → Attack Discovery correlates disparate alerts into a single attack narrative  </li>
<li><strong>Attack Discovery</strong> → Generates an alert that triggers the workflow  </li>
<li><strong>Workflow</strong> → Invokes Agent Builder to analyze the attack discovery findings  </li>
<li><strong>Agent Builder</strong> → Calls enrichment workflows (VirusTotal, Threat Intel, ES|QL queries)  </li>
<li><strong>Agent Builder Calls a Workflow</strong> → Agent builder continues with incident response actions calling on workflow as a tool (case actions, isolate host, notify team)</li>
</ol>
<h2 id="step1attackdiscoverysurfacesthethreat">Step 1: Attack Discovery surfaces the threat</h2>
<p>Attack Discovery uses LLMs to analyze security alerts and identify attack patterns. Unlike traditional alert grouping, it understands the <strong>semantic relationships</strong> between alerts.</p>
<h3 id="thealertqueueneedleinahaystack">The alert queue: Needle in a haystack</h3>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf33bc139026a0ead/6a7d845777b034f16e3fc693/image4.png" alt="Shows the raw Elastic Security alerts table with dozens of alerts across different rules, severities, hosts, and users." title="Shows the raw Elastic Security alerts table with dozens of alerts across different rules, severities, hosts, and users." /></p>
<p>Here's reality for a SOC analyst. You open the alerts page and see dozens of alerts across multiple hosts, users, and rules, combination of, mixed severities, mixed types, many of them noise.</p>
<p>Dozens of alerts. Multiple rules firing. Severity levels ranging from low to critical. Some are the Chrysalis attack. Some are unrelated Windows Defender events. Some are SIEM change detections from a completely different workflow. It’s difficult to find the coordinated attack in this wall of noise.</p>
<h3 id="whatattackdiscoveryfound">What Attack Discovery found</h3>
<p>Attack Discovery analyzed all of these alerts and identified <strong>5 alerts</strong> that belonged to a single coordinated attack - pulling them out of the noise and correlating them into one narrative:</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3419279f4cf1ecb7/6a7d845a05b7b5615a188ba1/image6.png" alt="Shows the Attack Discovery showing a summary of the correlated attack" title="Shows the Attack Discovery showing a summary of the correlated attack" /></p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd7d0a0aa72598f1e/6a7d845d73d9bd0f3c29ac56/image11.png" alt="Shows the Attack Discovery view with the correlated attack: 5 alerts, all critical, tied to a host and user." title="Shows the Attack Discovery view with the correlated attack: 5 alerts, all critical, tied to a host and user." /></p>
<p>Instead of presenting 5 individual alerts, Attack Discovery correlated them into a single discovery:</p>
<p><strong>Malware with DLL Side-Loading Persistence</strong></p>
<p>Malicious executable on <code>srv-win-defend-01</code> escalated to persistence via <code>BluetoothService.exe</code> with DLL side-loading</p>
<ul>
<li><strong>Host:</strong> srv-win-defend-01  </li>
<li><strong>User:</strong> james_spiteri  </li>
<li><strong>Severity:</strong> Critical  </li>
<li><strong>Attack Chain:</strong> Initial Access → Execution → Persistence → Defense Evasion → C2</li>
</ul>
<p>Attack Discovery also:</p>
<ul>
<li>Mapped alerts to MITRE ATT&amp;CK tactics  </li>
<li>Identified the DLL sideloading technique  </li>
<li>Flagged the suspicious persistence mechanism  </li>
<li>Highlighted the C2 network indicator</li>
</ul>
<h2 id="step2scheduleddiscoverytriggerstheworkflow">Step 2: Scheduled discovery triggers the workflow</h2>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt464fa1ad1a84c3fe/6a7d845f5588ad3fa8ee4348/image2.png" alt="Shows Attack Discovery’s scheduling page where users can schedule attack discovery to run at desired intervals." title="Shows Attack Discovery’s scheduling page where users can schedule attack discovery to run at desired intervals." /></p>
<p>Attack Discovery doesn't require an analyst to click a button. We configured it to run on an <a href="https://www.elastic.co/docs/api/doc/serverless/operation/operation-createattackdiscoveryschedules"><strong>hourly schedule</strong></a>, continuously analyzing the latest alerts for coordinated attacks.</p>
<p>When our hourly run kicked off, it ingested all alerts from the last hour including the Chrysalis-related alerts buried among routine detections and surfaced the DLL side-loading attack as a discovery.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf2eff3b790159397/6a7d84625588ad6992ee434e/image8.png" alt="Shows Attack Discovery schedule editor linked to specific workflows." title="Shows Attack Discovery schedule editor linked to specific workflows." /></p>
<p>Linking a workflow as an action step from attack discovery means every time Attack Discovery finds a coordinated attack, it automatically fires the workflow..</p>
<p>But here's what makes this approach different from traditional SOAR playbooks: the workflow doesn't script out every step. It hands the entire attack discovery to Agent Builder and says <em>"figure it out."</em></p>
<h3 id="workflowdefinition">Workflow definition</h3>
<p>This is the real workflow we used consisting of two steps, that's it:</p>
<pre><code>name: Auto Triage AD
description: &gt;-
  Demonstrates the application of AI agents and workflows 
  to enable agentic alert triaging.
enabled: true
tags:
  - Example
  - Agentic Workflow

triggers:
  - type: alert                          # Fires when Attack Discovery generates an alert

steps:
  # Step 1: Hand the attack discovery to the agent with clear instructions
  - name: initial_analysis
    type: kibana.request
    with:
      method: "POST"
      path: "/api/agent_builder/converse"
      headers:
        kbn-xsrf: "true"
      body:
        agent_id: &lt;your-agent-id&gt;        # Your custom Hunting Agent
        input: |
          Confirm the attack by searching for behaviour in the logs 
          (all logs which are relevant), always leverage security labs tools, 
          always leverage virustotal if file hashes are available. 
          If this is a true positive, create a case with all the relevant content too.

          {{event|json}}

          Create a slack channel for this incident, check who's on call, 
          add them to it, and send a formatted message with what's happening 
          and next steps. If this is a true positive, create a case with all 
          the relevant content too - add a button to the slack message linking 
          to the case, and another button leading to the result of the attack. 
          Lastly, include a button that will take me to this agent conversation, 
          just replace the conversation ID with the actual one from this conversation 
          (https://&lt;your-kibana-url&gt;/app/agent_builder/conversations/&lt;conversation-id&gt;)

          Change the attack discovery status to acknowledged, or, 
          if false positives, close it.
    timeout: 10m
    on-failure:
      retry:
        max-attempts: 3

  # Step 2: Follow up to catch anything that didn't complete
  - name: followup_analysis
    type: kibana.request
    with:
      method: "POST"
      path: "/api/agent_builder/converse"
      headers:
        kbn-xsrf: "true"
      body:
        conversation_id: "{{ steps.initial_analysis.output.conversation_id }}"
        agent_id: &lt;your-agent-id&gt;
        input: |
          Complete any previous steps which might not have ran successfully. 
          Just in case, the conversation ID is 
          {{ steps.initial_analysis.output.conversation_id }}
    timeout: 10m
    on-failure:
      retry:
        max-attempts: 3
</code></pre>
<h3 id="whythisworkflowissoshort">Why this workflow is so short</h3>
<p>The entire automation is <strong>two steps</strong>:</p>
<ol>
<li><strong><code>initial_analysis</code></strong>: Send the attack discovery to Agent Builder with natural language instructions describing what you want done  </li>
<li><strong><code>followup_analysis</code></strong>: A failsafe that resumes the same conversation and asks the agent to verify all tasks were completed. Because agents call multiple tools in sequence and any individual tool call could time out or hit a transient error, this step ensures nothing falls through the cracks.</li>
</ol>
<p>This is the fundamental shift: <strong>the workflow is the trigger and the safety net; the agent is the brain</strong>.</p>
<h2 id="underthehoodhowweextendedthethreathuntingagent">Under the hood: How we extended the Threat Hunting Agent</h2>
<p>Before we continue with the results, it's worth pausing on what made this possible. One of Agent Builder's most powerful capabilities is that you can <strong>extend existing agents</strong> with additional tools. Rather than building from scratch, we took the default <strong>Threat Hunting Agent</strong> and added custom workflow-backed tools to give it the specific capabilities this scenario required.</p>
<h3 id="whatweadded">What we added</h3>
<p>Agent Builder ships with built-in platform tools like <code>platform.core.generate_esql</code> and <code>platform.core.product_documentation</code>. But the real power comes from adding your own. We extended the Threat Hunting Agent with tools across several categories:</p>
<p>| Tool | Type | What It Does |
| :---- | :---- | :---- |
| <code>vt.hash.lookup</code> | Workflow (custom) | Analyze a file hash with VirusTotal |
| <code>check.on.call.schedule</code> | Workflow (custom) | Query the on-call schedule to find the current responder |
| <code>create.case</code> | Workflow (custom) | Create a case in Elastic Security |
| <code>create.channel</code> | Workflow (custom) | Create a Slack channel for incident coordination |
| <code>get.time</code> | Workflow (custom) | Get the current time for naming and timestamps |</p>
<p>Five custom tools. That's all it took to turn the default Hunting Agent into automatically verifying malware, searching logs, finding the on-call responder, creating a case, and spinning up an incident channel - all expediting the time to detect a potential threat.</p>
<h3 id="theagentsreasoningchain">The Agent's reasoning chain</h3>
<p>Here's what's remarkable: given the Attack Discovery context, the agent automatically decided which tools to call and in what order. No human scripted these steps.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3db8631a1158e818/6a7d846533fa8ab5d41ff9ca/image1.png" alt="Shows the agent's reasoning chain: starting with VirusTotal lookup on the file hash, then generating an ES|QL query to search endpoint logs for the affected host, user, and malicious processes. Demonstrates autonomous tool selection." title="Shows the agent's reasoning chain: starting with VirusTotal lookup on the file hash, then generating an ES|QL query to search endpoint logs for the affected host, user, and malicious processes. Demonstrates autonomous tool selection." /></p>
<p><strong>Step 1: VirusTotal Lookup</strong>: <code>vt.hash.lookup</code></p>
<ul>
<li>The agent's first move: verify the malware hash.</li>
</ul>
<p><strong>Step 2: Generate ES|QL Query</strong>: <code>platform.core.generate_esql</code></p>
<ul>
<li>With malware confirmed, the agent searched for all related activity.</li>
</ul>
<p><strong>Step 3: Product Documentation</strong>: <code>platform.core.product_documentation</code></p>
<ul>
<li>The agent referenced Elastic Security docs to generate remediation commands for the Response Console.!</li>
</ul>
<p><a href="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt555f1c1cfc1a92f0/6a8c63e940a18447e1ef4af4/speeding-apt-attack-discovery-confirmation-with-attack-discovery-workflows-and-agent-builder-image3.png">Reasoning steps showing which tools were called in sequence for transparency</a></p>
<p><em>Shows the additional reasoning chain: referencing product documentation, then checking the on-call schedule information before creating a case with all relevant information and notifying the analyst on call over Slack.</em></p>
<p><strong>Step 4: Check current time:</strong> <code>get.time</code></p>
<p><strong>Step 5: Check On-Call Schedule</strong>: <code>check.on.call.schedule</code></p>
<ul>
<li>The agent ran an ES|QL query against the <code>on-call-schedule</code> index to find the current responder:</li>
</ul>
<p><strong>Step 6: Create Case</strong>: <code>create.case</code></p>
<p><strong>Step 7: Create Slack Channel</strong>: <code>create.channel</code></p>
<h3 id="whythismatters">Why this matters</h3>
<p>The agent wasn't following a script. It <strong>reasoned</strong> about the situation and decided:</p>
<ol>
<li>First, verify the malware is real (VirusTotal)  </li>
<li>Then, understand the impact (ES|QL log search)  </li>
<li>Then, figure out how to remediate (product documentation)  </li>
<li>Then, find the right person to respond (on-call schedule)  </li>
<li>Then, create tracking artifacts (case)  </li>
<li>Finally, coordinate the team (Slack channel)</li>
</ol>
<p>This is the difference between a workflow (which follows a fixed sequence) and an agent (which reasons about what to do next). The workflow triggered the agent; the agent figured out the rest.</p>
<h2 id="step3automatedincidentresponse">Step 3: Automated incident response</h2>
<p>With high-confidence confirmation, the workflow automatically:</p>
<h3 id="1createsanincidentcase">1. Creates an incident Case</h3>
<p>A structured case is created with all relevant evidence attached:</p>
<ul>
<li>Attack Discovery findings  </li>
<li>VirusTotal analysis results  </li>
<li>Threat intelligence matches  </li>
<li>Agent Builder analysis  </li>
<li>Recommended response actions</li>
</ul>
<h3 id="2notifiesthesoc">2. Notifies the SOC</h3>
<p>A Slack message is sent to the right channel informing analysts of the critical incident. </p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc481915cd6e7e688/6a7d84685967e5a50d5da591/image5.png" alt="Shows the actual Slack channel with the Incident Bot  posting the full attack summary, malware details, attack chain, MITRE ATT&amp;CK mapping, and immediate next steps." title="Shows the actual Slack channel with the Incident Bot  posting the full attack summary, malware details, attack chain, MITRE ATT&amp;CK mapping, and immediate next steps." /></p>
<h3 id="3enablesresponseactions">3. Enables Response Actions</h3>
<p>The workflow can optionally trigger automated response actions:</p>
<ul>
<li><strong>Host Isolation:</strong> Isolate <code>srv-win-defend-01</code> via Elastic Defend  </li>
<li><strong>User Suspension:</strong> Disable <code>james_spiteri</code> in Active Directory  </li>
<li><strong>Network Block:</strong> Push C2 domain to firewall blocklist  </li>
<li><strong>IOC Sweep:</strong> Launch fleet-wide scan for Chrysalis indicators</li>
</ul>
<hr />
<h2 id="timetoconfirmationbeforeandafter">Time-to-confirmation: Before and after</h2>
<p>| Metric | Manual Process | Automated Pipeline |
| :---- | :---- | :---- |
| Alert Correlation | 30-60 minutes | Instant (Attack Discovery) |
| IOC Extraction | 15-30 minutes | Instant (Workflow) |
| VirusTotal Lookup | 10-15 minutes | 5 seconds (API) |
| Threat Intel Correlation | 30-60 minutes | 10 seconds (ES|QL Query) |
| Attack Attribution | 1-4 hours | 30 seconds (Agent Builder) |
| Incident Creation | 15-30 minutes | Instant (Workflow) |
| SOC Notification | 5-10 minutes | Instant (Connector) |
| <strong>Total Time</strong> | <strong>2-6 hours</strong> | <strong>&lt; 4 minutes</strong> |</p>
<hr />
<h2 id="theotherpathjustasktheagent">The other path: Just ask the Agent</h2>
<p>Everything above describes the <strong>automated</strong> pipeline - Attack Discovery finds the threat, the workflow fires, the agent triages it, and the right analyst(s) gets notified.</p>
<p>But there's another equally powerful way to use this: go directly to Agent Builder and ask it in plain English.</p>
<h3 id="scenarioyoureadaboutthethreatfirst">Scenario: You read about the threat first</h3>
<p>Imagine you're scrolling through your threat intel feeds and see Rapid7's blog post about the Chrysalis backdoor. You just want to know: <em>are we compromised?</em></p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf94109eee5e4f6d0/6a7d846c437e0ffc56dd860a/image9.png" alt="" /></p>
<p>That's it. The same agent with the same tools does the rest:</p>
<ol>
<li>Reads the threat report using the <code>web.search</code> tool to pull IOCs and TTPs from the Rapid7 blog  </li>
<li>Generates ES|QL queries to hunt for Chrysalis indicators across your file, network, and process event logs  </li>
<li>Checks VirusTotal for any matching file hashes found in your environment  </li>
<li>Produces a CISO-ready summary with findings, confidence level, and recommended actions</li>
</ol>
<p>The agent calls the same tools it would in the automated pipeline. The difference is the entry point: instead of a scheduled Attack Discovery triggering a workflow, you triggered the agent with a question.</p>
<h3 id="whythischangesthegameforanalysts">Why this changes the game for analysts</h3>
<p>This is the part that's easy to overlook but profoundly important: <strong>the analyst didn't need to know a single query language, index pattern, or tool name</strong>.</p>
<p>They didn't write ES|QL. They didn’t need to remember where their different data lives. They didn't need to remember the VirusTotal API syntax or figure out which threat intel index to query.</p>
<p>They asked a question in natural language. The agent figured out the rest including which indices to search, which queries to write, which tools to call, and how to synthesize the results.</p>
<p>For a junior analyst who joined the team last month, this is transformative. For a senior analyst who's been doing this for a decade, it's hours of their life back. For a CISO who wants a status update, it's a question away.</p>
<p>The barrier to effective threat hunting just dropped from "knows ES|QL and 47 index patterns" to "can describe what they're looking for."</p>
<h2 id="keytakeaways">Key takeaways</h2>
<ol>
<li><strong>Attack Discovery on a schedule means you don't miss attacks</strong> - it continuously analyzes your alerts, so coordinated threats get surfaced even when no one is watching the queue.  </li>
<li><strong>Workflows</strong> orchestrate the response, triggering on discoveries, invoking agents, executing actions.  </li>
<li><strong>Agent Builder lets you build or extend agents for your needs</strong> - whether you start from scratch or add custom tools to an existing agent, you shape the capabilities to match your environment.  </li>
<li><strong>Agents reason, workflows execute</strong> - the agent autonomously decided to call VirusTotal, search logs, check the on-call schedule, and create a Slack channel. No human scripted that sequence.  </li>
<li><strong>Two entry points, same power</strong> - the automated pipeline and the chat interface use the same agent and the same tools. Whether a scheduled discovery triggers it or an analyst asks a question, the outcome is the same.  </li>
<li><strong>Natural language is the new query language</strong> - analysts don't need to know ES|QL, index patterns, or API syntax. They describe what they're looking for, and the agent handles the rest.</li>
</ol>
<p>The Chrysalis backdoor campaign demonstrates why this matters. When nation-state actors can compromise your supply chain and establish persistence in 4 seconds, you need defenses that can match that speed - whether that's an automated pipeline running while you sleep, or a direct conversation with an agent when you're the first to spot the threat.</p>]]></content:encoded>
    <link>https://www.elastic.co/security-labs/blog/speeding-apt-attack-discovery-confirmation-with-attack-discovery-workflows-and-agent-builder</link>
    <guid isPermaLink="false">speeding-apt-attack-discovery-confirmation-with-attack-discovery-workflows-and-agent-builder</guid>
    <category><![CDATA[AI & Automation]]></category>
    <dc:creator><![CDATA[James Spiteri,Dhrumil Patel]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte8bc63dd59c64474/6a7d846f2541c4802860f98f/photo-edited-08.png" length="0" type="image/png"/>
    <pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[From Alert Fatigue to Agentic Response: How Workflows and Agent Builder Close the Loop]]></title>
    <description><![CDATA[Attempting to chase individual alerts is a losing strategy. To succeed, we have to move beyond simple automation scripts and into the era of Agentic AI.]]></description>
    <content:encoded><![CDATA[<p>SOC leaders face a daily battle against basic math that doesn’t add up. Data volumes are growing exponentially, attack surfaces are expanding globally, yet your team’s capacity remains linear. You cannot hire your way out of this problem.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6c23e31fdfa35fec/6a7d8085ead8ec2017ba7b2a/image2.png" alt="Line chart demonstrating exponential increase in data, alerts, insights and linear increase in human capacity" title="Line chart demonstrating exponential increase in data, alerts, insights and linear increase in human capacity" /></p>
<p>Attempting to chase individual alerts is a losing strategy. To succeed, we have to move beyond simple automation scripts and into the era of Agentic AI.</p>
<p>At Elastic, we view the modern security operation as an operational nervous system. It needs Senses (the data foundation to see everything), a Brain 🧠(AI driven analytics to find the signal in the noise), and Hands 🙌(Workflows to execute actions and drive outcomes).</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt84d250261bf2b3cf/6a7d80876c6eac1b67f11354/image1.png" alt="" /></p>
<p>With the introduction of Agent Builder and Elastic Workflows, we are unifying these elements. We aren't just giving you a chatbot; we are giving you the ability to construct an autonomous SOC where agents reason over data and workflows execute sophisticated actions—bidirectionally.</p>
<p>Here is how these two powerful engines work together to transform your security operations.</p>
<h2 id="thepowerofbrainandhandsworkingtogether">The Power of "Brain" and "Hands" Working Together</h2>
<p>To understand why this combination is significant, we must differentiate their roles.</p>
<ul>
<li><strong>Elastic Workflows (The Hands):</strong> These are deterministic. They are perfect for rigid, repeatable processes—"If X happens, create a Jira ticket, ping Slack, and isolate the host." They provide structure, auditability, and reliability.  </li>
<li><strong>Agent Builder (The Brain):</strong> Agents are probabilistic and reasoning-based. They perceive the environment, plan a sequence of steps, and adapt. An agent can look at a vague threat report and decide <em>which</em> queries to run to find evidence.</li>
</ul>
<p><strong>The magic happens when they interact:</strong> Previously, you had to choose between a rigid playbook or a manual investigation. Now, <strong>Workflows can invoke Agents</strong> to perform complex analysis during an automation loop, and <strong>Agents can invoke Workflows</strong> as tools to perform reliable, heavy-lifting actions during a chat.</p>
<h2 id="whatthisisnt">What This Isn't</h2>
<p>Let's be clear: this isn't about replacing your analysts. It's about removing the toil that keeps them from doing the work that actually matters - the creative, adversarial thinking that no model can replicate. The goal is to shift your team from being reactive log-chasers to proactive threat hunters. The agent handles the grunt work; your people handle the judgment calls.</p>
<h2 id="usecaseautomatedtriageatalerttime">Use Case: Automated Triage at Alert Time</h2>
<p><em>From Alert to Analysis without Human Intervention</em></p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt95e9c202a64a015c/6a7d808aea068d1591f0721b/image6.png" alt="" /></p>
<p>Let’s look at a real-world scenario involving a ransomware attack (ex: <em>BlackCat/ALPHV</em> - a ransomware-as-a-service operation). In a traditional setup, an alert fires, and an analyst spends 30 minutes gathering logs, checking virus totals, and writing a summary.</p>
<p>With Elastic, this entire triage phase is automated before the analyst opens their laptop, reducing mean-time-to-triage from 30 minutes to under 2 minutes.</p>
<p><strong>The Workflow:</strong></p>
<ol>
<li><strong>Trigger:</strong> <strong>Attack Discovery</strong> runs on a schedule and correlates 15 disparate alerts into a single, high-fidelity Attack Chain.  </li>
<li><strong>Workflow Step (Enrichment):</strong> The workflow is triggered automatically and loops through every entity involved—hosts, users, file hashes. It runs a lookup against threat intel sources like VirusTotal.  </li>
<li><strong>Workflow Step (Invoke Agent):</strong> The workflow passes this bundle of data to a specific <strong>"Triage Agent."</strong>  </li>
<li><strong>Agent Execution:</strong> The agent doesn't just copy-paste data. It <em>reasons</em> over the attack chain, compares it against the MITRE ATT&amp;CK framework, correlates related logs, and generates a human-readable investigation summary tailored for a Tier 2 analyst.  </li>
<li><strong>Outcome:</strong> The workflow posts this AI-generated analysis directly into a new Case, complete with severity scoring, deep dive investigation, root cause analysis, and recommended next steps.</li>
</ol>
<p><strong>User Impact:</strong> The analyst starts their day reviewing a fully contextualized case, not chasing raw logs.</p>
<h2 id="usecasethehumanintheloopinvestigation">Use Case: The "Human-in-the-Loop" Investigation</h2>
<p><em>Turning Natural Language into Deterministic Action</em></p>
<p>Once an analyst is investigating, they often need to perform administrative tasks that break their flow like finding out who is on-call, setting up war rooms, or notifying leadership.</p>
<p>In Elastic Security, the analyst stays in the chat interface. Because we allow you to define Workflows as <strong>Tools</strong> for your agents, the analyst can simply ask the agent to handle the logistics.</p>
<p><strong>The Workflow:</strong></p>
<ol>
<li><strong>Analyst Prompt:</strong> <em>"We have a confirmed incident. Who is on call? Please create a Slack channel for this incident and invite them."</em>  </li>
<li><strong>Agent Reasoning:</strong> The agent recognizes the intent matches a "Incident Response Setup" workflow tool you have pre-configured.  </li>
<li><strong>Workflow Execution:</strong>  </li>
</ol>
<ul>
<li>Step 1: Queries the PagerDuty integration to find the on-call engineer.  </li>
<li>Step 2: Calls the Slack API to create a channel named <code>#incident-[id]</code>.  </li>
<li>Step 3: Posts the initial case summary into that channel.  </li>
</ul>
<ol>
<li><strong>Outcome:</strong> The agent confirms to the analyst: <em>"I have created channel #incident-982 and added Jane Doe (On-Call) to the channel."</em></li>
</ol>
<h2 id="usecaseguidedremediationandcontainment">Use Case: Guided Remediation and Containment</h2>
<p><em>Precision Response at Speed</em></p>
<p>When it is time to contain a threat, speed is critical, but so is safety. You don't want an LLM "hallucinating" an API call to a firewall. This is where the Agent + Workflow combination shines for safety.</p>
<p><strong>The Workflow:</strong></p>
<ol>
<li><strong>Analyst Prompt:</strong> <em>"Isolate the host involved in the BlackCat alert."</em>  </li>
<li><strong>Agent Reasoning:</strong> The agent identifies the <code>host123</code> host from the context of the investigation. It creates a plan to invoke the "Host Isolation" workflow.  </li>
<li><strong>Decision Point:</strong> The Agent presents the plan to the user: <em>"I am about to trigger the 'Isolate Host' workflow for host123 via Elastic Defend."</em>  </li>
<li><strong>Workflow Execution:</strong> The deterministic workflow executes the isolation command via Elastic Defend (XDR), ensuring the action is logged and performed exactly as defined by your engineering team.  </li>
<li><strong>Outcome:</strong> The host is isolated immediately.</li>
</ol>
<p><strong>User Impact:</strong> You get the ease of natural language interaction with the safety and audit trails of hard-coded automation.</p>
<p>We are moving away from a world where you have to choose between flexible AI chat and rigid SOAR playbooks. The future is an Autonomous SOC where the two are inextricably linked.</p>
<p>By using Agent Builder to create custom agents that understand your specific environment (using RAG with your own data) and equipping them with Elastic Workflows as tools, you effectively multiply your team's capacity and scale expertise. You are not just deploying a chatbot; you are deploying a virtual team member that knows your runbooks, respects your permissions, and works 24/7.</p>
<p>For more detailed information on getting started with Agent Builder read this <a href="https://www.elastic.co/search-labs/blog/ai-agent-builder-elasticsearch">blog</a>.</p>
<p>Agent Builder and Workflows are available now as a tech preview. Get started with an <a href="https://cloud.elastic.co/registration">Elastic Cloud Trial</a>, and check out the documentation for Agent Builder <a href="https://www.elastic.co/docs/solutions/search/elastic-agent-builder">here</a>, and Workflows <a href="https://cloud.elastic.co/registration">here</a>.</p>]]></content:encoded>
    <link>https://www.elastic.co/security-labs/blog/from-alert-fatigue-to-agentic-response</link>
    <guid isPermaLink="false">from-alert-fatigue-to-agentic-response</guid>
    <category><![CDATA[AI & Automation]]></category>
    <dc:creator><![CDATA[Dhrumil Patel]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd44914d3156b1364/6a7d808eead8eca04fba7b2e/photo-edited-03.png" length="0" type="image/png"/>
    <pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>