Has leveraged LoadLibrary to load DLLs.1
Shared Modules T1129
- Tactic
- Execution
- Platforms
- Linux, macOS, Windows
- Version
- 2.3
- Created
- 31 May 2017
- Last modified
- 24 October 2025
- Contributor
- Stefan Kanthak
Adversaries may execute malicious payloads via loading shared modules. Shared modules are executable files that are loaded into processes to provide access to reusable code, such as specific custom functions or invoking OS API functions (i.e., Native API).
Shared Modules MITRE reference T1129
1 group has been recorded using this technique. Newest first; each entry carries MITRE’s procedure text and a link to the group’s full record. Click a name to filter the rules below.
All 1 groups for this technique
21 software entries are documented implementing this technique. MITRE files each as a tool or as malware; newest first, then by how many groups carry them.
LightSpy's main executable and module .dylib binaries are loaded using a combination of dlopen() to load the library, _objc_getClass() to retrieve the class definition, and _objec_msgSend() to invoke/execute the specified method in the loaded class.1
Relied on the Java Instrumentation API and Javassist to dynamically modify Java code existing in memory.1
Uses dynamically linked shared libraries (.so files) to execute additional functionality using dlopen() and dlsym().1
Can use LoadLibrary to attempt to execute GdiPlus.dll.1
Can load DLLs.1
FoggyWeb's loader can call the load() function to load the FoggyWeb dll into an Application Domain on a compromised AD FS server.1
All 21 software entries for this technique · 6 newest in this preview
Offense vs defense T1129
Is defensive coverage keeping up with adversary use? Eight counts, each ranked against all 697 ATT&CK techniques. Attack sits left, defense right, so a shape leaning left means adversaries are better documented here than defenders are equipped. Hover any spoke for its percentile and the share of techniques that have more. The timeline below shows when each side arrived.
How it got here
Adversary activity (campaign spans) over cumulative rule output. Each source is plotted independently from zero, so neither line includes the other. Campaign dates are year-granularity.
Shared Modules detection strategy DET0018
MITRE names one behaviour worth catching for this technique and breaks it into 3 analytics, one per platform. Each carries the log sources it needs and the fields you tune per environment.
Behavior-chain, platform-aware detection strategy for T1129 Shared Modules
AN0052 · Windows
A process (often LOLBin or user-launched program) loads a DLL from a user-writable/UNC/Temp path or unsigned/invalid signer. Within a short window the DLL is (a) newly written to disk, (b) spawned as follow-on execution (rundll32/regsvr32), or (c) establishes outbound C2.
Log sources
The data this analytic draws on. You do not need every component — each one you already collect covers part of it. Each links to its ATT&CK record.
| Data component | Name | Channel |
|---|---|---|
| Module LoadDC0016 | WinEventLog:Sysmon | EventCode=7 |
| Process CreationDC0032 | WinEventLog:Security | EventCode=4688 |
| Process MetadataDC0034 | WinEventLog:Microsoft-Windows-CodeIntegrity/Operational | CodeIntegrity/WDAC events indicating unsigned/invalid DLL loads |
| File CreationDC0039 | WinEventLog:Sysmon | EventCode=11 |
| Network Connection CreationDC0082 | WinEventLog:Sysmon | EventCode=3, 22 |
Tunable fields
MITRE calls these the analytic’s mutable elements: the thresholds and filters you set for your own environment.
| Field | What you tune |
|---|---|
| TimeWindow | Correlation window between file write → module load → network (e.g., 0–20 minutes). |
| SuspiciousPathRegex | Regex for user-writable/UNC/temp paths to flag (e.g., %TEMP%, %APPDATA%, \\*\share\). |
| UnsignedOnly | Alert only when SignatureStatus != Valid to reduce noise. |
| RareSignerThreshold | Frequency threshold for unseen/rare signers in last N days. |
| MinFileSizeKB | Ignore tiny DLL stubs to cut noise. |
AN0053 · Linux
A process loads a shared object (.so) via dlopen/LD_PRELOAD/open from non-standard or temporary locations (e.g., /tmp, /dev/shm), especially shortly after that .so is written or fetched, or linked via manipulated environment variables (LD_PRELOAD/LD_LIBRARY_PATH).
Log sources
The data this analytic draws on. You do not need every component — each one you already collect covers part of it. Each links to its ATT&CK record.
| Data component | Name | Channel |
|---|---|---|
| Module LoadDC0016 | auditd:SYSCALL | openat/read/mmap: Open/mmap .so files from non-standard paths |
| Process CreationDC0032 | auditd:EXECVE | execve: Processes launched with LD_PRELOAD/LD_LIBRARY_PATH pointing to non-system dirs |
| Process MetadataDC0034 | linux:syslog | sudo or service accounts invoking loaders with suspicious env vars |
| Network Traffic ContentDC0085 | NSM:Flow | http/file-xfer: Inbound/outbound transfer of ELF shared objects |
Tunable fields
MITRE calls these the analytic’s mutable elements: the thresholds and filters you set for your own environment.
| Field | What you tune |
|---|---|
| SuspiciousDirs | (/tmp, /dev/shm, /var/tmp, user home dirs) – adjust to your environment. |
| TimeWindow | Correlate write/fetch of .so to its load (e.g., 0–30 minutes). |
| EnvVarWatchlist | LD_PRELOAD, LD_LIBRARY_PATH, LD_AUDIT. |
| AllowedSigning/HashList | Known-good signed or hashed shared objects. |
AN0054 · macOS
A process loads a non-system .dylib/.so via dyld (dlopen/dlsym) from user-writable locations (~/Library, /tmp) or after the library was recently created/downloaded, often followed by network egress or persistence.
Log sources
The data this analytic draws on. You do not need every component — each one you already collect covers part of it. Each links to its ATT&CK record.
| Data component | Name | Channel |
|---|---|---|
| Module LoadDC0016 | macos:unifiedlog | dyld/unified log entries indicating image load from non-system paths |
| Process CreationDC0032 | macos:endpointsecurity | exec: Process execution context for loaders calling dlopen/dlsym |
| File AccessDC0055 | macos:endpointsecurity | ES_EVENT_TYPE_NOTIFY_OPEN: Open of .dylib/.so in user-writable locations |
Tunable fields
MITRE calls these the analytic’s mutable elements: the thresholds and filters you set for your own environment.
| Field | What you tune |
|---|---|
| SuspiciousDirs | ~/Library, /tmp, /Users/*/.* (hidden dirs) – tune to enterprise layout. |
| UnsignedOnly | Alert only when code-signing is invalid or absent. |
| TimeWindow | Correlate write/open to module load within N minutes. |
Identify and block potentially malicious software executed through this technique by using application control tools capable of preventing unknown modules from being loaded.
| # | Test | Platform | Executor | Elevation | Prereqs | Cleanup | Ref | |||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 01 | ESXi - Install a custom VIB on an ESXi host | windows | cmd | — | 1 | Yes | ||||||||||||||||||||||||||||||||||||||
An adversary can maintain persistence within an ESXi host by installing malicious vSphere Installation Bundles (VIBs). Reference Input arguments
Attack command #{pscp_file} -pw #{vm_pass} #{vib_file} #{vm_user}@#{vm_host}:/tmp
echo "" | "#{plink_file}" "#{vm_host}" -ssh -l "#{vm_user}" -pw "#{vm_pass}" -m "#{vib_install}"
Cleanup command echo "" | "#{plink_file}" "#{vm_host}" -ssh -l "#{vm_user}" -pw "#{vm_pass}" -m "#{vib_remove}"
Prerequisite Check if plink and pscp are available. Check if (Test-Path "#{plink_file}") {exit 0} else {exit 1}
if (Test-Path "#{pscp_file}") {exit 0} else {exit 1}
Satisfy New-Item -Type Directory "PathToAtomicsFolder\..\ExternalPayloads\" -ErrorAction Ignore -Force | Out-Null Invoke-WebRequest "https://the.earth.li/~sgtatham/putty/latest/w64/plink.exe" -OutFile "PathToAtomicsFolder\..\ExternalPayloads\plink.exe" Invoke-WebRequest "https://the.earth.li/~sgtatham/putty/latest/w64/pscp.exe" -OutFile "PathToAtomicsFolder\..\ExternalPayloads\pscp.exe" GUID4d7f3c50-9ff7-40d2-8b28-e8a14c00b17f | ||||||||||||||||||||||||||||||||||||||||||||
Tests from Atomic Red Team (MIT licence) · technique definition