Skip to content

Commit 904ace4

Browse files
roikolrafaeldtinoco
authored andcommitted
signature: add disk_mount.go sig
1 parent 4e7fd14 commit 904ace4

File tree

3 files changed

+214
-0
lines changed

3 files changed

+214
-0
lines changed

signatures/golang/disk_mount.go

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
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 DiskMount struct {
14+
cb detect.SignatureHandler
15+
devDir string
16+
}
17+
18+
func (sig *DiskMount) Init(cb detect.SignatureHandler) error {
19+
sig.cb = cb
20+
sig.devDir = "/dev/"
21+
return nil
22+
}
23+
24+
func (sig *DiskMount) GetMetadata() (detect.SignatureMetadata, error) {
25+
return detect.SignatureMetadata{
26+
ID: "TRC-27",
27+
Version: "1",
28+
Name: "Container device mount detected",
29+
Description: "Container device filesystem mount detected. A mount of a host device filesystem can be exploited by adversaries to perform container escape.",
30+
Properties: map[string]interface{}{
31+
"Severity": 3,
32+
"Category": "privilege-escalation",
33+
"Technique": "Escape to Host",
34+
"Kubernetes_Technique": "",
35+
"id": "attack-pattern--4a5b7ade-8bb5-4853-84ed-23f262002665",
36+
"external_id": "T1611",
37+
},
38+
}, nil
39+
}
40+
41+
func (sig *DiskMount) GetSelectedEvents() ([]detect.SignatureEventSelector, error) {
42+
return []detect.SignatureEventSelector{
43+
{Source: "tracee", Name: "security_sb_mount", Origin: "container"},
44+
}, nil
45+
}
46+
47+
func (sig *DiskMount) OnEvent(event protocol.Event) error {
48+
49+
eventObj, ok := event.Payload.(trace.Event)
50+
if !ok {
51+
return fmt.Errorf("invalid event")
52+
}
53+
54+
switch eventObj.EventName {
55+
56+
case "security_sb_mount":
57+
58+
deviceName, err := helpers.GetTraceeStringArgumentByName(eventObj, "dev_name")
59+
if err != nil {
60+
return nil
61+
}
62+
63+
if !isRunc(eventObj) && strings.HasPrefix(deviceName, sig.devDir) {
64+
metadata, err := sig.GetMetadata()
65+
if err != nil {
66+
return err
67+
}
68+
sig.cb(detect.Finding{
69+
SigMetadata: metadata,
70+
Event: event,
71+
Data: nil,
72+
})
73+
}
74+
75+
}
76+
77+
return nil
78+
}
79+
80+
func (sig *DiskMount) OnSignal(s detect.Signal) error {
81+
return nil
82+
}
83+
func (sig *DiskMount) Close() {}
84+
85+
func isRunc(event trace.Event) bool {
86+
if event.ThreadID == 1 && strings.HasPrefix(event.ProcessName, "runc:") {
87+
return true
88+
}
89+
90+
return false
91+
}
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
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 TestDiskMount(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+
ProcessName: "mal",
24+
ThreadID: 8,
25+
EventName: "security_sb_mount",
26+
Args: []trace.Argument{
27+
{
28+
ArgMeta: trace.ArgMeta{
29+
Name: "dev_name",
30+
},
31+
Value: interface{}("/dev/sda1"),
32+
},
33+
},
34+
},
35+
},
36+
Findings: map[string]detect.Finding{
37+
"TRC-27": {
38+
Data: nil,
39+
Event: trace.Event{
40+
ProcessName: "mal",
41+
ThreadID: 8,
42+
EventName: "security_sb_mount",
43+
Args: []trace.Argument{
44+
{
45+
ArgMeta: trace.ArgMeta{
46+
Name: "dev_name",
47+
},
48+
Value: interface{}("/dev/sda1"),
49+
},
50+
},
51+
}.ToProtocol(),
52+
SigMetadata: detect.SignatureMetadata{
53+
ID: "TRC-27",
54+
Version: "1",
55+
Name: "Container device mount detected",
56+
Description: "Container device filesystem mount detected. A mount of a host device filesystem can be exploited by adversaries to perform container escape.",
57+
Properties: map[string]interface{}{
58+
"Severity": 3,
59+
"Category": "privilege-escalation",
60+
"Technique": "Escape to Host",
61+
"Kubernetes_Technique": "",
62+
"id": "attack-pattern--4a5b7ade-8bb5-4853-84ed-23f262002665",
63+
"external_id": "T1611",
64+
},
65+
},
66+
},
67+
},
68+
},
69+
{
70+
Name: "should not trigger detection - runc",
71+
Events: []trace.Event{
72+
{
73+
ProcessName: "runc:[init]",
74+
ThreadID: 1,
75+
EventName: "security_sb_mount",
76+
Args: []trace.Argument{
77+
{
78+
ArgMeta: trace.ArgMeta{
79+
Name: "dev_name",
80+
},
81+
Value: interface{}("/dev/sda1"),
82+
},
83+
},
84+
},
85+
},
86+
Findings: map[string]detect.Finding{},
87+
},
88+
{
89+
Name: "should not trigger detection - wrong path",
90+
Events: []trace.Event{
91+
{
92+
ProcessName: "runc:[init]",
93+
ThreadID: 8,
94+
EventName: "security_sb_mount",
95+
Args: []trace.Argument{
96+
{
97+
ArgMeta: trace.ArgMeta{
98+
Name: "dev_name",
99+
},
100+
Value: interface{}("/tmp/something"),
101+
},
102+
},
103+
},
104+
},
105+
Findings: map[string]detect.Finding{},
106+
},
107+
}
108+
109+
for _, tc := range testCases {
110+
t.Run(tc.Name, func(t *testing.T) {
111+
holder := signaturestest.FindingsHolder{}
112+
sig := DiskMount{}
113+
sig.Init(holder.OnFinding)
114+
115+
for _, e := range tc.Events {
116+
err := sig.OnEvent(e.ToProtocol())
117+
require.NoError(t, err)
118+
}
119+
assert.Equal(t, tc.Findings, holder.GroupBySigID())
120+
})
121+
}
122+
}

signatures/golang/export.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,5 @@ var ExportedSignatures = []detect.Signature{
2727
&AntiDebuggingPtraceme{},
2828
&PtraceCodeInjection{},
2929
&ProcessVmWriteCodeInjection{},
30+
&DiskMount{},
3031
}

0 commit comments

Comments
 (0)