Detection rules › Splunk

Splunk rules: 0g

AWS UpdateLoginProfile

#
Status
production
Severity
medium
Group by
aws::awsRegion, aws::recipientAccountId, aws::userAgent, dest, signature, src, user, vendor_product
Author
Bhavin Patel, Splunk
Source
github.com/splunk/security_content

The following analytic detects an AWS CloudTrail event where a user with permissions updates the login profile of another user. It leverages CloudTrail logs to identify instances where the user making the change is different from the user whose profile is being updated. This activity is significant because it can indicate privilege escalation attempts, where an attacker uses a compromised account to gain higher privileges. If confirmed malicious, this could allow the attacker to escalate their privileges, potentially leading to unauthorized access and control over sensitive resources within the AWS environment.

Known False Positives

  • While this search has no known false positives, it is possible that an AWS admin has legitimately created keys for another user.

MITRE ATT&CK Coverage

TacticTechniques
Persistence

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: AWS UpdateLoginProfile
id: 2a9b80d3-6a40-4115-11ad-212bf3d0d111
version: 14
creation_date: '2021-03-02'
modification_date: '2026-05-13'
author: Bhavin Patel, Splunk
status: production
type: TTP
description: The following analytic detects an AWS CloudTrail event where a user with permissions updates the login profile of another user. It leverages CloudTrail logs to identify instances where the user making the change is different from the user whose profile is being updated. This activity is significant because it can indicate privilege escalation attempts, where an attacker uses a compromised account to gain higher privileges. If confirmed malicious, this could allow the attacker to escalate their privileges, potentially leading to unauthorized access and control over sensitive resources within the AWS environment.
data_source:
    - AWS CloudTrail UpdateLoginProfile
search: |-
    `cloudtrail` eventName = UpdateLoginProfile userAgent !=console.amazonaws.com errorCode = success
      | eval match=if(match(userIdentity.userName,requestParameters.userName), 1,0)
      | search match=0
      | rename user_name as user
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY signature dest user
           user_agent src vendor_account
           vendor_region vendor_product
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `aws_updateloginprofile_filter`
how_to_implement: You must install splunk AWS add on and Splunk App for AWS. This search works with AWS CloudTrail logs.
known_false_positives: While this search has no known false positives, it is possible that an AWS admin has legitimately created keys for another user.
references:
    - https://bishopfox.com/blog/privilege-escalation-in-aws
    - https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/
finding:
    title: From IP address $src$, user agent $user_agent$ has trigged an event UpdateLoginProfile for updating the existing login profile, potentially giving user $user$ more access privilleges
    entity:
        field: user
        type: user
        score: 50
threat_objects:
    - field: src
      type: ip_address
analytic_story:
    - AWS IAM Privilege Escalation
asset_type: AWS Account
mitre_attack_id:
    - T1136.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: threat

Stages and Predicates

Stage 1: search

`cloudtrail` eventName = UpdateLoginProfile userAgent !=console.amazonaws.com errorCode = success

Stage 2: eval

| eval match=if(match(userIdentity.userName,requestParameters.userName), 1,0)
match =
1.1
-0(default)

Stage 3: search

| search match=0

Stage 4: rename

| rename user_name as user

Stage 5: stats

| stats count min(_time) as firstTime max(_time) as lastTime
    BY signature dest user
       user_agent src vendor_account
       vendor_region vendor_product

Stage 6: search

| `security_content_ctime(firstTime)`

Stage 7: search

| `security_content_ctime(lastTime)`

Stage 8: search

| `aws_updateloginprofile_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
errorCodeeq
  • success corpus 16 (splunk 12, sigma 4)
field:"aws::errorCode" kind:eq value:"success"
eventNameeq
  • UpdateLoginProfile corpus 3 (splunk 2, sigma 1)
field:"aws::eventName" kind:eq value:"UpdateLoginProfile"
matcheq
  • 0 corpus 2 (splunk 2)
field:"match" kind:eq value:"0"
sourcetypeeq
  • aws:cloudtrail corpus 59 (splunk 59)
field:"sourcetype" kind:eq value:"aws:cloudtrail"
userAgentne
  • console.amazonaws.com corpus 6 (splunk 6)
field:"userAgent" kind:ne value:"console.amazonaws.com"

Azure AD Tenant Wide Admin Consent Granted

#

Cisco Duo Policy Deny Access

#
Status
production
Severity
medium
Group by
action, actionlabel, admin_email, description, user
Author
Patrick Bareiss, Splunk
Source
github.com/splunk/security_content

The following analytic identifies instances where a Duo administrator creates or updates a policy to explicitly deny user access within the Duo environment. It detects this behavior by searching Duo administrator activity logs for policy creation or update actions where the authentication status is set to "Deny access." By correlating these events with user and admin details, the analytic highlights potential misuse or malicious changes to access policies. This behavior is critical for a SOC to monitor, as unauthorized or suspicious denial of access policies can indicate insider threats, account compromise, or attempts to disrupt legitimate user access. The impact of such an attack may include denial of service to critical accounts, disruption of business operations, or the masking of further malicious activity by preventing targeted users from accessing resources. Early detection enables rapid investigation and remediation to maintain organizational security and availability.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

Rule Body

name: Cisco Duo Policy Deny Access
id: abf39464-ed43-4d69-a56c-02750032a3fb
version: 6
creation_date: '2025-07-10'
modification_date: '2026-05-13'
author: Patrick Bareiss, Splunk
status: production
type: TTP
description: The following analytic identifies instances where a Duo administrator creates or updates a policy to explicitly deny user access within the Duo environment. It detects this behavior by searching Duo administrator activity logs for policy creation or update actions where the authentication status is set to "Deny access." By correlating these events with user and admin details, the analytic highlights potential misuse or malicious changes to access policies. This behavior is critical for a SOC to monitor, as unauthorized or suspicious denial of access policies can indicate insider threats, account compromise, or attempts to disrupt legitimate user access. The impact of such an attack may include denial of service to critical accounts, disruption of business operations, or the masking of further malicious activity by preventing targeted users from accessing resources. Early detection enables rapid investigation and remediation to maintain organizational security and availability.
data_source:
    - Cisco Duo Administrator
search: |-
    `cisco_duo_administrator` action=policy_update OR action=policy_create
      | spath input=description
      | search auth_status="Deny access"
      | rename object as user
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY action actionlabel description
           user admin_email
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `cisco_duo_policy_deny_access_filter`
how_to_implement: The analytic leverages Duo activity logs to be ingested using the Cisco Security Cloud App (https://splunkbase.splunk.com/app/7404).
known_false_positives: No false positives have been identified at this time.
references:
    - https://splunkbase.splunk.com/app/7404
finding:
    title: A policy has been created or updated to deny access by user $user$ with email $admin_email$
    entity:
        field: user
        type: user
        score: 50
analytic_story:
    - Cisco Duo Suspicious Activity
asset_type: Identity
mitre_attack_id:
    - T1556
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: application
security_domain: identity

Stages and Predicates

Stage 1: search

`cisco_duo_administrator` action=policy_update OR action=policy_create

Stage 2: spath

| spath input=description

Stage 3: search

| search auth_status="Deny access"

Stage 4: rename

| rename object as user

Stage 5: stats

| stats count min(_time) as firstTime max(_time) as lastTime
    BY action actionlabel description
       user admin_email

Stage 6: search

| `security_content_ctime(firstTime)`

Stage 7: search

| `security_content_ctime(lastTime)`

Stage 8: search

| `cisco_duo_policy_deny_access_filter`

Indicators

These rows show field, operator, and value matches.

Control Panel Abuse (Sysmon)

#
Group by
_time, host
Source
github.com/anvilogic-forge/armory

Adversaries may abuse control.exe to proxy execution of malicious payloads. The Windows Control Panel process binary (control.exe) handles execution of Control Panel items, which are utilities that allow users to view and adjust computer settings. Adversaries may also rename malicious DLL files (.dll) with Control Panel file extensions (.cpl), Control Panel items, specifically CPL files, may also bypass application and/or file extension allow lists

MITRE ATT&CK Coverage

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 1: Process creation

Rule Body

id: '5992.18210'
title: Control Panel Abuse
description: 'Adversaries may abuse control.exe to proxy execution of malicious payloads.
  The Windows Control Panel process binary (control.exe) handles execution of Control
  Panel items, which are utilities that allow users to view and adjust computer settings.
  Adversaries may also rename malicious DLL files (.dll) with Control Panel file extensions
  (.cpl), Control Panel items, specifically CPL files, may also bypass application
  and/or file extension allow lists. - Threat Actor Association: Alloy Taurus/Gallium,
  Lazarus, UNC2589 - Atomics T1218.002 Test#1 - #TrendingThreat #Russia #Ukraine'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` ("EventCode=1" OR "<EventID>1<")
  "control.exe" ("cpl" OR "dll" OR "inf" OR "\.\.\/") | regex process="(?i)(control\.exe.+?\.(dll|cpl|\.\/|inf))"
  | table _time, host, user parent_*, process, process_*, signature_id | bin span=1s
  | stats values(*) as * by _time, host '
