T1546.010 Google Chronicle · YARA-L

Detect AppInit DLLs in Google Chronicle

Adversaries may establish persistence and/or elevate privileges by executing malicious content triggered by AppInit DLLs loaded into processes. Dynamic-link libraries (DLLs) that are specified in the AppInit_DLLs value in the Registry keys HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows or HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows are loaded by user32.dll into every process that loads user32.dll. In practice, this is nearly every desktop process (GUI applications). This Registry-based injection mechanism has been used by multiple APT groups and crimeware families including Flame, FinFisher, and others.

MITRE ATT&CK

Tactic
Privilege Escalation Persistence
Technique
T1546 Event Triggered Execution
Sub-technique
T1546.010 AppInit DLLs
Canonical reference
https://attack.mitre.org/techniques/T1546/010/

YARA-L Detection Query

Google Chronicle (YARA-L)
yaral
rule appinit_dll_persistence_t1546_010 {
  meta:
    author = "Argus Detection Engineering"
    description = "Detects AppInit DLL persistence mechanism via registry modification (T1546.010). Covers suspicious DLL path injection, enabling of AppInit loading, and disabling of signature enforcement."
    mitre_attack_tactic = "Persistence, Privilege Escalation"
    mitre_attack_technique = "T1546.010"
    severity = "HIGH"
    confidence = "HIGH"
    platform = "Windows"
    reference = "https://attack.mitre.org/techniques/T1546/010/"

  events:
    $e.metadata.event_type = "REGISTRY_MODIFICATION"
    (
      re.regex($e.target.registry.registry_key,
        `(?i)SOFTWARE\\(Wow6432Node\\)?Microsoft\\Windows NT\\CurrentVersion\\Windows$`) or
      re.regex($e.target.registry.registry_key,
        `(?i)HKEY_LOCAL_MACHINE\\SOFTWARE\\(Wow6432Node\\)?Microsoft\\Windows NT\\CurrentVersion\\Windows$`)
    )
    re.regex($e.target.registry.registry_value_name,
      `(?i)^(AppInit_DLLs|LoadAppInit_DLLs|RequireSignedAppInit_DLLs)$`)
    (
      (
        re.regex($e.target.registry.registry_value_name, `(?i)^AppInit_DLLs$`) and
        $e.target.registry.registry_value_data != "" and
        not re.regex($e.target.registry.registry_value_data, `(?i)(system32|syswow64)`)
      ) or
      (
        re.regex($e.target.registry.registry_value_name, `(?i)^LoadAppInit_DLLs$`) and
        $e.target.registry.registry_value_data = "1"
      ) or
      (
        re.regex($e.target.registry.registry_value_name, `(?i)^RequireSignedAppInit_DLLs$`) and
        $e.target.registry.registry_value_data = "0"
      )
    )

  condition:
    $e
}
high severity high confidence

YARA-L 2.0 rule detecting T1546.010 AppInit DLL persistence via UDM registry modification events. Three detection branches: (1) AppInit_DLLs set to a non-system path indicating malicious DLL injection, (2) LoadAppInit_DLLs enabled to activate the injection mechanism, (3) RequireSignedAppInit_DLLs disabled to permit unsigned DLL loading. Covers both HKLM 64-bit and Wow6432Node 32-bit registry hives.

Data Sources

Windows Event Log (Sysmon Registry Events)Google Chronicle UDM Registry Events

Required Tables

UDM Events (REGISTRY_MODIFICATION)

False Positives & Tuning

  • Administrative tooling or GPO configurations that legitimately manage AppInit_DLLs values across a fleet, generating expected modification events from SYSTEM or trusted admin accounts
  • Application compatibility fixes or shims installed by Windows Assessment and Deployment Kit (ADK) tools that set AppInit_DLLs values for legacy software support
  • Security monitoring products (e.g., older versions of some EDR agents) that register themselves in AppInit_DLLs for process-level visibility
Download portable Sigma rule (.yml)

Other platforms for T1546.010


Testing Methodology

Validate this detection against 3 adversary techniques from Atomic Red Team. Each test below lists the behaviour to exercise and the telemetry you should expect to see. Executable commands and cleanup steps are available with Pro.

  1. Test 1Register DLL in AppInit_DLLs and Enable Loading

    Expected signal: Three Sysmon Event ID 13 records: (1) AppInit_DLLs set to C:\Users\Public\argus_appinit.dll, (2) LoadAppInit_DLLs set to 1, (3) RequireSignedAppInit_DLLs set to 0. The combination of all three changes in a short time window is a high-confidence indicator.

  2. Test 2Enable AppInit Loading Without DLL Path

    Expected signal: Sysmon Event ID 13: TargetObject contains Windows NT\CurrentVersion\Windows\LoadAppInit_DLLs, Details=1. This single-value change is an intermediate persistence indicator.

  3. Test 3Audit Current AppInit_DLLs State

    Expected signal: Process creation for reg.exe (multiple times) querying AppInit keys. Read-only — no modifications. Use this as a scheduled hunt query to detect pre-existing AppInit DLL registrations.

Unlock Pro Content

Get the full detection package for T1546.010 including response playbook, investigation guide, and atomic red team tests.

Response PlaybookInvestigation GuideHunting QueriesAtomic Red Team TestsTuning Guidance

Related Detections