SOC Prime Bias: Critical

24 Nov 2025 12:15

NotDoor Insights: Deep Dive into Outlook Macros and Beyond

Author Photo
Ruslan Mikhalov Chief of Threat Research at SOC Prime linkedin icon Follow
NotDoor Insights: Deep Dive into Outlook Macros and Beyond
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Summary

This article examines the NotDoor backdoor, which abuses malicious Outlook VBA macros to maintain persistence and provide command-and-control. The payload is delivered via DLL sideloading of a tampered SSPICLI.dll that impersonates a legitimate OneDrive.exe binary. Obfuscated PowerShell scripts handle data exfiltration via webhook services and tweak Outlook registry settings to force macro execution. Detection guidance centers on tracking suspicious file creation, DLL loading activity, registry changes, and encoded PowerShell commands.

NotDoor Backdoor Analysis

Further analysis reveals that the rogue DLL creates a temporary directory, writes a payload into the Outlook VBAProject.OTM file, and configures registry keys to allow all macros. It then runs base64-encoded PowerShell instructions that issue DNS and HTTP callbacks to webhook.site and dnshook.site. Registry changes include enabling LoadMacroProviderOnBoot, lowering the Outlook security level, and modifying PONT_STRING to suppress security prompts.

Mitigation

Key mitigations include limiting DLL sideloading opportunities, enforcing code-signing requirements for executables, monitoring the creation of VBAProject.OTM by non-Outlook processes, and blocking outbound connections to the identified webhook domains. Additionally, teams can apply least-privilege principles to registry modifications and disable automatic macro loading wherever feasible.

Response

When NotDoor activity is detected, isolate the compromised endpoint, acquire the malicious DLL and related payloads, and perform a forensic review of registry edits and network traces. Block associated domains and IPs, launch a wider hunt for similar DLL sideloading behaviors, reset Outlook macro policies, and verify that all users’ security settings are brought back into a hardened state.

“`mermaid graph TB %% Class definitions classDef technique fill:#ffcc99 classDef tool fill:#cccccc classDef file fill:#e6e6fa classDef action fill:#99ccff classDef operator fill:#ff9900 %% Nodes – Actions / Techniques initial_access[“<b>Action</b> – Initial Access via existing foothold”] class initial_access action dll_sideload[“<b>Technique</b> – <b>T1574.001 Hijack Execution Flow: DLL</b><br/>OneDrive.exe loads malicious SSPICLI.dll via DLL sideloading”] class dll_sideload technique powershell[“<b>Technique</b> – <b>T1059.001 Command and Scripting Interpreter: PowerShell</b><br/>Base64‑encoded PowerShell commands executed for network checks and file copy”] class powershell technique office_macro[“<b>Technique</b> – <b>T1137.001 Office Application Startup: Office Template Macros</b><br/>VBA macro placed in %APPDATA%\\Microsoft\\Outlook\\VbaProject.OTM”] class office_macro technique vba_stomping[“<b>Technique</b> – <b>T1564.007 Hide Artifacts: VBA Stomping</b><br/>Macro monitors incoming mail (Application_NewMailEx) for C2 triggers and exfiltrates data”] class vba_stomping technique vb_interpreter[“<b>Technique</b> – <b>T1059.005 Command and Scripting Interpreter: Visual Basic</b><br/>VBA code executes commands and communicates via Outlook”] class vb_interpreter technique %% Nodes – Files / Objects file_oneDrive[“<b>File</b> – OneDrive.exe”] class file_oneDrive file file_sspicli[“<b>File</b> – SSPICLI.dll”] class file_sspicli file file_vba[“<b>File</b> – VbaProject.OTM”] class file_vba file email_monitor[“<b>Object</b> – Outlook Application<br/>Monitors incoming mail (Application_NewMailEx)”] class email_monitor action outlook_comm[“<b>Object</b> – Outlook<br/>Communicates C2 and exfiltrates data”] class outlook_comm action %% Connections – Flow of the attack initial_access –>|leads_to| dll_sideload dll_sideload –>|uses| file_oneDrive dll_sideload –>|loads| file_sspicli dll_sideload –>|triggers| powershell powershell –>|leads_to| office_macro office_macro –>|places| file_vba office_macro –>|enables| vba_stomping office_macro –>|enables| vb_interpreter vba_stomping –>|monitors| email_monitor vb_interpreter –>|communicates_via| outlook_comm “`

Attack Flow

Simulation Execution

Prerequisite: The Telemetry & Baseline Pre‑flight Check must have passed.

Rationale: This section details the precise execution of the adversary technique (TTP) designed to trigger the detection rule. The commands and narrative MUST directly reflect the TTPs identified and aim to generate the exact telemetry expected by the detection logic.

  • Attack Narrative & Commands:
    An attacker who has obtained user-level execution on the victim machine deploys the NotDoor malware. The malware’s goal is to ensure Outlook automatically loads a malicious macro on system startup, disables security warnings, and suppresses dialog pop‑ups. To achieve this, the attacker writes three specific registry values under the Outlook hive:

    1. LoadMacroProviderOnBoot set to 1 under HKCU\Software\Microsoft\Outlook â€“ forces Outlook to load the macro provider each boot.
    2. Level set to 1 under HKCU\Software\Microsoft\Outlook\Security â€“ lowers the macro security level.
    3. PONT_STRING set to a malicious CLSID under HKCU\Software\Microsoft\Outlook\Options\General â€“ points Outlook to the malicious macro DLL.

    These writes generate Registry‑Change events that satisfy selection1 and (selection2 or selection3) in the Sigma rule, causing the alert to fire.

  • Regression Test Script:

    # NotDoor registry modification simulation – PowerShell
    function Set-NotDoorOutlookRegistry {
        # 1. Enable macro provider on boot
        New-ItemProperty -Path "HKCU:\Software\Microsoft\Outlook" `
            -Name "LoadMacroProviderOnBoot" -Value 1 -PropertyType DWORD -Force
    
        # 2. Lower security warning level
        New-ItemProperty -Path "HKCU:\Software\Microsoft\Outlook\Security" `
            -Name "Level" -Value 1 -PropertyType DWORD -Force
    
        # 3. Point to malicious macro (simulated CLSID)
        $maliciousClsid = "{12345678-1234-1234-1234-123456789ABC}"
        New-ItemProperty -Path "HKCU:\Software\Microsoft\Outlook\Options\General" `
            -Name "PONT_STRING" -Value $maliciousClsid -PropertyType String -Force
    }
    
    # Execute the simulated attack
    Set-NotDoorOutlookRegistry
  • Cleanup Commands:

    # Remove the simulated NotDoor registry modifications
    Remove-ItemProperty -Path "HKCU:\Software\Microsoft\Outlook" `
        -Name "LoadMacroProviderOnBoot" -ErrorAction SilentlyContinue
    
    Remove-ItemProperty -Path "HKCU:\Software\Microsoft\Outlook\Security" `
        -Name "Level" -ErrorAction SilentlyContinue
    
    Remove-ItemProperty -Path "HKCU:\Software\Microsoft\Outlook\Options\General" `
        -Name "PONT_STRING" -ErrorAction SilentlyContinue