techniques:
- defense-evasion:system binary proxy execution:control panel
technique_id:
- T1218.002
data_category:
- Windows Sysmon
references:
- https://lolbas-project.github.io/lolbas/Binaries/Control/
- https://www.welivesecurity.com/wp-content/uploads/2020/06/ESET_InvisiMole.pdf

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_sysmon` ("EventCode=1" OR "<EventID>1<") "control.exe" ("cpl" OR "dll" OR "inf" OR "\.\.\/")

Stage 2: regex

| regex process="(?i)(control\.exe.+?\.(dll|cpl|\.\/|inf))"

Stage 3: table

| table _time, host, user parent_*, process, process_*, signature_id

Stage 4: bucket

| bin span=1s

Stage 5: stats

| stats values(*) as * by _time, host

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
processregex_match
  • (?i)(control.exe.+?.(dll|cpl|.\/|inf)) corpus 2 (splunk 2)
field:"CommandLine" kind:regex_match value:"(?i)(control.exe.+?.(dll|cpl|.\/|inf))"

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"EventCode=1"
1"<EventID>1<"
1"control.exe"
1"cpl"
1"dll"
1"inf"
1"\.\.\/"

Detect Certify With PowerShell Script Block Logging

#
Status
production
Severity
medium
Group by
Guid, Name, Opcode, Path, ScriptBlockId, ScriptBlockText, dest, process_id, signature, signature_id, user_id, vendor_product
Author
Steven Dick
Source
github.com/splunk/security_content

The following analytic detects the use of the Certify tool via an in-memory PowerShell function to enumerate Active Directory Certificate Services (AD CS) environments. It leverages PowerShell Script Block Logging (EventCode 4104) to identify specific command patterns associated with Certify's enumeration and exploitation functions. This activity is significant as it indicates potential reconnaissance or exploitation attempts against AD CS, which could lead to unauthorized certificate issuance. If confirmed malicious, attackers could leverage this to escalate privileges, persist in the environment, or access sensitive information by abusing AD CS.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Detect Certify With PowerShell Script Block Logging
id: f533ca6c-9440-4686-80cb-7f294c07812a
version: 14
creation_date: '2023-07-28'
modification_date: '2026-05-13'
author: Steven Dick
status: production
type: TTP
description: The following analytic detects the use of the Certify tool via an in-memory PowerShell function to enumerate Active Directory Certificate Services (AD CS) environments. It leverages PowerShell Script Block Logging (EventCode 4104) to identify specific command patterns associated with Certify's enumeration and exploitation functions. This activity is significant as it indicates potential reconnaissance or exploitation attempts against AD CS, which could lead to unauthorized certificate issuance. If confirmed malicious, attackers could leverage this to escalate privileges, persist in the environment, or access sensitive information by abusing AD CS.
data_source:
    - Powershell Script Block Logging 4104
search: |-
    `powershell` EventCode=4104 (ScriptBlockText IN ("*find *") AND ScriptBlockText IN ("* /vulnerable*","* -vulnerable*","* /enrolleeSuppliesSubject *","* /json /outfile*")) OR (ScriptBlockText IN (,"*auth *","*req *",) AND ScriptBlockText IN ("* -ca *","* -username *","* -u *")) OR (ScriptBlockText IN ("*request *","*download *") AND ScriptBlockText IN ("* /ca:*"))
      | fillnull
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY dest signature signature_id
           user_id vendor_product EventID
           Guid Opcode Name
           Path ProcessID ScriptBlockId
           ScriptBlockText
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | eval file_name = case(isnotnull(file_name),file_name,true(),"unknown")
      | eval signature = substr(command,0,256)
      | `detect_certify_with_powershell_script_block_logging_filter`
how_to_implement: To successfully implement this analytic, you will need to enable PowerShell Script Block Logging on some or all endpoints. Additional setup here https://help.splunk.com/en/security-offerings/splunk-user-behavior-analytics/get-data-in/5.4.1/add-other-data-to-splunk-uba/configure-powershell-logging-to-see-powershell-anomalies-in-splunk-uba..
known_false_positives: No false positives have been identified at this time.
references:
    - https://github.com/GhostPack/Certify
    - https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified_Pre-Owned.pdf
finding:
    title: Certify arguments through PowerShell detected on $dest$.
    entity:
        field: user_id
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: Certify arguments through PowerShell detected on $dest$.
analytic_story:
    - Windows Certificate Services
    - Malicious PowerShell
asset_type: Endpoint
mitre_attack_id:
    - T1059.001
    - T1649
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`powershell` EventCode=4104 (ScriptBlockText IN ("*find *") AND ScriptBlockText IN ("* /vulnerable*","* -vulnerable*","* /enrolleeSuppliesSubject *","* /json /outfile*")) OR (ScriptBlockText IN (,"*auth *","*req *",) AND ScriptBlockText IN ("* -ca *","* -username *","* -u *")) OR (ScriptBlockText IN ("*request *","*download *") AND ScriptBlockText IN ("* /ca:*"))

Stage 2: fillnull

| fillnull

Stage 3: stats

| stats count min(_time) as firstTime max(_time) as lastTime
    BY dest signature signature_id
       user_id vendor_product EventID
       Guid Opcode Name
       Path ProcessID ScriptBlockId
       ScriptBlockText

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: eval

| eval file_name = case(isnotnull(file_name),file_name,true(),"unknown")
file_name =
ifisnotnull(file_name)file_name
else"unknown"

Stage 7: eval

| eval signature = substr(command,0,256)

Stage 8: search

| `detect_certify_with_powershell_script_block_logging_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4104 corpus 269 (splunk 269)
field:"EventID" kind:eq value:"4104"
ScriptBlockTextin
  • * -ca *
  • * -u *
  • * -username *
  • * -vulnerable*
  • * /ca:*
  • * /enrolleeSuppliesSubject *
  • * /json /outfile*
  • * /vulnerable*
  • *auth *
  • *download *
  • *find *
  • *req *
  • *request *
field:"ScriptBlockText" kind:in

Detect Spike in S3 Bucket deletion

#
Status
experimental
Severity
low
Group by
user
Author
Bhavin Patel, Splunk
Source
github.com/splunk/security_content

The following analytic identifies a spike in API activity related to the deletion of S3 buckets in your AWS environment. It leverages AWS CloudTrail logs to detect anomalies by comparing current deletion activity against a historical baseline. This activity is significant as unusual spikes in S3 bucket deletions could indicate malicious actions such as data exfiltration or unauthorized data destruction. If confirmed malicious, this could lead to significant data loss, disruption of services, and potential exposure of sensitive information. Immediate investigation is required to determine the legitimacy of the activity.

Known False Positives

  • Based on the values of`dataPointThreshold` and `deviationThreshold`, the false positive rate may vary. Please modify this according the your environment.

MITRE ATT&CK Coverage

TacticTechniques
Collection

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: Detect Spike in S3 Bucket deletion
id: e733a326-59d2-446d-b8db-14a17151aa68
version: 8
creation_date: '2020-04-29'
modification_date: '2026-05-13'
author: Bhavin Patel, Splunk
status: experimental
type: Anomaly
description: The following analytic identifies a spike in API activity related to the deletion of S3 buckets in your AWS environment. It leverages AWS CloudTrail logs to detect anomalies by comparing current deletion activity against a historical baseline. This activity is significant as unusual spikes in S3 bucket deletions could indicate malicious actions such as data exfiltration or unauthorized data destruction. If confirmed malicious, this could lead to significant data loss, disruption of services, and potential exposure of sensitive information. Immediate investigation is required to determine the legitimacy of the activity.
data_source:
    - AWS CloudTrail
search: |-
    `cloudtrail` eventName=DeleteBucket [search `cloudtrail` eventName=DeleteBucket
      | spath output=arn path=userIdentity.arn
      | stats count as apiCalls
        BY arn
      | inputlookup s3_deletion_baseline append=t
      | fields - latestCount
      | stats values(*) as *
        BY arn
      | rename apiCalls as latestCount
      | eval newAvgApiCalls=avgApiCalls + (latestCount-avgApiCalls)/720
      | eval newStdevApiCalls=sqrt(((pow(stdevApiCalls, 2)*719 + (latestCount-newAvgApiCalls)*(latestCount-avgApiCalls))/720))
      | eval avgApiCalls=coalesce(newAvgApiCalls, avgApiCalls), stdevApiCalls=coalesce(newStdevApiCalls, stdevApiCalls), numDataPoints=if(isnull(latestCount), numDataPoints, numDataPoints+1)
      | table arn, latestCount, numDataPoints, avgApiCalls, stdevApiCalls
      | outputlookup s3_deletion_baseline
      | eval dataPointThreshold = 15, deviationThreshold = 3
      | eval isSpike=if((latestCount > avgApiCalls+deviationThreshold*stdevApiCalls) AND numDataPoints > dataPointThreshold, 1, 0)
      | where isSpike=1
      | rename arn as userIdentity.arn
      | table userIdentity.arn]
      | spath output=user userIdentity.arn
      | spath output=bucketName path=requestParameters.bucketName
      | stats values(bucketName) as bucketName, count as numberOfApiCalls, dc(eventName) as uniqueApisCalled
        BY user
      | `detect_spike_in_s3_bucket_deletion_filter`
how_to_implement: You must install the AWS App for Splunk (version 5.1.0 or later) and Splunk Add-on for AWS (version 4.4.0 or later), then configure your AWS CloudTrail inputs. You can modify `dataPointThreshold` and `deviationThreshold` to better fit your environment. The `dataPointThreshold` variable is the minimum number of data points required to have a statistically significant amount of data to determine. The `deviationThreshold` variable is the number of standard deviations away from the mean that the value must be to be considered a spike. This search works best when you run the "Baseline of S3 Bucket deletion activity by ARN" support search once to create a baseline of previously seen S3 bucket-deletion activity.
known_false_positives: Based on the values of`dataPointThreshold` and `deviationThreshold`, the false positive rate may vary. Please modify this according the your environment.
references: []
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 20
          message: Spike in AWS S3 Bucket Deletion from $user$
analytic_story:
    - Suspicious AWS S3 Activities
asset_type: S3 Bucket
mitre_attack_id:
    - T1530
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: network
baselines:
    - Baseline of S3 Bucket deletion activity by ARN

Stages and Predicates

Stage 1: search

`cloudtrail` eventName=DeleteBucket [
    search `cloudtrail` eventName=DeleteBucket
    | spath output=arn path=userIdentity.arn
    | stats count as apiCalls
        BY arn
    | inputlookup s3_deletion_baseline append=t
    | fields - latestCount
    | stats values(*) as *
        BY arn
    | rename apiCalls as latestCount
    | eval newAvgApiCalls=avgApiCalls + (latestCount-avgApiCalls)/720
    | eval
        newStdevApiCalls=sqrt(
            ((pow(stdevApiCalls, 2)*719 + (latestCount-newAvgApiCalls)*(latestCount-avgApiCalls))/720)
        )
    | eval avgApiCalls=coalesce(newAvgApiCalls, avgApiCalls),
        stdevApiCalls=coalesce(newStdevApiCalls, stdevApiCalls),
        numDataPoints=if(isnull(latestCount), numDataPoints, numDataPoints+1)
    | table arn, latestCount, numDataPoints, avgApiCalls, stdevApiCalls
    | outputlookup s3_deletion_baseline
    | eval dataPointThreshold = 15, deviationThreshold = 3
    | eval
        isSpike=if(
            (latestCount > avgApiCalls+deviationThreshold*stdevApiCalls) AND numDataPoints > dataPointThreshold,
            1,
            0
        )
    | where isSpike=1
    | rename arn as userIdentity.arn
    | table userIdentity.arn
]

Stage 2: spath

| spath output=user userIdentity.arn

Stage 3: spath

| spath output=bucketName path=requestParameters.bucketName

