Potential Persistence via Login Hook
editPotential Persistence via Login Hook
editIdentifies the creation or modification of the login window property list (plist). Adversaries may modify plist files to run a program during system boot or user login for persistence.
Rule type: query
Rule indices:
- logs-endpoint.events.*
Severity: medium
Risk score: 47
Runs every: 5m
Searches indices from: now-9m (Date Math format, see also Additional look-back time)
Maximum alerts per execution: 100
References:
Tags:
- Domain: Endpoint
- OS: macOS
- Use Case: Threat Detection
- Tactic: Persistence
- Data Source: Elastic Defend
- Resources: Investigation Guide
- Noise: High
- Performance: Normal
- Profile: Aggressive
- Rule Type: Custom Query (KQL)
- Platform: macOS
Version: 115
Rule authors:
- Elastic
Rule license: Elastic License v2
Investigation guide
editTriage and analysis
Disclaimer: This investigation guide was created using generative AI technology and has been reviewed to improve its accuracy and relevance. While every effort has been made to ensure its quality, we recommend validating the content and adapting it to suit your specific environment and operational needs.
Investigating Potential Persistence via Login Hook
The com.apple.loginwindow preferences domain controls login window behavior. It supports the deprecated LoginHook and LogoutHook keys, which run a script as root each time a user logs in or out. Hooks are typically set with sudo defaults write com.apple.loginwindow LoginHook <script>, which stores them in root’s preferences at /var/root/Library/Preferences/com.apple.loginwindow.plist. Adversaries can abuse these keys to execute a payload every time a user logs in. This rule alerts when a file named com.apple.loginwindow.plist is created or modified by a process other than common system, migration, backup, and management services.
Possible investigation steps
-
Identify the process that modified the plist (
process.executable,process.code_signature.*) and determine whether it is a recognized, signed system or management tool. Review the process’s execution event for its command line, for example adefaults writecommand. -
Review the file path (
file.path) to determine which copy was changed: root’s preferences (/var/root/Library/Preferences), the system-wide preferences (/Library/Preferences), or a user’s preferences (~/Library/Preferences). -
Inspect the current contents of the modified plist on the host (for example with
sudo plutil -p <file.path>) and look forLoginHookorLogoutHookentries referencing scripts or binaries in unusual locations. - If a hook is present, examine the referenced script or binary: its location, code signature, creation time, and content.
-
Review the process tree and recent activity of the modifying process for signs of initial access or execution, such as downloads, script interpreters, or
defaults writecommands. - Check whether the same process or user created other persistence mechanisms on the host, such as LaunchAgents, LaunchDaemons, or login items.
False positive analysis
- Device management solutions, configuration profiles, migration and backup tools may legitimately update login window preferences. Verify the modifying process against the tools approved in the environment.
-
Administrators or users changing login window options through System Settings or
defaultscan modify the plist. Confirm the change with the user if the modifying process is a known Apple or vendor binary. - When the activity is confirmed benign, add an exception for the specific signed process executable instead of excluding the plist file.
Response and remediation
- Isolate the affected host if a malicious login or logout hook is identified.
-
Remove the malicious hook (for example with
sudo defaults delete com.apple.loginwindow LoginHook), and delete the referenced script or binary after preserving a copy for analysis. - Terminate any running processes started by the malicious hook.
- If root’s or the system-wide plist was modified, investigate how the attacker obtained root privileges, and remediate the initial access vector.
- Reset the credentials of affected user accounts if compromise is confirmed.
- Escalate to the incident response team and search for the same plist modification or payload on other macOS hosts.
Setup
editSetup
This rule requires data coming in from Elastic Defend.
Elastic Defend Integration Setup
Elastic Defend is integrated into the Elastic Agent using Fleet. Upon configuration, the integration allows the Elastic Agent to monitor events on your host and send data to the Elastic Security app.
Prerequisite Requirements:
- Fleet is required for Elastic Defend.
- To configure Fleet Server refer to the documentation.
The following steps should be executed in order to add the Elastic Defend integration on a macOS System:
- Go to the Kibana home page and click "Add integrations".
- In the query bar, search for "Elastic Defend" and select the integration to see more details about it.
- Click "Add Elastic Defend".
- Configure the integration name and optionally add a description.
- Select the type of environment you want to protect, for MacOS it is recommended to select "Traditional Endpoints".
- Select a configuration preset. Each preset comes with different default settings for Elastic Agent, you can further customize these later by configuring the Elastic Defend integration policy. Helper guide.
- We suggest selecting "Complete EDR (Endpoint Detection and Response)" as a configuration setting, that provides "All events; all preventions"
- Enter a name for the agent policy in "New agent policy name". If other agent policies already exist, you can click the "Existing hosts" tab and select an existing policy instead. For more details on Elastic Agent configuration settings, refer to the helper guide.
- Click "Save and Continue".
- To complete the integration, select "Add Elastic Agent to your hosts" and continue to the next section to install the Elastic Agent on your hosts. For more details on Elastic Defend refer to the helper guide.
Rule query
editevent.category:file and host.os.type:macos and not event.type:"deletion" and file.name:"com.apple.loginwindow.plist" and not process.name: (systemmigrationd or DesktopServicesHelper or diskmanagementd or rsync or launchd or cfprefsd or xpcproxy or ManagedClient or MCXCompositor or backupd or "iMazing Profile Editor" or storagekitd or CloneKitService)
Framework: MITRE ATT&CKTM
-
Tactic:
- Name: Persistence
- ID: TA0003
- Reference URL: https://attack.mitre.org/tactics/TA0003/
-
Technique:
- Name: Boot or Logon Initialization Scripts
- ID: T1037
- Reference URL: https://attack.mitre.org/techniques/T1037/
-
Sub-technique:
- Name: Login Hook
- ID: T1037.002
- Reference URL: https://attack.mitre.org/techniques/T1037/002/
-
Technique:
- Name: Boot or Logon Autostart Execution
- ID: T1547
- Reference URL: https://attack.mitre.org/techniques/T1547/
-
Tactic:
- Name: Defense Evasion
- ID: TA0005
- Reference URL: https://attack.mitre.org/tactics/TA0005/
-
Technique:
- Name: Plist File Modification
- ID: T1647
- Reference URL: https://attack.mitre.org/techniques/T1647/