Detection rules › Splunk

Windows AppLocker Rare Application Launch Detection

Status
production
Group by
FullFilePath, dest, user
Author
Michael Haag, Splunk
Source
github.com/splunk/security_content

The following analytic detects the launch of rarely used applications within the environment, which may indicate the use of potentially malicious software or tools by attackers. It leverages Windows AppLocker event logs, aggregating application launch counts over time and flagging those that significantly deviate from the norm. This behavior is significant as it helps identify unusual application activity that could signal a security threat. If confirmed malicious, this activity could allow attackers to execute unauthorized code, potentially leading to further compromise of the system.

MITRE ATT&CK coverage

Rule body splunk

name: Windows AppLocker Rare Application Launch Detection
id: 9556f7b7-285f-4f18-8eeb-963d989f9d27
version: 7
creation_date: '2024-04-17'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: Hunting
description: The following analytic detects the launch of rarely used applications within the environment, which may indicate the use of potentially malicious software or tools by attackers. It leverages Windows AppLocker event logs, aggregating application launch counts over time and flagging those that significantly deviate from the norm. This behavior is significant as it helps identify unusual application activity that could signal a security threat. If confirmed malicious, this activity could allow attackers to execute unauthorized code, potentially leading to further compromise of the system.
data_source: []
search: |-
    `applocker`
      | spath input=UserData_Xml
      | rename RuleAndFileData.* as *, Computer as dest, TargetUser AS user
      | stats dc(_time) as days, count
        BY FullFilePath dest user
      | eventstats avg(count) as avg, stdev(count) as stdev
      | eval upperBound=(avg+stdev*3), lowerBound=(avg-stdev*3)
      | where count > upperBound OR count < lowerBound
      | `windows_applocker_rare_application_launch_detection_filter`
how_to_implement: The analytic is designed to be run against Windows AppLocker event logs collected from endpoints with AppLocker enabled. If using Microsoft Defender for Endpoint (MDE), modify the analytic to use EventTypes/ActionTypes that match the block events for AppLocker. The analytic requires the AppLocker event logs to be ingested into Splunk. Note that, an additional method to reduce any false positives would be to add the specific EventCodes - 8003 or 8004 and filter from there.
known_false_positives: False positives are possible if legitimate users are launching applications that are not permitted by AppLocker. It is recommended to investigate the context of the application launch to determine if it is malicious or not. Modify the threshold as needed to reduce false positives.
references:
    - https://learn.microsoft.com/en-us/windows/security/application-security/application-control/windows-defender-application-control/applocker/using-event-viewer-with-applocker
    - https://learn.microsoft.com/en-us/windows/security/application-security/application-control/windows-defender-application-control/operations/querying-application-control-events-centrally-using-advanced-hunting
analytic_story:
    - Windows AppLocker
asset_type: Endpoint
mitre_attack_id:
    - T1218
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint
tests:
    - name: True Positive Test
      attack_data:
        - data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1562/applocker/applocker.log
          sourcetype: XmlWinEventLog
          source: XmlWinEventLog:Microsoft-Windows-AppLocker/MSI and Script
      test_type: unit

Stages and Predicates

Stage 1: search

`applocker`

Stage 2: spath

| spath input=UserData_Xml

Stage 3: rename

| rename RuleAndFileData.* as *, Computer as dest, TargetUser AS user

Stage 4: stats

| stats dc(_time) as days, count
    BY FullFilePath dest user

Stage 5: eventstats

| eventstats avg(count) as avg, stdev(count) as stdev

Stage 6: eval

| eval upperBound=(avg+stdev*3), lowerBound=(avg-stdev*3)

Stage 7: where

| where count > upperBound OR count < lowerBound

Stage 8: search

| `windows_applocker_rare_application_launch_detection_filter`