Stage 4: stats

| stats
    values(bucketName) as bucketName,
    count as numberOfApiCalls,
    dc(eventName) as uniqueApisCalled
  BY user

Stage 5: search

| `detect_spike_in_s3_bucket_deletion_filter`

Indicators

These rows show field, operator, and value matches.

ESXi Encryption Settings Modified

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

Detects the disabling of critical encryption enforcement settings on an ESXi host, such as secure boot or executable verification requirements, which may indicate an attempt to weaken hypervisor integrity or allow unauthorized code execution.

Known False Positives

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

MITRE ATT&CK Coverage

TacticTechniques
Defense Impairment

Rule Body

name: ESXi Encryption Settings Modified
id: dbbbe26f-83fe-4ee3-8b77-ccf7fbd416c8
version: 6
creation_date: '2025-07-11'
modification_date: '2026-08-12'
author: Raven Tait, Splunk
status: production
type: TTP
description: Detects the disabling of critical encryption enforcement settings on an ESXi host, such as secure boot or executable verification requirements, which may indicate an attempt to weaken hypervisor integrity or allow unauthorized code execution.
data_source:
    - VMWare ESXi Syslog
search: |-
    `esxi_syslog`
    Message = "*system settings encryption set*"
    NOT Message = "*shell.*"
    Message IN (
        "* -e *",
        "* -s *",
        "*--require-secure-boot*",
        "*execInstalledOnly*",
        "*require-exec-installed-only*"
    )
    | rex field=_raw "Z (?<dest>[\w\.]*)\s.*\]: \[(?<user>\w+)\]:(?<command>.+)"
    | stats min(_time) as firstTime max(_time) as lastTime count by dest user command
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `esxi_encryption_settings_modified_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: Encryption settings modified 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:
    - T1685
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: application
security_domain: endpoint

Stages and Predicates

Stage 1: search

`esxi_syslog`
Message = "*system settings encryption set*"
NOT Message = "*shell.*"
Message IN (
    "* -e *",
    "* -s *",
    "*--require-secure-boot*",
    "*execInstalledOnly*",
    "*require-exec-installed-only*"
)

Stage 2: rex

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

Stage 3: stats

| stats min(_time) as firstTime max(_time) as lastTime count by dest user command

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `esxi_encryption_settings_modified_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Messageeq
  • *system settings encryption set*
field:"Message" kind:eq value:"*system settings encryption set*"
Messagein
  • * -e *
  • * -s *
  • *--require-secure-boot*
  • *execInstalledOnly*
  • *require-exec-installed-only*
field:"Message" kind:in
sourcetypein
  • vmw-syslog corpus 23 (splunk 23)
  • vmware:esxlog* corpus 23 (splunk 23)
field:"sourcetype" kind:in

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
Messageeq*shell.*excludes:Message field:"Message" value:"*shell.*"

Gdrive suspicious file sharing

#
Status
experimental
Group by
email, src_ip
Author
Rod Soto, Teoderick Contreras
Source
github.com/splunk/security_content

The following analytic identifies suspicious file-sharing activity on Google Drive, where internal users share documents with more than 50 external recipients. It leverages GSuite Drive logs, focusing on changes in user access and filtering for emails outside the organization's domain. This activity is significant as it may indicate compromised accounts or intentional data exfiltration. If confirmed malicious, this behavior could lead to unauthorized access to sensitive information, data leaks, and potential compliance violations.

Known False Positives

  • This is an anomaly search, you must specify your domain in the parameters so it either filters outside domains or focus on internal domains. This search may also help investigate compromise of accounts. By looking at for example source ip addresses, document titles and abnormal number of shares and shared target users.

MITRE ATT&CK Coverage

TacticTechniques
Initial Access

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: Gdrive suspicious file sharing
id: a7131dae-34e3-11ec-a2de-acde48001122
version: 8
creation_date: '2021-10-24'
modification_date: '2026-05-13'
author: Rod Soto, Teoderick Contreras
status: experimental
type: Hunting
description: The following analytic identifies suspicious file-sharing activity on Google Drive, where internal users share documents with more than 50 external recipients. It leverages GSuite Drive logs, focusing on changes in user access and filtering for emails outside the organization's domain. This activity is significant as it may indicate compromised accounts or intentional data exfiltration. If confirmed malicious, this behavior could lead to unauthorized access to sensitive information, data leaks, and potential compliance violations.
data_source: []
search: |-
    `gsuite_drive` name=change_user_access
      | rename parameters.* as *
      | search email = "*@yourdomain.com" target_user != "*@yourdomain.com"
      | stats count values(owner) as owner values(target_user) as target values(doc_type) as doc_type values(doc_title) as doc_title dc(target_user) as distinct_target
        BY src_ip email
      | where distinct_target > 50
      | `gdrive_suspicious_file_sharing_filter`
how_to_implement: Need to implement Gsuite logging targeting Google suite drive activity. In order for the search to work for your environment please update `yourdomain.com` value in the query with the domain relavant for your organization.
known_false_positives: This is an anomaly search, you must specify your domain in the parameters so it either filters outside domains or focus on internal domains. This search may also help investigate compromise of accounts. By looking at for example source ip addresses, document titles and abnormal number of shares and shared target users.
references:
    - https://www.splunk.com/en_us/blog/security/investigating-gsuite-phishing-attacks-with-splunk.html
analytic_story:
    - Spearphishing Attachments
    - Data Exfiltration
    - Scattered Lapsus$ Hunters
asset_type: GDrive
mitre_attack_id:
    - T1566
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: threat

Stages and Predicates

Stage 1: search

`gsuite_drive` name=change_user_access

Stage 2: rename

| rename parameters.* as *

Stage 3: search

| search email = "*@yourdomain.com" target_user != "*@yourdomain.com"

Stage 4: stats

| stats
    count
    values(owner) as owner
    values(target_user) as target
    values(doc_type) as doc_type
    values(doc_title) as doc_title
    dc(target_user) as distinct_target
  BY src_ip email

Stage 5: where

| where distinct_target > 50

Stage 6: search

| `gdrive_suspicious_file_sharing_filter`

Indicators

These rows show field, operator, and value matches.

Kubernetes Anomalous Outbound Network Activity from Process

#
Status
experimental
Severity
low
Group by
"k8s.cluster.name", "source.process.name", "source.workload.name", key
Author
Matthew Moore, Splunk
Source
github.com/splunk/security_content

The following analytic identifies anomalously high outbound network activity from processes running within containerized workloads in a Kubernetes environment. It leverages Network Performance Monitoring metrics collected via an OTEL collector and pulled from Splunk Observability Cloud. The detection compares recent network metrics (tcp.bytes, tcp.new_sockets, tcp.packets, udp.bytes, udp.packets) over the last hour with the average metrics over the past 30 days. This activity is significant as it may indicate data exfiltration, process modification, or container compromise. If confirmed malicious, it could lead to unauthorized data exfiltration, communication with malicious entities, or further attacks within the containerized environment.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

TacticTechniques
Execution

Rule Body

name: Kubernetes Anomalous Outbound Network Activity from Process
id: dd6afee6-e0a3-4028-a089-f47dd2842c22
version: 9
creation_date: '2024-01-30'
modification_date: '2026-05-13'
author: Matthew Moore, Splunk
status: experimental
type: Anomaly
description: The following analytic identifies anomalously high outbound network activity from processes running within containerized workloads in a Kubernetes environment. It leverages Network Performance Monitoring metrics collected via an OTEL collector and pulled from Splunk Observability Cloud. The detection compares recent network metrics (tcp.bytes, tcp.new_sockets, tcp.packets, udp.bytes, udp.packets) over the last hour with the average metrics over the past 30 days. This activity is significant as it may indicate data exfiltration, process modification, or container compromise. If confirmed malicious, it could lead to unauthorized data exfiltration, communication with malicious entities, or further attacks within the containerized environment.
data_source: []
search: "| mstats avg(tcp.*) as tcp.* avg(udp.*) as udp.* where `kubernetes_metrics` AND earliest=-1h by k8s.cluster.name source.workload.name source.process.name  span=10s | eval key='source.workload.name' + \":\" + 'source.process.name' | join type=left key [ mstats avg(tcp.*) as avg_tcp.* avg(udp.*) as avg_udp.* stdev(tcp.*) as stdev_tcp.* avg(udp.*) as stdev_udp.* where `kubernetes_metrics` AND earliest=-30d latest=-1h by source.workload.name source.process.name | eval key='source.workload.name' + \":\" + 'source.process.name' ] | eval anomalies = \"\" | foreach stdev_* [ eval anomalies =if( '<<MATCHSTR>>' > ('avg_<<MATCHSTR>>' + 3 * 'stdev_<<MATCHSTR>>'), anomalies + \"<<MATCHSTR>> higher than average by \" + tostring(round(('<<MATCHSTR>>' - 'avg_<<MATCHSTR>>')/'stdev_<<MATCHSTR>>' ,2)) + \" Standard Deviations. <<MATCHSTR>>=\" + tostring('<<MATCHSTR>>') + \" avg_<<MATCHSTR>>=\" + tostring('avg_<<MATCHSTR>>') + \" 'stdev_<<MATCHSTR>>'=\" + tostring('stdev_<<MATCHSTR>>') + \", \" , anomalies) ] | fillnull | eval anomalies = split(replace(anomalies, \",\\s$$$$\", \"\") ,\", \") | where anomalies!=\"\" | stats count(anomalies) as count values(anomalies) as anomalies by k8s.cluster.name source.workload.name source.process.name | where count > 5 | rename k8s.cluster.name as host | `kubernetes_anomalous_outbound_network_activity_from_process_filter`"
how_to_implement: "To gather NPM metrics the Open Telemetry to the Kubernetes Cluster and enable Network Performance Monitoring according to instructions found in Splunk Docs https://help.splunk.com/en/splunk-observability-cloud/monitor-infrastructure/network-explorer/set-up-network-explorer-in-kubernetes#network-explorer-setup In order to access those metrics from within Splunk Enterprise and ES, the Splunk Infrastructure Monitoring add-on must be installed and configured on a Splunk Search Head.  Once installed, first configure the add-on with your O11y Cloud Org ID and Access Token. Lastly set up the add-on to ingest metrics from O11y cloud using the following settings, and any other settings left at default:\n* Name sim_npm_metrics_to_metrics_index\n * Metric Resolution 10000"
known_false_positives: No false positives have been identified at this time.
references:
    - https://github.com/signalfx/splunk-otel-collector-chart
