Detection rules › YARA-L

YARA-L rules: 0w

CurrentControlSet Autorun Keys Modification

#
Severity
medium
Time window
5m
Match by
hostname
Author
Victor Sergeev, Daniil Yugoslavskiy, Gleb Sukhodolskiy, Timur Zinniatullin, oscd.community, Tim Shelton, frack113 (split)
Source
github.com/chronicle/detection-rules

Detects modification of autostart extensibility point (ASEP) in registry

Known False Positives

  • Legitimate software automatically (mostly, during installation) sets up autorun keys for legitimate reason

MITRE ATT&CK Coverage

References

Telemetry Coverage

Rule Body

// Copyright 2025 Google LLC. Licensed under Apache-2.0.

rule currentcontrolset_autorun_keys_modification {

  meta:
    author = "Victor Sergeev, Daniil Yugoslavskiy, Gleb Sukhodolskiy, Timur Zinniatullin, oscd.community, Tim Shelton, frack113 (split)"
    description = "Detects modification of autostart extensibility point (ASEP) in registry"
    reference = "https://github.com/SigmaHQ/sigma/blob/master/rules/windows/registry/registry_set/registry_set_asep_reg_keys_modification_currentcontrolset.yml"
    license = "https://github.com/SigmaHQ/Detection-Rule-License/blob/main/LICENSE.Detection.Rules.md"
    rule_name = "CurrentControlSet Autorun Keys Modification"
    rule_id = "mr_701ab297-b615-4441-a78b-941c9737d117"
    sigma_uuid = "f674e36a-4b91-431e-8aef-f8a96c2aca35"
    sigma_status = "test"
    tactic = "TA0003"
    technique = "T1547.001"
    data_source = "Sysmon Windows Registry"
    platform = "Windows"
    severity = "Medium"
    priority = "Medium"
    false_positives = "Legitimate software automatically (mostly, during installation) sets up autorun keys for legitimate reason"

  events:
    $reg.metadata.event_type = "REGISTRY_MODIFICATION"
    strings.contains(strings.to_lower($reg.target.registry.registry_key), "\\system\\currentcontrolset\\control") and
    (
        strings.contains(strings.to_lower($reg.target.registry.registry_key), "\\terminal server\\winstations\\rdp-tcp\\initialprogram") or
        strings.contains(strings.to_lower($reg.target.registry.registry_key), "\\terminal server\\wds\\rdpwd\\startupprograms") or
        strings.contains(strings.to_lower($reg.target.registry.registry_key), "\\securityproviders\\securityproviders") or
        strings.contains(strings.to_lower($reg.target.registry.registry_key), "\\safeboot\\alternateshell") or
        strings.contains(strings.to_lower($reg.target.registry.registry_key), "\\print\\providers") or
        strings.contains(strings.to_lower($reg.target.registry.registry_key), "\\print\\monitors") or
        strings.contains(strings.to_lower($reg.target.registry.registry_key), "\\networkprovider\\order") or
        strings.contains(strings.to_lower($reg.target.registry.registry_key), "\\lsa\\notification packages") or
        strings.contains(strings.to_lower($reg.target.registry.registry_key), "\\lsa\\authentication packages") or
        strings.contains(strings.to_lower($reg.target.registry.registry_key), "\\bootverificationprogram\\imagepath")
    )
    not (
            $reg.target.registry.registry_value_data = "(Empty)" or
            (
                $reg.principal.process.file.full_path = "c:\\windows\\system32\\spoolsv.exe" nocase and
                strings.contains(strings.to_lower($reg.target.registry.registry_key), "\\print\\monitors\\cutepdf writer monitor") and
                (
                    $reg.target.registry.registry_value_data = "cpwmon64_v40.dll" nocase or
                    $reg.target.registry.registry_value_data = "CutePDF Writer" nocase
                )
            ) or
            (
                $reg.principal.process.file.full_path = "c:\\windows\\system32\\spoolsv.exe" nocase and
                strings.contains(strings.to_lower($reg.target.registry.registry_key), "print\\monitors\\appmon\\ports\\microsoft.office.onenote_") and
                (
                    strings.contains(strings.to_upper($reg.principal.user.userid), "AUTHORI") or
                    strings.contains(strings.to_upper($reg.principal.user.userid), "AUTORI")
                )
            ) or
            (
                $reg.principal.process.file.full_path = "c:\\windows\\system32\\poqexec.exe" nocase and
                re.regex($reg.target.registry.registry_key, `\\networkprovider\\order\\providerorder$`) nocase
            ) or
            (
                $reg.principal.process.file.full_path = "c:\\windows\\system32\\spoolsv.exe" nocase and
                re.regex($reg.target.registry.registry_key, `\\print\\monitors\\monvnc\\driver$`) nocase and
                $reg.target.registry.registry_value_data = "VNCpm.dll" nocase
            )
    )

    $reg.principal.hostname = $hostname

  match:
    $hostname over 5m

  outcome:
    //example usage of specifying test user and hostname to adjust risk score
    $risk_score = max(if($reg.principal.user.userid = "user" and $reg.principal.hostname = "hostname", 0, 15))
    $principal_hostname = array_distinct($reg.principal.hostname)
    $principal_process_pid = array_distinct($reg.principal.process.pid)
    $principal_process_file_full_path = array_distinct($reg.principal.process.file.full_path)
    $principal_process_product_specific_process_id = array_distinct($reg.principal.process.product_specific_process_id)
    $principal_user_userid = array_distinct($reg.principal.user.userid)
    $target_registry_key = array_distinct($reg.target.registry.registry_key)
    $target_registry_value_data = array_distinct($reg.target.registry.registry_value_data)
    $log_type = array_distinct(strings.concat($reg.metadata.log_type,"/",$reg.metadata.product_event_type))

  condition:
    $reg
}

