Skip to content

Commit 7a48cea

Browse files
roikolrafaeldtinoco
authored andcommitted
signature: add ld_preload.go sig
1 parent 6885524 commit 7a48cea

File tree

4 files changed

+432
-0
lines changed

4 files changed

+432
-0
lines changed

signatures/golang/export.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ var ExportedSignatures = []detect.Signature{
1212
&ProcMemCodeInjection{},
1313
&DockerAbuse{},
1414
&ScheduledTaskModification{},
15+
&LdPreload{},
1516
}

signatures/golang/ld_preload.go

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
7+
"github.com/aquasecurity/tracee/signatures/helpers"
8+
"github.com/aquasecurity/tracee/types/detect"
9+
"github.com/aquasecurity/tracee/types/protocol"
10+
"github.com/aquasecurity/tracee/types/trace"
11+
)
12+
13+
type LdPreload struct {
14+
cb detect.SignatureHandler
15+
preloadEnvs []string
16+
preloadPath string
17+
}
18+
19+
func (sig *LdPreload) Init(cb detect.SignatureHandler) error {
20+
sig.cb = cb
21+
sig.preloadEnvs = []string{"LD_PRELOAD", "LD_LIBRARY_PATH"}
22+
sig.preloadPath = "/etc/ld.so.preload"
23+
return nil
24+
}
25+
26+
func (sig *LdPreload) GetMetadata() (detect.SignatureMetadata, error) {
27+
return detect.SignatureMetadata{
28+
ID: "TRC-7",
29+
Version: "1",
30+
Name: "LD_PRELOAD code injection detected",
31+
Description: "LD_PRELOAD usage was detected. LD_PRELOAD lets you load your library before any other library, allowing you to hook functions in a process. Adversaries may use this technique to change your applications' behavior or load their own programs.",
32+
Properties: map[string]interface{}{
33+
"Severity": 2,
34+
"Category": "persistence",
35+
"Technique": "Hijack Execution Flow",
36+
"Kubernetes_Technique": "",
37+
"id": "attack-pattern--aedfca76-3b30-4866-b2aa-0f1d7fd1e4b6",
38+
"external_id": "T1574",
39+
},
40+
}, nil
41+
}
42+
43+
func (sig *LdPreload) GetSelectedEvents() ([]detect.SignatureEventSelector, error) {
44+
return []detect.SignatureEventSelector{
45+
{Source: "tracee", Name: "sched_process_exec", Origin: "*"},
46+
{Source: "tracee", Name: "security_file_open", Origin: "*"},
47+
{Source: "tracee", Name: "security_inode_rename", Origin: "*"},
48+
}, nil
49+
}
50+
51+
func (sig *LdPreload) OnEvent(event protocol.Event) error {
52+
53+
eventObj, ok := event.Payload.(trace.Event)
54+
if !ok {
55+
return fmt.Errorf("invalid event")
56+
}
57+
58+
switch eventObj.EventName {
59+
case "sched_process_exec":
60+
61+
envVars, err := helpers.GetTraceeSliceStringArgumentByName(eventObj, "env")
62+
if err != nil {
63+
return nil
64+
}
65+
66+
for _, envVar := range envVars {
67+
for _, preloadEnv := range sig.preloadEnvs {
68+
if strings.HasPrefix(envVar, preloadEnv+"=") {
69+
metadata, err := sig.GetMetadata()
70+
if err != nil {
71+
return err
72+
}
73+
sig.cb(detect.Finding{
74+
SigMetadata: metadata,
75+
Event: event,
76+
Data: map[string]interface{}{preloadEnv: envVar},
77+
})
78+
79+
return nil
80+
}
81+
}
82+
}
83+
84+
case "security_file_open":
85+
86+
pathname, err := helpers.GetTraceeStringArgumentByName(eventObj, "pathname")
87+
if err != nil {
88+
return err
89+
}
90+
91+
flags, err := helpers.GetTraceeStringArgumentByName(eventObj, "flags")
92+
if err != nil {
93+
return err
94+
}
95+
96+
if strings.HasSuffix(pathname, sig.preloadPath) && helpers.IsFileWrite(flags) {
97+
metadata, err := sig.GetMetadata()
98+
if err != nil {
99+
return err
100+
}
101+
sig.cb(detect.Finding{
102+
SigMetadata: metadata,
103+
Event: event,
104+
Data: nil,
105+
})
106+
}
107+
108+
case "security_inode_rename":
109+
110+
newPath, err := helpers.GetTraceeStringArgumentByName(eventObj, "new_path")
111+
if err != nil {
112+
return err
113+
}
114+
115+
if strings.HasSuffix(newPath, sig.preloadPath) {
116+
metadata, err := sig.GetMetadata()
117+
if err != nil {
118+
return err
119+
}
120+
sig.cb(detect.Finding{
121+
SigMetadata: metadata,
122+
Event: event,
123+
Data: nil,
124+
})
125+
}
126+
127+
}
128+
129+
return nil
130+
}
131+
132+
func (sig *LdPreload) OnSignal(s detect.Signal) error {
133+
return nil
134+
}
135+
func (sig *LdPreload) Close() {}

0 commit comments

Comments
 (0)