intermediate_findings:
    entities:
        - field: host
          type: system
          score: 20
          message: Kubernetes Anomalous Outbound Network Activity from Process in kubernetes cluster $host$
analytic_story:
    - Abnormal Kubernetes Behavior using Splunk Infrastructure Monitoring
asset_type: Kubernetes
mitre_attack_id:
    - T1204
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: network

Stages and Predicates

Stage 1: search

| mstats avg(tcp.*) as tcp.* avg(udp.*) as udp.* where `kubernetes_metrics` AND earliest=-1h by k8s.cluster.name source.workload.name source.process.name  span=10s

Stage 2: eval

| eval key='source.workload.name' + ":" + 'source.process.name'

Stage 3: join

| join type=left key
    [ mstats avg(tcp.*) as avg_tcp.* avg(udp.*) as avg_udp.* stdev(tcp.*) as stdev_tcp.* avg(udp.*) as stdev_udp.* where `kubernetes_metrics` AND earliest=-30d latest=-1h by source.workload.name source.process.name | eval key='source.workload.name' + ":" + 'source.process.name' ]

Stage 4: eval

| eval anomalies = ""

Stage 5: search

| foreach stdev_*
    [
        eval
            anomalies =if(
                '<<MATCHSTR>>' > ('avg_<<MATCHSTR>>' + 3 * 'stdev_<<MATCHSTR>>'),
                anomalies + "<<MATCHSTR>> higher than average by " + tostring(
                    round(('<<MATCHSTR>>' - 'avg_<<MATCHSTR>>')/'stdev_<<MATCHSTR>>' ,2)
                ) + " Standard Deviations. <<MATCHSTR>>=" + tostring('<<MATCHSTR>>') + " avg_<<MATCHSTR>>=" + tostring(
                    'avg_<<MATCHSTR>>'
                ) + " 'stdev_<<MATCHSTR>>'=" + tostring('stdev_<<MATCHSTR>>') + ", ",
                anomalies
            )
    ]

Stage 6: fillnull

| fillnull

Stage 7: eval

| eval anomalies = split(replace(anomalies, ",\s$$$$", "") ,", ")

Stage 8: where

| where anomalies!=""

Stage 9: stats

| stats
    count(anomalies) as count
    values(anomalies) as anomalies
  by k8s.cluster.name source.workload.name source.process.name

Stage 10: where

| where count > 5

Stage 11: rename

| rename k8s.cluster.name as host

Stage 12: search

| `kubernetes_anomalous_outbound_network_activity_from_process_filter`

Indicators

These rows show field, operator, and value matches.

Search Terms

These SPL tokens match against raw event text.

StageTerm
1mstats
1avg
1tcp.*
1as
1tcp.*
1avg
1udp.*
1as
1udp.*
1where
1by
1source.process.name
1k8s.cluster.name
1source.workload.name
5foreach
5stdev_*

Linux Apparmor Bypass Via Aaexec

#
Status
production
Severity
medium
Group by
IntegrityLevel, command_line, computer_name, event_action, original_file_name, parent_command_line, parent_process_basename, parent_process_guid, parent_process_id, parent_process_name, process_basename, process_guid, process_hash, process_id, process_name, user, user_id, vendor_product
Author
Raven Tait, Splunk
Source
github.com/splunk/security_content

The following analytic detects aa-exec being used to launch a binary under the trinity, chrome, or flatpak AppArmor profiles where the executed target is not the legitimate application those profiles are intended to confine. This behavior is consistent with abuse of userns,-carrying AppArmor profiles to bypass Ubuntu's unprivileged user namespace restrictions as seen in the CVE-2026-46331 privilege escalation exploit. The analytic flags execution when the target command following -- is invoked via a relative path, resolves outside standard trusted install directories for these applications, or shares the same binary name as the calling parent process. Adversaries and red teams may abuse this technique to escalate privileges by tricking aa-exec into granting a namespace-creation capability to an arbitrary binary rather than the trusted application the profile was written for.

Known False Positives

  • Chrome, Flatpak, and the trinity profile are never legitimately re-executed with extraneious arguments from a non-browser binary path

MITRE ATT&CK Coverage

TacticTechniques
Privilege Escalation

Telemetry Coverage

PlatformRecord / event type
LinuxEvent ID 1: Process Create

Rule Body

name: Linux Apparmor Bypass Via Aaexec
id: b6d2a2b8-ad52-4a12-8956-dbf10012d1b8
version: 1
creation_date: '2026-06-30'
modification_date: '2026-06-30'
author: Raven Tait, Splunk
status: production
type: TTP
description: The following analytic detects aa-exec being used to launch a binary under the trinity, chrome, or flatpak AppArmor profiles where the executed target is not the legitimate application those profiles are intended to confine. This behavior is consistent with abuse of userns,-carrying AppArmor profiles to bypass Ubuntu's unprivileged user namespace restrictions as seen in the CVE-2026-46331 privilege escalation exploit. The analytic flags execution when the target command following -- is invoked via a relative path, resolves outside standard trusted  install directories for these applications, or shares the same binary name as the calling parent process. Adversaries and red teams may abuse this technique to escalate privileges by tricking aa-exec into granting a namespace-creation capability to an arbitrary binary rather than the trusted application the profile was written for.
data_source:
    - Sysmon for Linux EventID 1
search: |-
    | tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime
    from datamodel=Endpoint.Processes where
        Processes.process_name="*aa-exec"
        AND Processes.process="* -p *"
        AND Processes.process="*--*"
        AND Processes.process IN ("*trinity*","*chrome*","*flatpak*")
        AND NOT Processes.process IN ("/user*","/opt*","/snap*","/var/lib/flatpak*")
    by Processes.action Processes.dest Processes.original_file_name Processes.parent_process Processes.parent_process_exec
    Processes.parent_process_guid Processes.parent_process_id Processes.parent_process_name Processes.parent_process_path
    Processes.process Processes.process_exec Processes.process_guid Processes.process_hash Processes.process_id
    Processes.process_integrity_level Processes.process_name Processes.process_path Processes.user Processes.user_id
    Processes.vendor_product
    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `linux_apparmor_bypass_via_aaexec_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: Chrome, Flatpak, and the trinity profile are never legitimately re-executed with extraneious arguments from a non-browser binary path
references:
    - https://github.com/sgkdev/packet_edit_meme
    - https://tuxcare.com/blog/pedit-cow-cve/
finding:
    title: AppArmor bypass leveraging aa-exec was observed on $dest$.
    entity:
        field: dest
        type: system
        score: 50
threat_objects:
    - field: parent_process_name
      type: process
analytic_story:
    - Linux Privilege Escalation
asset_type: Endpoint
cve:
    - CVE-2026-46331
mitre_attack_id:
    - T1068
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  from datamodel=Endpoint.Processes
  where
    Processes.process_name="*aa-exec"
    AND Processes.process="* -p *"
    AND Processes.process="*--*"
    AND Processes.process IN ("*trinity*","*chrome*","*flatpak*")
    AND NOT Processes.process IN ("/user*","/opt*","/snap*","/var/lib/flatpak*")
  by
    Processes.action
    Processes.dest
    Processes.original_file_name
    Processes.parent_process
    Processes.parent_process_exec
    Processes.parent_process_guid
    Processes.parent_process_id
    Processes.parent_process_name
    Processes.parent_process_path
    Processes.process
    Processes.process_exec
    Processes.process_guid
    Processes.process_hash
    Processes.process_id
    Processes.process_integrity_level
    Processes.process_name
    Processes.process_path
    Processes.user
    Processes.user_id
    Processes.vendor_product

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `linux_apparmor_bypass_via_aaexec_filter`

Indicators

These rows show field, operator, and value matches.

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
Processes.processin/opt*, /snap*, /user*, /var/lib/flatpak*excludes:Processes.process

O365 Privileged Role Assigned

#
Status
production
Severity
medium
Group by
aws::recipientAccountId, category, dest, group.id, object_name, result, signature, src, user, vendor_product
Author
Steven Dick
Source
github.com/splunk/security_content

The following analytic identifies the assignment of sensitive and privileged Azure Active Directory roles to an Azure AD user. Adversaries and red teams alike may assign these roles to a compromised account to establish Persistence in an Azure AD environment. This detection leverages the O365 Universal Audit Log data source.

Known False Positives

  • Administrators will legitimately assign the privileged roles users as part of administrative tasks. Microsoft Privileged Identity Management (PIM) may cause false positives / less accurate alerting.

MITRE ATT&CK Coverage

Telemetry Coverage

Rules Detecting the Same Action

These rules filter on the same operation.

Rule Body

name: O365 Privileged Role Assigned
id: db435700-4ddc-4c23-892e-49e7525d7d39
version: 11
creation_date: '2024-04-13'
modification_date: '2026-05-13'
author: Steven Dick
status: production
type: TTP
description: The following analytic identifies the assignment of sensitive and privileged Azure Active Directory roles to an Azure AD user. Adversaries and red teams alike may assign these roles to a compromised account to establish Persistence in an Azure AD environment. This detection leverages the O365 Universal Audit Log data source.
data_source:
    - Office 365 Universal Audit Log
search: "`o365_management_activity` Workload=AzureActiveDirectory Operation IN (\"Add member to role.\",\"Add eligible member to role.\") | eval user = ObjectId, src_user = case(match(mvindex('Actor{}.ID',-1),\"User\"),mvindex('Actor{}.ID',0),match(mvindex('Actor{}.ID',-1),\"ServicePrincipal\"),mvindex('Actor{}.ID',3),true(),mvindex('Actor{}.ID',0)), object_name = mvindex('ModifiedProperties{}.NewValue', mvfind('ModifiedProperties{}.Name',\"Role\\.DisplayName\")), object_id = mvindex('ModifiedProperties{}.NewValue', mvfind('ModifiedProperties{}.Name',\"Role\\.TemplateId\")), signature = Operation, result = ResultStatus, category = mvindex('Target{}.ID',2) | fillnull | stats count, min(_time) as firstTime, max(_time) as lastTime by src_user, src, user, category, result, object_name, object_id, signature, vendor_account, vendor_product, dest | lookup privileged_azure_ad_roles azuretemplateid as object_id OUTPUT isprvilegedadrole | search isprvilegedadrole=\"TRUE\" category=\"User\" | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `o365_privileged_role_assigned_filter`"
how_to_implement: You must install the Splunk Microsoft Office 365 Add-on and ingest Office 365 management activity events.
known_false_positives: Administrators will legitimately assign the privileged roles users as part of administrative tasks. Microsoft Privileged Identity Management (PIM) may cause false positives / less accurate alerting.
references:
    - https://attack.mitre.org/techniques/T1098/003/
    - https://learn.microsoft.com/en-us/azure/active-directory/roles/permissions-reference
    - https://learn.microsoft.com/en-us/microsoft-365/admin/add-users/about-exchange-online-admin-role?view=o365-worldwide
finding:
    title: A privileged Azure AD role [$object_name$] was assigned to user $user$ by $src_user$
    entity:
        field: src_user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: user
          type: user
          score: 50
          message: A privileged Azure AD role [$object_name$] was assigned to user $user$ by $src_user$
analytic_story:
    - Azure Active Directory Persistence
    - Scattered Lapsus$ Hunters
asset_type: O365 Tenant
mitre_attack_id:
    - T1098.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: cloud
security_domain: identity

Stages and Predicates

Stage 1: search

`o365_management_activity` Workload=AzureActiveDirectory Operation IN (
    "Add member to role.",
    "Add eligible member to role."
)

Stage 2: eval

| eval user = ObjectId,
    src_user = case(
        match(mvindex('Actor{}.ID',-1),"User"), mvindex('Actor{}.ID',0),
        match(mvindex('Actor{}.ID',-1),"ServicePrincipal"), mvindex('Actor{}.ID',3),
        true(), mvindex('Actor{}.ID',0)
    ),
    object_name = mvindex(
        'ModifiedProperties{}.NewValue',
        mvfind('ModifiedProperties{}.Name',"Role\.DisplayName")
    ),
    object_id = mvindex(
        'ModifiedProperties{}.NewValue',
        mvfind('ModifiedProperties{}.Name',"Role\.TemplateId")
    ),
    signature = Operation, result = ResultStatus, category = mvindex('Target{}.ID',2)
src_user =
ifmatch(mvindex('Actor{}.ID', -1), "User")mvindex('Actor{}.ID', 0)
elifmatch(mvindex('Actor{}.ID', -1), "ServicePrincipal")mvindex('Actor{}.ID', 3)
elsemvindex('Actor{}.ID', 0)

Stage 3: fillnull

| fillnull

Stage 4: stats

| stats
    count,
    min(_time) as firstTime,
    max(_time) as lastTime
  by
    src_user,
    src,
    user,
    category,
    result,
    object_name,
    object_id,
    signature,
    vendor_account,
    vendor_product,
    dest

Stage 5: lookup

| lookup privileged_azure_ad_roles azuretemplateid as object_id OUTPUT isprvilegedadrole
Lookup table
privileged_azure_ad_roles
Key field
azuretemplateid as object_id
Output columns
['isprvilegedadrole', 'isprvilegedadrole']

Stage 6: search

| search isprvilegedadrole="TRUE" category="User"

Stage 7: search

| `security_content_ctime(firstTime)`

Stage 8: search

| `security_content_ctime(lastTime)`

Stage 9: search

| `o365_privileged_role_assigned_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Operationin
  • Add eligible member to role. corpus 2 (splunk 2)
  • Add member to role. corpus 2 (splunk 2)