YARA-L Rule Structure

Condition

Fires when at least one $reg event in the 5m window.

Events

$reg REGISTRY_MODIFICATION (13, 4657)

  • target.registry.registry_key contains "\system\currentcontrolset\control"
  • target.registry.registry_key contains "\terminal server\winstations\rdp-tcp\initialprogram"
  • target.registry.registry_key contains "\terminal server\wds\rdpwd\startupprograms"
  • target.registry.registry_key contains "\securityproviders\securityproviders"
  • target.registry.registry_key contains "\safeboot\alternateshell"
  • target.registry.registry_key contains "\print\providers"
  • target.registry.registry_key contains "\print\monitors"
  • target.registry.registry_key contains "\networkprovider\order"
  • target.registry.registry_key contains "\lsa\notification packages"
  • target.registry.registry_key contains "\lsa\authentication packages"
  • target.registry.registry_key contains "\bootverificationprogram\imagepath"
  • target.registry.registry_value_data = "(Empty)"
  • principal.process.file.full_path = "c:\windows\system32\spoolsv.exe"
  • target.registry.registry_key contains "\print\monitors\cutepdf writer monitor"
  • target.registry.registry_value_data = "cpwmon64_v40.dll" or "CutePDF Writer"
  • principal.process.file.full_path = "c:\windows\system32\spoolsv.exe"
  • target.registry.registry_key contains "print\monitors\appmon\ports\microsoft.office.onenote_"
  • principal.user.userid contains "AUTHORI"
  • principal.user.userid contains "AUTORI"
  • principal.process.file.full_path = "c:\windows\system32\poqexec.exe"
  • target.registry.registry_key matches "\\networkprovider\\order\\providerorder$"
  • principal.process.file.full_path = "c:\windows\system32\spoolsv.exe"
  • target.registry.registry_key matches "\\print\\monitors\\monvnc\\driver$"
  • target.registry.registry_value_data = "VNCpm.dll"

Match and Correlation

Match key
$hostname (principal.hostname)
Within
5m

Outcome

Outcome variables add context to a detection. When the rule generates an alert, $risk_score is displayed with it.

