Skip to content

Commit 80551f3

Browse files
committed
feat(detectors): migrate system_request_key_config_modification signature to detector
Migrated from signatures/golang/system_request_key_config_modification.go Detector ID: TRC-1031
1 parent 1c33341 commit 80551f3

File tree

5 files changed

+161
-240
lines changed

5 files changed

+161
-240
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package detectors
2+
3+
import (
4+
"context"
5+
6+
"github.com/aquasecurity/tracee/api/v1beta1"
7+
"github.com/aquasecurity/tracee/api/v1beta1/detection"
8+
"github.com/aquasecurity/tracee/common/parsers"
9+
)
10+
11+
func init() {
12+
register(&SystemRequestKeyConfigModification{})
13+
}
14+
15+
// SystemRequestKeyConfigModification detects modifications to sysrq configuration files.
16+
// Adversaries may use this to control system behavior or gather information for container escape.
17+
type SystemRequestKeyConfigModification struct {
18+
logger detection.Logger
19+
}
20+
21+
func (d *SystemRequestKeyConfigModification) GetDefinition() detection.DetectorDefinition {
22+
return detection.DetectorDefinition{
23+
ID: "TRC-1031",
24+
Requirements: detection.DetectorRequirements{
25+
Events: []detection.EventRequirement{
26+
{
27+
Name: "security_file_open",
28+
Dependency: detection.DependencyRequired,
29+
ScopeFilters: []string{"container=started"},
30+
DataFilters: []string{
31+
"pathname=/proc/sys/kernel/sysrq",
32+
"pathname=/proc/sysrq-trigger",
33+
},
34+
},
35+
},
36+
},
37+
ProducedEvent: v1beta1.EventDefinition{
38+
Name: "system_request_key_mod",
39+
Description: "System request key configuration modification",
40+
Version: &v1beta1.Version{Major: 1, Minor: 0, Patch: 0},
41+
},
42+
ThreatMetadata: &v1beta1.Threat{
43+
Name: "System request key configuration modification",
44+
Description: "An attempt to modify and activate the System Request Key configuration file was detected. The system request key allows immediate input to the kernel through simple key combinations. Adversaries may use this feature to immediately shut down or restart a system. With read access to kernel logs, host related information such as listing tasks and CPU registers may be disclosed and could be used for container escape.",
45+
Severity: v1beta1.Severity_HIGH,
46+
Mitre: &v1beta1.Mitre{
47+
Tactic: &v1beta1.MitreTactic{Name: "Privilege Escalation"},
48+
Technique: &v1beta1.MitreTechnique{Id: "T1611", Name: "Escape to Host"},
49+
},
50+
Properties: map[string]string{"Category": "privilege-escalation"},
51+
},
52+
AutoPopulate: detection.AutoPopulateFields{Threat: true, DetectedFrom: true},
53+
}
54+
}
55+
56+
func (d *SystemRequestKeyConfigModification) Init(params detection.DetectorParams) error {
57+
d.logger = params.Logger
58+
d.logger.Debugw("SystemRequestKeyConfigModification detector initialized")
59+
return nil
60+
}
61+
62+
func (d *SystemRequestKeyConfigModification) OnEvent(ctx context.Context, event *v1beta1.Event) ([]detection.DetectorOutput, error) {
63+
flags, err := v1beta1.GetDataSafe[int32](event, "flags")
64+
if err != nil {
65+
return nil, nil
66+
}
67+
68+
if !parsers.IsFileWrite(int(flags)) {
69+
return nil, nil
70+
}
71+
72+
d.logger.Debugw("sysrq modification detected", "container", v1beta1.GetContainerID(event))
73+
return detection.Detected(), nil
74+
}
75+
76+
func (d *SystemRequestKeyConfigModification) Close() error {
77+
d.logger.Debugw("SystemRequestKeyConfigModification detector closed")
78+
return nil
79+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package detectors
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
"github.com/stretchr/testify/require"
9+
10+
"github.com/aquasecurity/tracee/api/v1beta1"
11+
"github.com/aquasecurity/tracee/api/v1beta1/detection"
12+
)
13+
14+
func TestSystemRequestKeyConfigModification(t *testing.T) {
15+
t.Parallel()
16+
17+
testCases := []struct {
18+
name string
19+
pathname string
20+
flags int32
21+
expectedOutput bool
22+
}{
23+
{
24+
name: "write to /proc/sys/kernel/sysrq",
25+
pathname: "/proc/sys/kernel/sysrq",
26+
flags: 1, // O_WRONLY
27+
expectedOutput: true,
28+
},
29+
{
30+
name: "write to /proc/sysrq-trigger",
31+
pathname: "/proc/sysrq-trigger",
32+
flags: 1, // O_WRONLY
33+
expectedOutput: true,
34+
},
35+
{
36+
name: "read from /proc/sys/kernel/sysrq - should not trigger",
37+
pathname: "/proc/sys/kernel/sysrq",
38+
flags: 0, // O_RDONLY
39+
expectedOutput: false,
40+
},
41+
// Note: different_file test removed - DataFilter would prevent this event from reaching OnEvent
42+
}
43+
44+
for _, tc := range testCases {
45+
tc := tc
46+
t.Run(tc.name, func(t *testing.T) {
47+
t.Parallel()
48+
49+
detector := &SystemRequestKeyConfigModification{}
50+
err := detector.Init(detection.DetectorParams{Logger: &mockLogger{}})
51+
require.NoError(t, err)
52+
53+
event := &v1beta1.Event{
54+
Id: v1beta1.EventId_security_file_open,
55+
Name: "security_file_open",
56+
Workload: &v1beta1.Workload{
57+
Process: &v1beta1.Process{
58+
Executable: &v1beta1.Executable{Path: "/usr/bin/test"},
59+
},
60+
Container: &v1beta1.Container{
61+
Id: "test-container",
62+
Started: true,
63+
},
64+
},
65+
Data: []*v1beta1.EventValue{
66+
v1beta1.NewStringValue("pathname", tc.pathname),
67+
v1beta1.NewInt32Value("flags", tc.flags),
68+
},
69+
}
70+
71+
output, err := detector.OnEvent(context.Background(), event)
72+
require.NoError(t, err)
73+
74+
if tc.expectedOutput {
75+
assert.Len(t, output, 1, "Expected detection")
76+
} else {
77+
assert.Len(t, output, 0, "Expected no detection")
78+
}
79+
})
80+
}
81+
}

signatures/golang/export.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ import "github.com/aquasecurity/tracee/types/detect"
44

55
// ExportedSignatures fulfills the goplugins contract required by the rule-engine
66
// this is a list of signatures that this plugin exports
7-
var ExportedSignatures = []detect.Signature{
8-
&SystemRequestKeyConfigModification{},
9-
}
7+
var ExportedSignatures = []detect.Signature{}
108

119
// ExportedDataSources fulfills the goplugins contract required by the rule-engine
1210
// this is a list of data-sources that this plugin exports

signatures/golang/system_request_key_config_modification.go

Lines changed: 0 additions & 90 deletions
This file was deleted.

0 commit comments

Comments
 (0)