field:"Operation" kind:in
Workloadeq
  • AzureActiveDirectory corpus 30 (splunk 30)
field:"Workload" kind:eq value:"AzureActiveDirectory"
categoryeq
  • User
field:"category" kind:eq value:"User"
isprvilegedadroleeq
  • TRUE corpus 4 (splunk 4)
field:"isprvilegedadrole" kind:eq value:"TRUE"
sourcetypeeq
  • o365:management:activity corpus 80 (splunk 80)
field:"sourcetype" kind:eq value:"o365:management:activity"

Suspicious Child Process for mshta.exe (Windows Event Log)

#
Group by
_time, host
Source
github.com/anvilogic-forge/armory

This use case detects when mshta.exe spawns an unexpected child process. This can indicate process injection/hollowing, masquerading, application allowlist bypass, or other suspicious activity.

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

id: '23910.44203'
title: Suspicious Child Process for mshta.exe
description: This use case detects when mshta.exe spawns an unexpected child process.
  This can indicate process injection/hollowing, masquerading, application allowlist
  bypass, or other suspicious activity.
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
  "<EventID>4688<" OR Type=Process) "mshta.exe" ("powershell.exe" OR "pwsh.exe" OR
  "cmd.exe" OR "rundll32.exe" OR "cscript.exe" OR "wscript.exe") | regex parent_process_name="(?i)(mshta\.exe)"
  | regex process_path="(?i)(cmd|services|powershell|pwsh|(c|w)script)|rundll32\.exe"
  | table _time, host, user process, process_*, parent_process_name, parent_process_*
  | bin span=1s | stats values(*) as * by _time, host '
techniques:
- execution:command and scripting interpreter
- defense-evasion:system binary proxy execution:mshta
technique_id:
- T1059
- T1218.005
data_category:
- Windows event logs
references:
- https://blog.talosintelligence.com/gamaredon-apt-targets-ukrainian-agencies/

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) "mshta.exe" ("powershell.exe" OR "pwsh.exe" OR "cmd.exe" OR "rundll32.exe" OR "cscript.exe" OR "wscript.exe")

Stage 2: regex

| regex parent_process_name="(?i)(mshta\.exe)"

Stage 3: regex

| regex process_path="(?i)(cmd|services|powershell|pwsh|(c|w)script)|rundll32\.exe"

Stage 4: table

| table _time, host, user process, process_*, parent_process_name, parent_process_*

Stage 5: bucket

| bin span=1s

Stage 6: stats

| stats values(*) as * by _time, host

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4688 corpus 284 (splunk 283, elastic 1)
field:"EventID" kind:eq value:"4688"
parent_process_nameregex_match
  • (?i)(mshta.exe) corpus 2 (splunk 2)
field:"parent_process_name" kind:regex_match value:"(?i)(mshta.exe)"
process_pathregex_match
    • (?i)(cmd|services|powershell|pwsh|(c|w)script)
    • rundll32.exe
    corpus 2 (splunk 2)
field:"process_name" kind:regex_match

Search Terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1"mshta.exe"
1"powershell.exe"
1"pwsh.exe"
1"cmd.exe"
1"rundll32.exe"
1"cscript.exe"
1"wscript.exe"

Suspicious microsoft workflow compiler rename

#
Status
production
Group by
IntegrityLevel, command_line, computer_name, event_action, original_file_name, parent_command_line, parent_process_basename, parent_process_guid, parent_process_id, parent_process_name, process_basename, process_guid, process_hash, process_id, process_name, user, user_id, vendor_product
Author
Michael Haag, Splunk
Source
github.com/splunk/security_content

The following analytic detects the renaming of microsoft.workflow.compiler.exe, a rarely used executable typically located in C:\Windows\Microsoft.NET\Framework64\v4.0.30319. This detection leverages Endpoint Detection and Response (EDR) data, focusing on process names and original file names. This activity is significant because renaming this executable can indicate an attempt to evade security controls. If confirmed malicious, an attacker could use this renamed executable to execute arbitrary code, potentially leading to privilege escalation or persistent access within the environment.

Known False Positives

  • Although unlikely, some legitimate applications may use a moved copy of microsoft.workflow.compiler.exe, triggering a false positive.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Suspicious microsoft workflow compiler rename
id: f0db4464-55d9-11eb-ae93-0242ac130002
version: 14
creation_date: '2021-01-19'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: Hunting
description: The following analytic detects the renaming of microsoft.workflow.compiler.exe, a rarely used executable typically located in C:\Windows\Microsoft.NET\Framework64\v4.0.30319. This detection leverages Endpoint Detection and Response (EDR) data, focusing on process names and original file names. This activity is significant because renaming this executable can indicate an attempt to evade security controls. If confirmed malicious, an attacker could use this renamed executable to execute arbitrary code, potentially leading to privilege escalation or persistent access within the environment.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
search: |-
    | tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes
      WHERE Processes.process_name!=microsoft.workflow.compiler.exe
        AND
        Processes.original_file_name=Microsoft.Workflow.Compiler.exe
      BY Processes.action Processes.dest Processes.original_file_name
         Processes.parent_process Processes.parent_process_exec Processes.parent_process_guid
         Processes.parent_process_id Processes.parent_process_name Processes.parent_process_path
         Processes.process Processes.process_exec Processes.process_guid
         Processes.process_hash Processes.process_id Processes.process_integrity_level
         Processes.process_name Processes.process_path Processes.user
         Processes.user_id Processes.vendor_product
    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `suspicious_microsoft_workflow_compiler_rename_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: Although unlikely, some legitimate applications may use a moved copy of microsoft.workflow.compiler.exe, triggering a false positive.
references:
    - https://lolbas-project.github.io/lolbas/Binaries/Microsoft.Workflow.Compiler/
    - https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1218/T1218.md#atomic-test-6---microsoftworkflowcompilerexe-payload-execution
analytic_story:
    - Masquerading - Rename System Utilities
    - Living Off The Land
    - Cobalt Strike
    - Trusted Developer Utilities Proxy Execution
    - BlackByte Ransomware
    - Graceful Wipe Out Attack
asset_type: Endpoint
mitre_attack_id:
    - T1036.003
    - T1127
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Processes
  WHERE Processes.process_name!=microsoft.workflow.compiler.exe
    AND
    Processes.original_file_name=Microsoft.Workflow.Compiler.exe
  BY
    Processes.action
    Processes.dest
    Processes.original_file_name
    Processes.parent_process
    Processes.parent_process_exec
    Processes.parent_process_guid
    Processes.parent_process_id
    Processes.parent_process_name
    Processes.parent_process_path
    Processes.process
    Processes.process_exec
    Processes.process_guid
    Processes.process_hash
    Processes.process_id
    Processes.process_integrity_level
    Processes.process_name
    Processes.process_path
    Processes.user
    Processes.user_id
    Processes.vendor_product

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `suspicious_microsoft_workflow_compiler_rename_filter`

Indicators

These rows show field, operator, and value matches.

Wbemprox COM Object Execution

#
Status
production
Severity
medium
Group by
dest, image_loaded, original_file_name, process_guid, process_hash, process_id, process_name, service_dll_signature_exists, service_dll_signature_verified, signature, signature_id, user_id, vendor_product
Author
Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

The following analytic detects a suspicious process loading a COM object from wbemprox.dll, fastprox.dll, or wbemcomn.dll. It leverages Sysmon EventCode 7 to identify instances where these DLLs are loaded by processes not typically associated with them, excluding known legitimate processes and directories. This activity is significant as it may indicate an attempt by threat actors to abuse COM objects for privilege escalation or evasion of detection mechanisms. If confirmed malicious, this could allow attackers to gain elevated privileges or maintain persistence within the environment, posing a significant security risk.

Known False Positives

  • legitimate process that are not in the exception list may trigger this event.

MITRE ATT&CK Coverage

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 7: Image loaded

Rule Body

name: Wbemprox COM Object Execution
id: 9d911ce0-c3be-11eb-b177-acde48001122
version: 10
creation_date: '2021-06-04'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects a suspicious process loading a COM object from wbemprox.dll, fastprox.dll, or wbemcomn.dll. It leverages Sysmon EventCode 7 to identify instances where these DLLs are loaded by processes not typically associated with them, excluding known legitimate processes and directories. This activity is significant as it may indicate an attempt by threat actors to abuse COM objects for privilege escalation or evasion of detection mechanisms. If confirmed malicious, this could allow attackers to gain elevated privileges or maintain persistence within the environment, posing a significant security risk.
data_source:
    - Sysmon EventID 7
search: '`sysmon` EventCode=7  ImageLoaded IN ("*\\fastprox.dll", "*\\wbemprox.dll", "*\\wbemcomn.dll") NOT (process_name IN ("wmiprvse.exe", "WmiApSrv.exe", "unsecapp.exe")) NOT(Image IN("*\\windows\\*","*\\program files*", "*\\wbem\\*")) | fillnull | stats count min(_time) as firstTime max(_time) as lastTime by Image ImageLoaded dest loaded_file loaded_file_path original_file_name process_exec process_guid process_hash process_id process_name process_path service_dll_signature_exists service_dll_signature_verified signature signature_id user_id vendor_product | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `wbemprox_com_object_execution_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name and imageloaded executions from your endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the Sysmon TA.
known_false_positives: legitimate process that are not in the exception list may trigger this event.
references:
    - https://krebsonsecurity.com/2021/05/a-closer-look-at-the-darkside-ransomware-gang/
    - https://www.mcafee.com/blogs/other-blogs/mcafee-labs/mcafee-atr-analyzes-sodinokibi-aka-revil-ransomware-as-a-service-what-the-code-tells-us/
