Detection rules › Splunk

ESXi Bulk VM Termination

Status
production
Severity
medium
Group by
dest
Author
Raven Tait, Splunk
Source
github.com/splunk/security_content

This detection identifies when all virtual machines on an ESXi host are abruptly terminated, which may indicate malicious activity such as a deliberate denial-of-service, ransomware staging, or an attempt to destroy critical workloads.

Known false positives

  • Limited false positives in most environments, however tune as needed.

MITRE ATT&CK coverage

Rule body

name: ESXi Bulk VM Termination
id: cfe094b4-0737-4a33-9d63-e0562ce2b883
version: 4
creation_date: '2025-07-11'
modification_date: '2026-05-13'
author: Raven Tait, Splunk
status: production
type: TTP
description: This detection identifies when all virtual machines on an ESXi host are abruptly terminated, which may indicate malicious activity such as a deliberate denial-of-service, ransomware staging, or an attempt to destroy critical workloads.
data_source:
    - VMWare ESXi Syslog
search: '`esxi_syslog` | rex field=_raw "\s\[(?<user>[^\]]+)\]:\s(?<shell_command>.+)$" | rex field=_raw "Z (?<dest>[\w\.]+)\s.*:\s(?<esxicli_Command>esxcli\s.+)" | eval command=mvappend(esxicli_Command, shell_Command) | where isnotnull(command) | search (command="pkill -9 vmx-*") OR ( command="*esxcli*" AND command="*--format-param*" AND command="*vm process list*" AND command="*awk*" AND command="*esxcli vm process kill*") | stats min(_time) as firstTime max(_time) as lastTime values(_time) as timeStamp values(command) as commands values(user) as user by dest | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `esxi_bulk_vm_termination_filter`'
how_to_implement: This is based on syslog data generated by VMware ESXi hosts. To implement this search, you must configure your ESXi systems to forward syslog output to your Splunk deployment. These logs must be ingested with the appropriate Splunk Technology Add-on for VMware ESXi Logs, which provides field extractions and CIM compatibility.
known_false_positives: Limited false positives in most environments, however tune as needed.
finding:
    title: Bulk VM termination activity on ESXi host $dest$.
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - ESXi Post Compromise
    - Black Basta Ransomware
asset_type: Infrastructure
mitre_attack_id:
    - T1673
    - T1529
    - T1499
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: application
security_domain: endpoint

Stages and Predicates

Stage 1: search

`esxi_syslog`

Stage 2: rex

| rex field=_raw "\s\[(?<user>[^\]]+)\]:\s(?<shell_command>.+)$"

Stage 3: rex

| rex field=_raw "Z (?<dest>[\w\.]+)\s.*:\s(?<esxicli_Command>esxcli\s.+)"

Stage 4: eval

| eval command=mvappend(esxicli_Command, shell_Command)

Stage 5: where

| where isnotnull(command)

Stage 6: search

| search (command="pkill -9 vmx-*") OR ( command="*esxcli*" AND command="*--format-param*" AND command="*vm process list*" AND command="*awk*" AND command="*esxcli vm process kill*")

Stage 7: stats

| stats min(_time) as firstTime max(_time) as lastTime values(_time) as timeStamp values(command) as commands values(user) as user by dest

Stage 8: search

| `security_content_ctime(firstTime)`

Stage 9: search

| `security_content_ctime(lastTime)`

Stage 10: search

| `esxi_bulk_vm_termination_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
commandeq
  • "*--format-param*"
  • "*awk*"
  • "*esxcli vm process kill*"
  • "*esxcli*"
  • "*vm process list*"
  • "pkill -9 vmx-*"
field:"command" kind:eq
commandis_not_null
  • (no value, null check)
field:"command" kind:is_not_null
sourcetypein
  • vmw-syslog
  • vmware:esxlog*
field:"sourcetype" kind:in