Detect XPC Services in CrowdStrike LogScale
Adversaries may abuse macOS XPC (Cross-Process Communication) services to execute malicious code with elevated privileges. XPC services provide privilege separation between application components, with helper daemons running as root under launchd. Applications communicate with these daemons using the low-level XPC C API or the NSXPCConnection API. When XPC services fail to properly validate client identity (via audit token checks) or sanitize input parameters, adversaries can send crafted messages to execute arbitrary code in the context of the privileged daemon. This technique has been exploited in the wild via CVE-2021-30724 targeting Apple's CVMServer (com.apple.cvmsServ), and is frequently combined with T1068 (Exploitation for Privilege Escalation) to achieve root-level code execution from an unprivileged user context.
MITRE ATT&CK
- Tactic
- Execution
- Technique
- T1559 Inter-Process Communication
- Sub-technique
- T1559.003 XPC Services
- Canonical reference
- https://attack.mitre.org/techniques/T1559/003/
LogScale Detection Query
// T1559.003 - XPC Services Abuse Detection (macOS via CrowdStrike Falcon FDR)
// Branch 1: launchd spawning suspicious scripting interpreters
(
#event_simpleName = ProcessRollup2
| event_platform = Mac
| ParentBaseFileName = launchd
| FileName = /^(bash|sh|zsh|python3?|ruby|perl|osascript|curl|wget|ncat?|php)$/
| DetectionBranch := "launchd_spawned_interpreter"
| RiskScore := 75
)
// Union with Branch 2 & 3: Unauthorized writes to XPC service and privileged helper paths
| union {
#event_simpleName = PlatformEvents
| event_platform = Mac
| OperationType in (values=["FILE_CREATE", "FILE_OPEN_WRITE"])
| TargetFilePath = /(Library\/PrivilegedHelperTools|Library\/LaunchDaemons|XPCServices)/
| TargetFilePath = /\.(plist|dylib|xpc)$/
| not ParentBaseFileName in (
values=["Installer", "pkgd", "softwareupdate", "mdmclient",
"jamf", "santa", "osinstallersetupd", "falcond"]
)
| DetectionBranch := case {
TargetFilePath = /PrivilegedHelperTools/ => "privileged_helper_modification";
TargetFilePath = /LaunchDaemons/ => "launch_daemon_modification";
TargetFilePath = /XPCServices/ => "xpc_service_bundle_modification";
* => "xpc_path_modification"
}
| RiskScore := case {
DetectionBranch = "privileged_helper_modification" => 85;
DetectionBranch = "launch_daemon_modification" => 70;
DetectionBranch = "xpc_service_bundle_modification" => 55;
* => 40
}
}
| table(
[_time, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName,
TargetFilePath, DetectionBranch, RiskScore]
)
| sort(field=RiskScore, order=desc) CrowdStrike LogScale (Falcon Data Replicator) query detecting T1559.003 XPC Services abuse on macOS endpoints running the Falcon sensor. Branch 1 uses ProcessRollup2 events filtered to event_platform=Mac to identify launchd spawning scripting interpreters in the daemon execution context. Branches 2 and 3 use PlatformEvents to detect unauthorized file creation or write operations targeting plist, dylib, and XPC bundle files in /Library/PrivilegedHelperTools, /Library/LaunchDaemons, and XPCServices directories by non-allowlisted processes. Risk scores are assigned per detection branch.
Data Sources
Required Tables
False Positives & Tuning
- CrowdStrike Falcon sensor self-updates or response action deployments where internal Falcon processes write updated XPC service bundles or launchd plist files to managed directories during sensor version upgrades, if the internal process name differs from falcond
- Legitimate macOS developer workflows where Xcode instruments, lldb, or Simulator services cause launchd to spawn shell interpreters as debug helper processes during automated UI testing, scheme execution, or continuous integration runs on developer machines
- Enterprise backup and data protection agents (Acronis Cyber Protect, Veeam Agent for Mac, Druva inSync) that install or rotate privileged helper tools at runtime using installer wrapper processes with names not covered by the exclusion value list
Other platforms for T1559.003
Testing Methodology
Validate this detection against 4 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.
- Test 1XPC Service and Privileged Helper Enumeration
Expected signal: MDE DeviceProcessEvents: launchctl spawned multiple times with 'list' argument, parent = shell (bash/zsh). osquery process_events: launchctl and ls executions with enumeration arguments. File creation event for /tmp/df00tech_xpc_services.txt in MDE DeviceFileEvents and osquery file_events.
- Test 2Malicious LaunchDaemon XPC Service Registration
Expected signal: MDE DeviceFileEvents: FileCreated for /Library/LaunchDaemons/com.df00tech.test.xpcservice.plist by the test process (InitiatingProcessFileName=cp or sudo). osquery file_events: target_path=/Library/LaunchDaemons/com.df00tech.test.xpcservice.plist, action=CREATED. MDE DeviceProcessEvents: launchd spawning /bin/sh with the touch/echo command. macOS Unified Log: launchd registering service label 'com.df00tech.test.xpcservice' and subsequent execution.
- Test 3Privileged Helper Tool Tampering Simulation
Expected signal: MDE DeviceFileEvents: FileCreated action for /Library/PrivilegedHelperTools/com.df00tech.test.backdoor.helper, InitiatingProcessFileName=sudo or touch. osquery file_events: target_path=/Library/PrivilegedHelperTools/com.df00tech.test.backdoor.helper, action=CREATED, process_name=touch. macOS Unified Log: filesystem write event at the PrivilegedHelperTools path. codesign invocation captured in process events.
- Test 4XPC Client Connection Simulation via Python
Expected signal: MDE DeviceProcessEvents: python3 spawned with inline script via shell. osquery process_events: python3 execution with cmdline containing 'subprocess', parent=bash/zsh. launchctl subprocess spawns visible as child process events. If this test is run from a launchd context (e.g., via a cron job registered with launchd), the 'launchd_spawned_interpreter' detection branch fires with python3 as the spawned interpreter.
References (10)
- https://attack.mitre.org/techniques/T1559/003/
- https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html
- https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/DesigningDaemons.html
- https://www.trendmicro.com/en_us/research/21/f/CVE-2021-30724_CVMServer_Vulnerability_in_macOS_and_iOS.html
- https://wojciechregula.blog/post/learn-xpc-exploitation-part-3-code-injections/
- https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/
- https://developer.apple.com/documentation/xpc
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1559.003/T1559.003.md
- https://www.uptycs.com/blog/macos-privilege-escalation-via-xpc-services
- https://objective-see.org/blog/blog_0x4C.html
Unlock Pro Content
Get the full detection package for T1559.003 including response playbook, investigation guide, and atomic red team tests.