finding:
    title: Suspicious COM Object Execution on $dest$
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - Ransomware
    - Revil Ransomware
    - LockBit Ransomware
asset_type: Endpoint
mitre_attack_id:
    - T1218.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`sysmon` EventCode=7  ImageLoaded IN ("*\\fastprox.dll", "*\\wbemprox.dll", "*\\wbemcomn.dll") NOT (
    process_name IN ("wmiprvse.exe", "WmiApSrv.exe", "unsecapp.exe")
) NOT(Image IN("*\\windows\\*","*\\program files*", "*\\wbem\\*"))

Stage 2: fillnull

| fillnull

Stage 3: stats

| stats
    count
    min(_time) as firstTime
    max(_time) as lastTime
  by
    Image
    ImageLoaded
    dest
    loaded_file
    loaded_file_path
    original_file_name
    process_exec
    process_guid
    process_hash
    process_id
    process_name
    process_path
    service_dll_signature_exists
    service_dll_signature_verified
    signature
    signature_id
    user_id
    vendor_product

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `wbemprox_com_object_execution_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 7 corpus 39 (splunk 39)
field:"EventID" kind:eq value:"7"
ImageLoadedin
  • *\fastprox.dll corpus 2 (splunk 2)
  • *\wbemcomn.dll corpus 2 (splunk 2)
  • *\wbemprox.dll corpus 2 (splunk 2)
field:"ImageLoaded" kind:in

Exclusions

The rule actively suppresses these predicates.

Windows Cloud Files Filter Loaded by Uncommon Process

#
Status
production
Severity
low
Group by
computer_name, dest, image_loaded, process_guid, process_hash, process_id, process_name, service_dll_signature_exists, service_dll_signature_verified, signature_id, user_id, vendor_product
Author
Raven Tait, Splunk
Source
github.com/splunk/security_content

The following analytic detects cldapi.dll being loaded by a process not associated with legitimate cloud sync activity. The Windows Cloud Files API (cldapi.dll) is abused by several local privilege escalation exploits.

Known False Positives

  • False positives may include other third-party cloud-based file storage software. Filter as necessary for your environment.

MITRE ATT&CK Coverage

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 7: Image loaded

Rule Body

name: Windows Cloud Files Filter Loaded by Uncommon Process
id: 77b85062-274e-43a5-9dab-c25862b85291
version: 1
creation_date: '2026-05-18'
modification_date: '2026-05-18'
author: Raven Tait, Splunk
status: production
type: Anomaly
description: |-
    The following analytic detects cldapi.dll being loaded by a process not associated with legitimate cloud sync activity.
    The Windows Cloud Files API (cldapi.dll) is abused by several local privilege escalation exploits.
data_source:
    - Sysmon EventID 7
search: |-
    `sysmon`
    EventID=7
    ImageLoaded="*\\cldapi.dll"
    NOT Image IN (
      "*\\box.exe",
      "*\\dropbox.exe",
      "*\\googledrivefs.exe",
      "*\\icloud.exe",
      "*\\onedrive*.exe",
      "*\\Windows\\explorer.exe"
      "*\\Windows\\System32\\*",
      "*\\Windows\\Syswow64\\*",
      "*\\Windows\\WinSxS\\*"
    )
    | stats count min(_time) as firstTime
                    max(_time) as lastTime
        by Computer ImageLoaded EventID dest loaded_file loaded_file_path process_exec
           process_guid process_hash process_id process_name process_path
           service_dll_signature_exists service_dll_signature_verified signature_id user_id
           vendor_product
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_cloud_files_filter_loaded_by_uncommon_process_filter`
how_to_implement: |-
    To successfully implement this search, you need to be ingesting logs with the driver loaded and Signature from your endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the Sysmon TA.
known_false_positives: |-
    False positives may include other third-party cloud-based file storage software.
    Filter as necessary for your environment.
references:
    - https://www.huntress.com/blog/nightmare-eclipse-intrusion
    - https://www.threatlocker.com/blog/miniplasma-windows-privilege-escalation-zero-day-affects-fully-patched-systems
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: Cloud Files Filter ($ImageLoaded$) loaded by suspicious process $Image$ on $dest$
analytic_story:
    - RedSun
    - BlueHammer
asset_type: Endpoint
mitre_attack_id:
    - T1543.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`sysmon`
EventID=7
ImageLoaded="*\\cldapi.dll"
NOT Image IN (
  "*\\box.exe",
  "*\\dropbox.exe",
  "*\\googledrivefs.exe",
  "*\\icloud.exe",
  "*\\onedrive*.exe",
  "*\\Windows\\explorer.exe"
  "*\\Windows\\System32\\*",
  "*\\Windows\\Syswow64\\*",
  "*\\Windows\\WinSxS\\*"
)

Stage 2: stats

| stats count min(_time) as firstTime
                max(_time) as lastTime
    by Computer ImageLoaded EventID dest loaded_file loaded_file_path process_exec
       process_guid process_hash process_id process_name process_path
       service_dll_signature_exists service_dll_signature_verified signature_id user_id
       vendor_product

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_cloud_files_filter_loaded_by_uncommon_process_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventIDeq
  • 7 corpus 39 (splunk 39)
field:"EventID" kind:eq value:"7"
ImageLoadedeq
  • *\cldapi.dll corpus 2 (sigma 1, splunk 1)
field:"ImageLoaded" kind:eq value:"*\cldapi.dll"

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
Imagein*\Windows\System32\*, *\Windows\Syswow64\*, *\Windows\WinSxS\*, *\Windows\explorer.exe, *\box.exe, *\dropbox.exe, *\googledrivefs.exe, *\icloud.exe, *\onedrive*.exeexcludes:Image

Windows Defender Exclusion Registry Entry

#
Status
production
Severity
medium
Group by
TargetObject, computer_name, details, event_type, process_guid, process_id, registry_hive, registry_path, registry_status, registry_value_name, registry_value_type, user, vendor_product
Author
Teoderick Contreras, Splunk, Steven Dick
Source
github.com/splunk/security_content

The following analytic detects modifications to the Windows Defender exclusion registry entries. It leverages endpoint registry data to identify changes in the registry path "\SOFTWARE\Policies\Microsoft\Windows Defender\Exclusions\". This activity is significant because adversaries often modify these entries to bypass Windows Defender, allowing malicious code to execute without detection. If confirmed malicious, this behavior could enable attackers to evade antivirus defenses, maintain persistence, and execute further malicious activities undetected.

Known False Positives

  • admin or user may choose to use this windows features.

MITRE ATT&CK Coverage

TacticTechniques
Defense Impairment

Telemetry Coverage

Rule Body

name: Windows Defender Exclusion Registry Entry
id: 13395a44-4dd9-11ec-9df7-acde48001122
version: 18
creation_date: '2021-11-25'
modification_date: '2026-06-08'
author: Teoderick Contreras, Splunk, Steven Dick
status: production
type: TTP
description: The following analytic detects modifications to the Windows Defender exclusion registry entries. It leverages endpoint registry data to identify changes in the registry path "*\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Exclusions\\*". This activity is significant because adversaries often modify these entries to bypass Windows Defender, allowing malicious code to execute without detection. If confirmed malicious, this behavior could enable attackers to evade antivirus defenses, maintain persistence, and execute further malicious activities undetected.
data_source:
    - Sysmon EventID 13
search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry WHERE (Registry.registry_path = "*\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Exclusions\\*") by Registry.action Registry.dest Registry.process_guid Registry.process_id Registry.registry_hive Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.registry_value_name Registry.registry_value_type Registry.status Registry.user Registry.vendor_product | `drop_dm_object_name(Registry)` | where isnotnull(registry_value_data) | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `windows_defender_exclusion_registry_entry_filter`'
how_to_implement: To successfully implement this search, you need to be ingesting logs with the registry value name, registry path, and registry value data from your endpoints. If you are using Sysmon, you must have at least version 2.0 of the official Sysmon TA. https://splunkbase.splunk.com/app/5709
known_false_positives: admin or user may choose to use this windows features.
references:
    - https://tccontre.blogspot.com/2020/01/remcos-rat-evading-windows-defender-av.html
    - https://app.any.run/tasks/cf1245de-06a7-4366-8209-8e3006f2bfe5/
    - https://www.microsoft.com/security/blog/2022/01/15/destructive-malware-targeting-ukrainian-organizations/
