Skip to content

Commit cc469cb

Browse files
roikolrafaeldtinoco
authored andcommitted
signature: add ptrace_code_injection.go sig
1 parent cd26823 commit cc469cb

File tree

3 files changed

+178
-0
lines changed

3 files changed

+178
-0
lines changed

signatures/golang/export.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,5 @@ var ExportedSignatures = []detect.Signature{
2525
&ProcMemAccess{},
2626
&HiddenFileCreated{},
2727
&AntiDebuggingPtraceme{},
28+
&PtraceCodeInjection{},
2829
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/aquasecurity/tracee/signatures/helpers"
7+
"github.com/aquasecurity/tracee/types/detect"
8+
"github.com/aquasecurity/tracee/types/protocol"
9+
"github.com/aquasecurity/tracee/types/trace"
10+
)
11+
12+
type PtraceCodeInjection struct {
13+
cb detect.SignatureHandler
14+
ptracePokeText string
15+
}
16+
17+
func (sig *PtraceCodeInjection) Init(cb detect.SignatureHandler) error {
18+
sig.cb = cb
19+
sig.ptracePokeText = "PTRACE_POKETEXT"
20+
return nil
21+
}
22+
23+
func (sig *PtraceCodeInjection) GetMetadata() (detect.SignatureMetadata, error) {
24+
return detect.SignatureMetadata{
25+
ID: "TRC-3",
26+
Version: "1",
27+
Name: "Code injection detected using ptrace",
28+
Description: "Possible code injection into another process was detected. Code injection is an exploitation technique used to run malicious code, adversaries may use it in order to execute their malware.",
29+
Properties: map[string]interface{}{
30+
"Severity": 3,
31+
"Category": "defense-evasion",
32+
"Technique": "Ptrace System Calls",
33+
"Kubernetes_Technique": "",
34+
"id": "attack-pattern--ea016b56-ae0e-47fe-967a-cc0ad51af67f",
35+
"external_id": "T1055.008",
36+
},
37+
}, nil
38+
}
39+
40+
func (sig *PtraceCodeInjection) GetSelectedEvents() ([]detect.SignatureEventSelector, error) {
41+
return []detect.SignatureEventSelector{
42+
{Source: "tracee", Name: "ptrace", Origin: "*"},
43+
}, nil
44+
}
45+
46+
func (sig *PtraceCodeInjection) OnEvent(event protocol.Event) error {
47+
48+
eventObj, ok := event.Payload.(trace.Event)
49+
if !ok {
50+
return fmt.Errorf("invalid event")
51+
}
52+
53+
switch eventObj.EventName {
54+
55+
case "ptrace":
56+
requestArg, err := helpers.GetTraceeStringArgumentByName(eventObj, "request")
57+
if err != nil {
58+
return err
59+
}
60+
61+
if requestArg == sig.ptracePokeText {
62+
metadata, err := sig.GetMetadata()
63+
if err != nil {
64+
return err
65+
}
66+
sig.cb(detect.Finding{
67+
SigMetadata: metadata,
68+
Event: event,
69+
Data: nil,
70+
})
71+
}
72+
73+
}
74+
return nil
75+
}
76+
77+
func (sig *PtraceCodeInjection) OnSignal(s detect.Signal) error {
78+
return nil
79+
}
80+
func (sig *PtraceCodeInjection) Close() {}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package main
2+
3+
import (
4+
"testing"
5+
6+
"github.com/aquasecurity/tracee/signatures/signaturestest"
7+
"github.com/aquasecurity/tracee/types/detect"
8+
"github.com/aquasecurity/tracee/types/trace"
9+
"github.com/stretchr/testify/assert"
10+
"github.com/stretchr/testify/require"
11+
)
12+
13+
func TestPtraceCodeInjection(t *testing.T) {
14+
testCases := []struct {
15+
Name string
16+
Events []trace.Event
17+
Findings map[string]detect.Finding
18+
}{
19+
{
20+
Name: "should trigger detection",
21+
Events: []trace.Event{
22+
{
23+
EventName: "ptrace",
24+
Args: []trace.Argument{
25+
{
26+
ArgMeta: trace.ArgMeta{
27+
Name: "request",
28+
},
29+
Value: interface{}("PTRACE_POKETEXT"),
30+
},
31+
},
32+
},
33+
},
34+
Findings: map[string]detect.Finding{
35+
"TRC-3": {
36+
Data: nil,
37+
Event: trace.Event{
38+
EventName: "ptrace",
39+
Args: []trace.Argument{
40+
{
41+
ArgMeta: trace.ArgMeta{
42+
Name: "request",
43+
},
44+
Value: interface{}("PTRACE_POKETEXT"),
45+
},
46+
},
47+
}.ToProtocol(),
48+
SigMetadata: detect.SignatureMetadata{
49+
ID: "TRC-3",
50+
Version: "1",
51+
Name: "Code injection detected using ptrace",
52+
Description: "Possible code injection into another process was detected. Code injection is an exploitation technique used to run malicious code, adversaries may use it in order to execute their malware.",
53+
Properties: map[string]interface{}{
54+
"Severity": 3,
55+
"Category": "defense-evasion",
56+
"Technique": "Ptrace System Calls",
57+
"Kubernetes_Technique": "",
58+
"id": "attack-pattern--ea016b56-ae0e-47fe-967a-cc0ad51af67f",
59+
"external_id": "T1055.008",
60+
},
61+
},
62+
},
63+
},
64+
},
65+
{
66+
Name: "should not trigger detection - wrong request",
67+
Events: []trace.Event{
68+
{
69+
EventName: "ptrace",
70+
Args: []trace.Argument{
71+
{
72+
ArgMeta: trace.ArgMeta{
73+
Name: "request",
74+
},
75+
Value: interface{}("PTRACE_PEEKTEXT"),
76+
},
77+
},
78+
},
79+
},
80+
Findings: map[string]detect.Finding{},
81+
},
82+
}
83+
84+
for _, tc := range testCases {
85+
t.Run(tc.Name, func(t *testing.T) {
86+
holder := signaturestest.FindingsHolder{}
87+
sig := PtraceCodeInjection{}
88+
sig.Init(holder.OnFinding)
89+
90+
for _, e := range tc.Events {
91+
err := sig.OnEvent(e.ToProtocol())
92+
require.NoError(t, err)
93+
}
94+
assert.Equal(t, tc.Findings, holder.GroupBySigID())
95+
})
96+
}
97+
}

0 commit comments

Comments
 (0)