FieldExpression
risk_scoremax(if($reg.principal.user.userid = "user" and $reg.principal.hostname = "hostname", 0, 15))
principal_hostnamearray_distinct($reg.principal.hostname)
principal_process_pidarray_distinct($reg.principal.process.pid)
principal_process_file_full_patharray_distinct($reg.principal.process.file.full_path)
principal_process_product_specific_process_idarray_distinct($reg.principal.process.product_specific_process_id)
principal_user_useridarray_distinct($reg.principal.user.userid)
target_registry_keyarray_distinct($reg.target.registry.registry_key)
target_registry_value_dataarray_distinct($reg.target.registry.registry_value_data)
log_typearray_distinct(strings.concat($reg.metadata.log_type,"/",$reg.metadata.product_event_type))

Potential Credential Dumping Activity Via LSASS

#
Severity
medium
Type
Detection
Time window
5m
Match by
hostname
Author
Samir Bousseaden, Michael Haag
Source
github.com/chronicle/detection-rules

Detects process access requests to the LSASS process with specific call trace calls and access masks. This behaviour is expressed by many credential dumping tools such as Mimikatz, NanoDump, Invoke-Mimikatz, Procdump and even the Taskmgr dumping feature.

Known False Positives

  • Unknown

MITRE ATT&CK Coverage

TacticTechniques
Credential Access

References

Telemetry Coverage

ProviderRecord / event type
SysmonEvent ID 10: ProcessAccess

Rule Body

// Copyright 2025 Google LLC. Licensed under Apache-2.0.

rule potential_credential_dumping_activity_via_lsass {

  meta:
    author = "Samir Bousseaden, Michael Haag"
    description = "Detects process access requests to the LSASS process with specific call trace calls and access masks. This behaviour is expressed by many credential dumping tools such as Mimikatz, NanoDump, Invoke-Mimikatz, Procdump and even the Taskmgr dumping feature."
    reference = "https://github.com/SigmaHQ/sigma/blob/master/rules/windows/process_access/proc_access_win_lsass_memdump.yml"
    license = "https://github.com/SigmaHQ/Detection-Rule-License/blob/main/LICENSE.Detection.Rules.md"
    rule_name = "Potential Credential Dumping Activity Via LSASS"
    sigma_uuid = "5ef9853e-4d0e-4a70-846f-a9ca37d876da"
    sigma_status = "experimental"
    rule_id = "mr_33474568-9a0a-4588-ba79-144ab7908f8e"
    tactic = "TA0006"
    technique = "T1003.001"
    type = "Detection"
    data_source = "Sysmon"
    platform = "Windows"
    severity = "Medium"
    priority = "Medium"
    false_positives = "Unknown"

  events:
    $process.metadata.event_type = "PROCESS_OPEN"
    re.regex($process.target.process.file.full_path, `\\lsass\.exe$`) nocase
    (
        strings.contains(strings.to_lower($process.target.resource.name), "0x1038") or
        strings.contains(strings.to_lower($process.target.resource.name), "0x1438") or
        strings.contains(strings.to_lower($process.target.resource.name), "0x143a") or
        strings.contains(strings.to_lower($process.target.resource.name), "0x1fffff") //questionable, this one and others have been filtered out due to FP
    )
    (
        strings.contains(strings.to_lower($process.additional.fields["CallTrace"]), "dbgcore.dll") or
        strings.contains(strings.to_lower($process.additional.fields["CallTrace"]), "dbghelp.dll") or
        strings.contains(strings.to_lower($process.additional.fields["CallTrace"]), "kernel32.dll") or
        strings.contains(strings.to_lower($process.additional.fields["CallTrace"]), "kernelbase.dll") or
        strings.contains(strings.to_lower($process.additional.fields["CallTrace"]), "ntdll.dll")
    )
    NOT (
            strings.contains($process.principal.administrative_domain, "AUTHORI") or
            strings.contains($process.principal.administrative_domain, "AUTORI")
        )
    NOT (
        strings.contains(strings.to_lower($process.additional.fields["CallTrace"]), ":\\windows\\temp\\asgard2-agent\\") and
        strings.contains(strings.to_lower($process.additional.fields["CallTrace"]), "\\thor\\thor64.exe+") and
        strings.contains(strings.to_upper($process.additional.fields["CallTrace"]), "|UNKNOWN(") and
        $process.target.resource.name = "0x103800" nocase
        )
    NOT re.regex($process.principal.process.file.full_path, `:\\Windows\\Sysmon64\.exe$`) nocase
    $process.principal.hostname = $hostname

  match:
    $hostname over 5m

  outcome:
    //example usage of specifying test hostname to adjust risk score
    $risk_score = max(if($process.principal.hostname = "hostname", 0, 15))
    $principal_process_pid = array_distinct($process.principal.process.pid)
    $principal_process_command_line = array_distinct($process.principal.process.command_line)
    $principal_process_file_sha256 = array_distinct($process.principal.process.file.sha256)
    $principal_process_file_full_path = array_distinct($process.principal.process.file.full_path)
    $principal_process_product_specfic_process_id = array_distinct($process.principal.process.product_specific_process_id)
    $principal_process_parent_process_product_specfic_process_id = array_distinct($process.principal.process.parent_process.product_specific_process_id)
    $target_process_pid = array_distinct($process.target.process.pid)
    $target_process_command_line = array_distinct($process.target.process.command_line)
    $target_process_file_sha256 = array_distinct($process.target.process.file.sha256)
    $target_process_file_full_path = array_distinct($process.target.process.file.full_path)
    $target_process_product_specfic_process_id = array_distinct($process.target.process.product_specific_process_id)
    $log_type = array_distinct(strings.concat($process.metadata.log_type,"/",$process.metadata.product_event_type))

  condition:
    $process
}