finding:
    title: Exclusion registry $registry_path$ modified or added on $dest$ for Windows Defender
    entity:
        field: user
        type: user
        score: 50
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 50
          message: Exclusion registry $registry_path$ modified or added on $dest$ for Windows Defender
analytic_story:
    - Qakbot
    - Remcos
    - ValleyRAT
    - XWorm
    - Azorult
    - Warzone RAT
    - Windows Defense Evasion Tactics
    - NetSupport RMM Tool Abuse
    - Salat Stealer
asset_type: Endpoint
mitre_attack_id:
    - T1685
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Registry
  WHERE (
      Registry.registry_path = "*\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Exclusions\\*"
  )
  by
    Registry.action
    Registry.dest
    Registry.process_guid
    Registry.process_id
    Registry.registry_hive
    Registry.registry_path
    Registry.registry_key_name
    Registry.registry_value_data
    Registry.registry_value_name
    Registry.registry_value_type
    Registry.status
    Registry.user
    Registry.vendor_product

Stage 2: search

| `drop_dm_object_name(Registry)`

Stage 3: where

| where isnotnull(registry_value_data)

Stage 4: search

| `security_content_ctime(firstTime)`

Stage 5: search

| `security_content_ctime(lastTime)`

Stage 6: search

| `windows_defender_exclusion_registry_entry_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Registry.registry_patheq
  • *\SOFTWARE\Policies\Microsoft\Windows Defender\Exclusions\*
field:"registry_path" kind:eq value:"*\SOFTWARE\Policies\Microsoft\Windows Defender\Exclusions\*"
registry_value_datais_not_null
  • (no value, null check)
field:"Details" kind:is_not_null

Windows Files and Dirs Access Rights Modification Via Icacls

#
Status
production
Severity
low
Group by
IntegrityLevel, command_line, computer_name, event_action, original_file_name, parent_command_line, parent_process_basename, parent_process_guid, parent_process_id, parent_process_name, process_basename, process_guid, process_hash, process_id, process_name, user, user_id, vendor_product
Author
Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

The following analytic identifies the modification of security permissions on files or directories using tools like icacls.exe, cacls.exe, or xcacls.exe. It leverages data from Endpoint Detection and Response (EDR) agents, focusing on specific command-line executions. This activity is significant as it is commonly used by Advanced Persistent Threats (APTs) and coinminer scripts to evade detection and maintain control over compromised systems. If confirmed malicious, this behavior could allow attackers to hinder investigation, impede remediation efforts, and maintain persistent access to the compromised environment.

Known False Positives

  • No false positives have been identified at this time. Filter as needed.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows Files and Dirs Access Rights Modification Via Icacls
id: c76b796c-27e1-4520-91c4-4a58695c749e
version: 15
creation_date: '2021-05-07'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: Anomaly
description: |
    The following analytic identifies the modification of security permissions
    on files or directories using tools like icacls.exe, cacls.exe, or xcacls.exe. It
    leverages data from Endpoint Detection and Response (EDR) agents, focusing on specific
    command-line executions. This activity is significant as it is commonly used by
    Advanced Persistent Threats (APTs) and coinminer scripts to evade detection and
    maintain control over compromised systems. If confirmed malicious, this behavior
    could allow attackers to hinder investigation, impede remediation efforts, and maintain
    persistent access to the compromised environment.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
search: |
    | tstats `security_content_summariesonly` min(_time) as firstTime max(_time)
    as lastTime from datamodel=Endpoint.Processes where
    Processes.process_name IN ("icacls.exe", "cacls.exe","xcacls.exe") AND
    Processes.process IN ("*:R*", "*:W*", "*:F*", "*:C*", "*:N*", "*/P*", "*/E*")
    by Processes.action Processes.dest Processes.original_file_name Processes.parent_process
    Processes.parent_process_exec Processes.parent_process_guid Processes.parent_process_id
    Processes.parent_process_name Processes.parent_process_path Processes.process Processes.process_exec
    Processes.process_guid Processes.process_hash Processes.process_id Processes.process_integrity_level
    Processes.process_name Processes.process_path Processes.user Processes.user_id Processes.vendor_product
    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_files_and_dirs_access_rights_modification_via_icacls_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: No false positives have been identified at this time. Filter as needed.
references:
    - https://malpedia.caad.fkie.fraunhofer.de/details/win.amadey
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 30
          message: Process name $process_name$ with access right modification argument executed by $user$ to change security permission of a specific file or directory on host $dest$
        - field: user
          type: user
          score: 30
          message: Process name $process_name$ with access right modification argument executed by $user$ to change security permission of a specific file or directory on host $dest$
analytic_story:
    - Amadey
    - Defense Evasion or Unauthorized Access Via SDDL Tampering
asset_type: Endpoint
atomic_guid:
    - 3309f53e-b22b-4eb6-8fd2-a6cf58b355a9
mitre_attack_id:
    - T1222.001
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    min(_time) as firstTime
    max(_time)
as lastTime
  from datamodel=Endpoint.Processes
  where
Processes.process_name IN ("icacls.exe", "cacls.exe","xcacls.exe") AND
Processes.process IN ("*:R*", "*:W*", "*:F*", "*:C*", "*:N*", "*/P*", "*/E*")
  by
    Processes.action
    Processes.dest
    Processes.original_file_name
    Processes.parent_process
    Processes.parent_process_exec
    Processes.parent_process_guid
    Processes.parent_process_id
    Processes.parent_process_name
    Processes.parent_process_path
    Processes.process
    Processes.process_exec
    Processes.process_guid
    Processes.process_hash
    Processes.process_id
    Processes.process_integrity_level
    Processes.process_name
    Processes.process_path
    Processes.user
    Processes.user_id
    Processes.vendor_product

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_files_and_dirs_access_rights_modification_via_icacls_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.processin
  • */E*
  • */P*
  • *:C*
  • *:F*
  • *:N*
  • *:R*
  • *:W*
field:"CommandLine" kind:in
Processes.process_namein
  • cacls.exe corpus 8 (splunk 8)
  • icacls.exe corpus 8 (splunk 8)
  • xcacls.exe corpus 8 (splunk 8)
field:"process_basename" kind:in

Windows Modify Registry Risk Behavior

#
Status
production
Severity
informational
Group by
All_Risk.annotations.mitre_attack.mitre_tactic, All_Risk.risk_object, All_Risk.risk_object_type
Author
Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

The following analytic identifies instances where three or more distinct registry modification events associated with MITRE ATT&CK Technique T1112 are detected. It leverages data from the Risk data model in Splunk, focusing on registry-related sources and MITRE technique annotations. This activity is significant because multiple registry modifications can indicate an attempt to persist, hide malicious configurations, or erase forensic evidence. If confirmed malicious, this behavior could allow attackers to maintain persistent access, execute malicious code, and evade detection, posing a severe threat to the integrity and security of the affected host.

Known False Positives

  • False positives will be present based on many factors. Tune the correlation as needed to reduce too many triggers.

MITRE ATT&CK Coverage

TacticTechniques
Persistence
Defense Impairment

Rule Body

name: Windows Modify Registry Risk Behavior
id: 5eb479b1-a5ea-4e01-8365-780078613776
version: 9
creation_date: '2023-06-15'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: Correlation
description: The following analytic identifies instances where three or more distinct registry modification events associated with MITRE ATT&CK Technique T1112 are detected. It leverages data from the Risk data model in Splunk, focusing on registry-related sources and MITRE technique annotations. This activity is significant because multiple registry modifications can indicate an attempt to persist, hide malicious configurations, or erase forensic evidence. If confirmed malicious, this behavior could allow attackers to maintain persistent access, execute malicious code, and evade detection, posing a severe threat to the integrity and security of the affected host.
data_source: []
search: |-
    | tstats `security_content_summariesonly` min(_time) as firstTime max(_time) as lastTime sum(All_Risk.calculated_risk_score) as risk_score, count(All_Risk.calculated_risk_score) as risk_event_count, values(All_Risk.annotations.mitre_attack.mitre_tactic_id) as annotations.mitre_attack.mitre_tactic_id, dc(All_Risk.annotations.mitre_attack.mitre_tactic_id) as mitre_tactic_id_count, values(All_Risk.annotations.mitre_attack.mitre_technique_id) as annotations.mitre_attack.mitre_technique_id, dc(All_Risk.annotations.mitre_attack.mitre_technique_id) as mitre_technique_id_count, values(All_Risk.tag) as tag, values(source) as source, dc(source) as source_count FROM datamodel=Risk.All_Risk
      WHERE source IN ("*registry*") All_Risk.annotations.mitre_attack.mitre_technique_id IN ("*T1112*")
      BY All_Risk.risk_object All_Risk.risk_object_type All_Risk.annotations.mitre_attack.mitre_tactic
    | `drop_dm_object_name(All_Risk)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | where source_count >= 3
    | `windows_modify_registry_risk_behavior_filter`
how_to_implement: Splunk Enterprise Security is required to utilize this correlation. In addition, modify the source_count value to your environment. In our testing, a count of 4 or 5 was decent in a lab, but the number may need to be increased base on internal testing. In addition, based on false positives, modify any analytics to be anomaly and lower or increase risk based on organization importance.
known_false_positives: False positives will be present based on many factors. Tune the correlation as needed to reduce too many triggers.
references:
    - https://www.splunk.com/en_us/blog/security/do-not-cross-the-redline-stealer-detections-and-analysis.html
    - https://www.splunk.com/en_us/blog/security/asyncrat-crusade-detections-and-defense.html
    - https://www.splunk.com/en_us/blog/security/from-registry-with-love-malware-registry-abuses.html
    - https://www.splunk.com/en_us/blog/security/-applocker-rules-as-defense-evasion-complete-analysis.html
finding:
    title: Windows Modify Registry Risk Behavior - $risk_object$
    entity:
        field: risk_object
        type: other
        score: 0
analytic_story:
    - Windows Registry Abuse
asset_type: Endpoint
mitre_attack_id:
    - T1112
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    min(_time) as firstTime
    max(_time) as lastTime
    sum(All_Risk.calculated_risk_score) as risk_score,
    count(All_Risk.calculated_risk_score) as risk_event_count,
    values(All_Risk.annotations.mitre_attack.mitre_tactic_id) as annotations.mitre_attack.mitre_tactic_id,
    dc(All_Risk.annotations.mitre_attack.mitre_tactic_id) as mitre_tactic_id_count,
    values(All_Risk.annotations.mitre_attack.mitre_technique_id) as annotations.mitre_attack.mitre_technique_id,
    dc(All_Risk.annotations.mitre_attack.mitre_technique_id) as mitre_technique_id_count,
    values(All_Risk.tag) as tag,
    values(source) as source,
    dc(source) as source_count
  FROM datamodel=Risk.All_Risk
  WHERE source IN ("*registry*") All_Risk.annotations.mitre_attack.mitre_technique_id IN ("*T1112*")
  BY All_Risk.risk_object All_Risk.risk_object_type All_Risk.annotations.mitre_attack.mitre_tactic

Stage 2: search

| `drop_dm_object_name(All_Risk)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: where

| where source_count >= 3

Stage 6: search

| `windows_modify_registry_risk_behavior_filter`

Indicators

These rows show field, operator, and value matches.

Windows Remote Management Execute Shell

#
Status
production
Severity
low
Group by
IntegrityLevel, command_line, computer_name, event_action, original_file_name, parent_command_line, parent_process_basename, parent_process_guid, parent_process_id, parent_process_name, process_basename, process_guid, process_hash, process_id, process_name, user, user_id, vendor_product
Author
Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

The following analytic detects the execution of winrshost.exe initiating CMD or PowerShell processes as part of a potential payload execution. winrshost.exe is associated with Windows Remote Management (WinRM) and is typically used for remote execution. By monitoring for this behavior, the detection identifies instances where winrshost.exe is leveraged to run potentially malicious commands or payloads via CMD or PowerShell. This behavior may indicate exploitation of remote management tools for unauthorized access or lateral movement within a compromised environment, signaling a potential security incident.

Known False Positives

  • administrator or power user can execute command shell or script remotely using WINRM.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows Remote Management Execute Shell
id: 28b80028-851d-4b8d-88a5-375ba115418a
version: 8
creation_date: '2023-04-12'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: Anomaly
description: The following analytic detects the execution of winrshost.exe initiating CMD or PowerShell processes as part of a potential payload execution. winrshost.exe is associated with Windows Remote Management (WinRM) and is typically used for remote execution. By monitoring for this behavior, the detection identifies instances where winrshost.exe is leveraged to run potentially malicious commands or payloads via CMD or PowerShell. This behavior may indicate exploitation of remote management tools for unauthorized access or lateral movement within a compromised environment, signaling a potential security incident.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
search: |-
    | tstats `security_content_summariesonly` min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes
      WHERE Processes.parent_process_name="winrshost.exe"
        AND
        Processes.process_name IN ("cmd.exe","*powershell*", "pwsh.exe")
      BY Processes.action Processes.dest Processes.original_file_name
         Processes.parent_process Processes.parent_process_exec Processes.parent_process_guid
         Processes.parent_process_id Processes.parent_process_name Processes.parent_process_path
         Processes.process Processes.process_exec Processes.process_guid
         Processes.process_hash Processes.process_id Processes.process_integrity_level
         Processes.process_name Processes.process_path Processes.user
         Processes.user_id Processes.vendor_product
    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_remote_management_execute_shell_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model. Use the Splunk Common Information Model (CIM) to normalize the field names and speed up the data modeling process.
known_false_positives: administrator or power user can execute command shell or script remotely using WINRM.
references:
    - https://strontic.github.io/xcyclopedia/library/winrshost.exe-6790044CEB4BA5BE6AA8161460D990FD.html
intermediate_findings:
    entities:
        - field: dest
          type: system
          score: 20
          message: a winrm remote proces [$parent_process_name$] execute [$process_name$] shell on [$dest$].
analytic_story:
    - Crypto Stealer
asset_type: Endpoint
mitre_attack_id:
    - T1021.006
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Processes
  WHERE Processes.parent_process_name="winrshost.exe"
    AND
    Processes.process_name IN ("cmd.exe","*powershell*", "pwsh.exe")
  BY
    Processes.action
    Processes.dest
    Processes.original_file_name
    Processes.parent_process
    Processes.parent_process_exec
    Processes.parent_process_guid
    Processes.parent_process_id
    Processes.parent_process_name
    Processes.parent_process_path
    Processes.process
    Processes.process_exec
    Processes.process_guid
    Processes.process_hash
    Processes.process_id
    Processes.process_integrity_level
    Processes.process_name
    Processes.process_path
    Processes.user
    Processes.user_id
    Processes.vendor_product

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_remote_management_execute_shell_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.parent_process_nameeq
  • winrshost.exe corpus 2 (elastic 1, splunk 1)
field:"parent_process_basename" kind:eq value:"winrshost.exe"
Processes.process_namein
  • *powershell*
  • cmd.exe corpus 24 (splunk 17, elastic 6, kusto 1)
  • pwsh.exe corpus 22 (splunk 19, elastic 3)
field:"process_basename" kind:in

Windows Shell Process from CrushFTP

#
Status
production
Severity
medium
Group by
IntegrityLevel, computer_name, event_action, original_file_name, parent_command_line, parent_process_guid, parent_process_id, parent_process_name, process_guid, process_hash, process_id, process_name, user, user_id, vendor_product
Author
Michael Haag, Splunk
Source
github.com/splunk/security_content

The following analytic identifies instances where CrushFTP's service process (crushftpservice.exe) spawns shell processes like cmd.exe or powershell.exe. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process creation events. This activity is significant because CrushFTP should not normally spawn interactive shell processes during regular operations. If confirmed malicious, this behavior could indicate successful exploitation of vulnerabilities like CVE-2025-31161, potentially allowing attackers to execute arbitrary commands with the privileges of the CrushFTP service.

Known False Positives

  • No false positives have been identified at this time.

MITRE ATT&CK Coverage

Telemetry Coverage

Rule Body

name: Windows Shell Process from CrushFTP
id: 459628e3-1b00-4e9b-9e5b-7da8961aea35
version: 7
creation_date: '2025-04-14'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: TTP
description: The following analytic identifies instances where CrushFTP's service process (crushftpservice.exe) spawns shell processes like cmd.exe or powershell.exe. This detection leverages data from Endpoint Detection and Response (EDR) agents, focusing on process creation events. This activity is significant because CrushFTP should not normally spawn interactive shell processes during regular operations. If confirmed malicious, this behavior could indicate successful exploitation of vulnerabilities like CVE-2025-31161, potentially allowing attackers to execute arbitrary commands with the privileges of the CrushFTP service.
data_source:
    - Sysmon EventID 1
    - Windows Event Log Security 4688
    - CrowdStrike ProcessRollup2
search: |-
    | tstats `security_content_summariesonly` count values(Processes.process_name) as process_name values(Processes.process) as process min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Processes
      WHERE Processes.parent_process_name=crushftpservice.exe
        AND
        `process_cmd`
        OR
        `process_powershell`
      BY Processes.dest Processes.parent_process Processes.original_file_name
         Processes.user Processes.action Processes.parent_process_exec
         Processes.parent_process_guid Processes.parent_process_id Processes.parent_process_path
         Processes.process_exec Processes.process_guid Processes.process_hash
         Processes.process_id Processes.process_integrity_level Processes.process_path
         Processes.user_id Processes.vendor_product
    | `drop_dm_object_name(Processes)`
    | `security_content_ctime(firstTime)`
    | `security_content_ctime(lastTime)`
    | `windows_shell_process_from_crushftp_filter`
how_to_implement: The detection is based on data that originates from Endpoint Detection and Response (EDR) agents. These agents are designed to provide security-related telemetry from the endpoints where the agent is installed. To implement this search, you must ingest logs that contain the process GUID, process name, and parent process. Additionally, you must ingest complete command-line executions. These logs must be processed using the appropriate Splunk Technology Add-ons that are specific to the EDR product. The logs must also be mapped to the `Processes` node of the `Endpoint` data model.
known_false_positives: No false positives have been identified at this time.
references:
    - https://nvd.nist.gov/vuln/detail/CVE-2025-31161
    - https://www.crushftp.com/crush11wiki/Wiki.jsp?page=Update
    - https://www.huntress.com/blog/crushftp-cve-2025-31161-auth-bypass-and-post-exploitation
finding:
    title: Possible CrushFTP exploitation detected on $dest$ related to CVE-2025-31161.
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - CrushFTP Vulnerabilities
asset_type: Endpoint
cve:
    - CVE-2025-31161
mitre_attack_id:
    - T1059.001
    - T1059.003
    - T1190
    - T1505
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: tstats

| tstats `security_content_summariesonly`
    count
    values(Processes.process_name) as process_name
    values(Processes.process) as process
    min(_time) as firstTime
    max(_time) as lastTime
  FROM datamodel=Endpoint.Processes
  WHERE Processes.parent_process_name=crushftpservice.exe
    AND
    `process_cmd`
    OR
    `process_powershell`
  BY
    Processes.dest
    Processes.parent_process
    Processes.original_file_name
    Processes.user
    Processes.action
    Processes.parent_process_exec
    Processes.parent_process_guid
    Processes.parent_process_id
    Processes.parent_process_path
    Processes.process_exec
    Processes.process_guid
    Processes.process_hash
    Processes.process_id
    Processes.process_integrity_level
    Processes.process_path
    Processes.user_id
    Processes.vendor_product

Stage 2: search

| `drop_dm_object_name(Processes)`

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `windows_shell_process_from_crushftp_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
Processes.original_file_nameeq
  • Cmd.Exe corpus 75 (sigma 43, splunk 17, elastic 15)
  • PowerShell.EXE corpus 134 (sigma 86, splunk 30, elastic 18)
  • powershell_ise.EXE corpus 52 (splunk 30, sigma 18, elastic 4)
  • pwsh.dll corpus 115 (sigma 81, splunk 30, elastic 4)
field:"OriginalFileName" kind:eq
Processes.parent_process_nameeq
  • crushftpservice.exe
field:"parent_process_basename" kind:eq value:"crushftpservice.exe"
Processes.process_nameeq
  • cmd.exe corpus 122 (elastic 93, splunk 29)
  • powershell.exe corpus 187 (elastic 140, splunk 44, kusto 3)
  • powershell_ise.exe corpus 53 (splunk 29, elastic 24)
  • pwsh.exe corpus 78 (elastic 49, splunk 29)
field:"process_basename" kind:eq

Back to all Splunk rules