YARA-L Rule Structure

Condition

Fires when at least one $process event in the 5m window.

Events

$process PROCESS_OPEN (10)

  • target.process.file.full_path matches "\\lsass\.exe$"
  • target.resource.name contains "0x1038"
  • target.resource.name contains "0x1438"
  • target.resource.name contains "0x143a"
  • target.resource.name contains "0x1fffff"
  • additional.fields["CallTrace"] contains "dbgcore.dll"
  • additional.fields["CallTrace"] contains "dbghelp.dll"
  • additional.fields["CallTrace"] contains "kernel32.dll"
  • additional.fields["CallTrace"] contains "kernelbase.dll"
  • additional.fields["CallTrace"] contains "ntdll.dll"
  • principal.administrative_domain contains "AUTHORI"
  • principal.administrative_domain contains "AUTORI"
  • additional.fields["CallTrace"] contains ":\windows\temp\asgard2-agent\"
  • additional.fields["CallTrace"] contains "\thor\thor64.exe+"
  • additional.fields["CallTrace"] contains "|UNKNOWN("
  • target.resource.name = "0x103800"
  • principal.process.file.full_path matches ":\\Windows\\Sysmon64\.exe$"

Match and Correlation

Match key
$hostname (principal.hostname)
Within
5m

Outcome

Outcome variables add context to a detection. When the rule generates an alert, $risk_score is displayed with it.

FieldExpression
risk_scoremax(if($process.principal.hostname = "hostname", 0, 15))
principal_process_pidarray_distinct($process.principal.process.pid)
principal_process_command_linearray_distinct($process.principal.process.command_line)
principal_process_file_sha256array_distinct($process.principal.process.file.sha256)
principal_process_file_full_patharray_distinct($process.principal.process.file.full_path)
principal_process_product_specfic_process_idarray_distinct($process.principal.process.product_specific_process_id)
principal_process_parent_process_product_specfic_process_idarray_distinct($process.principal.process.parent_process.product_specific_process_id)
target_process_pidarray_distinct($process.target.process.pid)
target_process_command_linearray_distinct($process.target.process.command_line)
target_process_file_sha256array_distinct($process.target.process.file.sha256)
target_process_file_full_patharray_distinct($process.target.process.file.full_path)
target_process_product_specfic_process_idarray_distinct($process.target.process.product_specific_process_id)
log_typearray_distinct(strings.concat($process.metadata.log_type,"/",$process.metadata.product_event_type))

Back to all YARA-L rules