Skip to content

Commit ac0198e

Browse files
committed
Added helper functions for open openat openat2 syscalls
DirectoryTraversalMonitoredFileRead rule is triggered Signed-off-by: GLVS Kiriti <glvskiriti2003369@gmail.com>
1 parent 94493f2 commit ac0198e

File tree

4 files changed

+53
-29
lines changed

4 files changed

+53
-29
lines changed

events/exampleyamlfile.yml

+6-15
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,14 @@
11
tests:
2-
- rule: WriteBelowRoot
2+
- rule: DirectoryTraversalMonitoredFileRead
33
runner: HostRunner
44
before: ""
55
steps:
6-
- syscall: "write"
6+
- syscall: "open"
77
args:
8-
filepath: "/root/created-by-event-generator"
9-
content: ""
10-
after: "rm -f /root/created-by-event-generator"
11-
12-
- rule: WriteBelowEtc
13-
runner: HostRunner
14-
before: ""
15-
steps:
16-
- syscall: "write"
17-
args:
18-
filepath: "/etc/created-by-event-generator"
19-
content: ""
20-
after: "rm -f /etc/created-by-event-generator"
8+
filepath: "/etc/../etc/../etc/shadow"
9+
flag: 0
10+
mode: 0655
11+
after: ""
2112

2213
- rule: LaunchIngressRemoteFileCopyToolsInsideContainer
2314
runner: ContainerRunner

pkg/declarative/helpers.go

+23-9
Original file line numberDiff line numberDiff line change
@@ -59,18 +59,32 @@ func CreateTarReader(filePath string) (io.Reader, error) {
5959
return tarBuffer, nil
6060
}
6161

62-
func WriteSyscall(filepath string, content string) error {
63-
// Open the file using unix.Open syscall
64-
fd, err := unix.Open(filepath, unix.O_WRONLY|unix.O_CREAT, 0644)
62+
func OpenSyscall(filepath string, flags int, mode uint32) (int, error) {
63+
fd, err := unix.Open(filepath, flags, mode)
6564
if err != nil {
66-
return fmt.Errorf("error opening file: %v", err)
65+
return -1, fmt.Errorf("error opening file: %v", err)
66+
}
67+
return fd, nil
68+
}
69+
70+
func OpenatSyscall(dirfd int, filepath string, flags int, mode uint32) (int, error) {
71+
fd, err := unix.Openat(dirfd, filepath, flags, mode)
72+
if err != nil {
73+
return -1, fmt.Errorf("error opening file: %v", err)
74+
}
75+
return fd, nil
76+
}
77+
78+
func Openat2Syscall(dirfd int, filepath string, flags int, mode uint32, resolve uint64) (int, error) {
79+
how := &unix.OpenHow{
80+
Flags: uint64(flags),
81+
Mode: uint64(mode),
82+
Resolve: resolve,
6783
}
68-
defer unix.Close(fd)
6984

70-
// Write to the file using unix.Write
71-
_, err = unix.Write(fd, []byte(content))
85+
fd, err := unix.Openat2(dirfd, filepath, how)
7286
if err != nil {
73-
return fmt.Errorf("error writing to file: %v", err)
87+
return -1, fmt.Errorf("error opening file: %v", err)
7488
}
75-
return nil
89+
return fd, nil
7690
}

pkg/declarative/host.go

+14-3
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,20 @@ func (r *Hostrunner) ExecuteStep(ctx context.Context, test Test) error {
3535
steps := test.Steps
3636
for _, step := range steps {
3737
switch step.Syscall {
38-
case "write":
39-
if err := WriteSyscall(step.Args["filepath"], step.Args["content"]); err != nil {
40-
return fmt.Errorf("write syscall failed with error: %v", err)
38+
case "open":
39+
_, err := OpenSyscall(*step.Args.Filepath, *step.Args.Flags, *step.Args.Mode)
40+
if err != nil {
41+
return fmt.Errorf("open syscall failed with error: %v", err)
42+
}
43+
case "openat":
44+
_, err := OpenatSyscall(*step.Args.Dirfd, *step.Args.Filepath, *step.Args.Flags, *step.Args.Mode)
45+
if err != nil {
46+
return fmt.Errorf("openat syscall failed with error: %v", err)
47+
}
48+
case "openat2":
49+
_, err := Openat2Syscall(*step.Args.Dirfd, *step.Args.Filepath, *step.Args.Flags, *step.Args.Mode, *step.Args.Resolve)
50+
if err != nil {
51+
return fmt.Errorf("openat2 syscall failed with error: %v", err)
4152
}
4253
default:
4354
return fmt.Errorf("unsupported syscall: %s", step.Syscall)

pkg/declarative/yamltypes.go

+10-2
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,17 @@ limitations under the License.
1515
package declarative
1616

1717
// Yaml file structure
18+
type Args struct {
19+
Dirfd *int `yaml:"dirfd,omitempty"`
20+
Filepath *string `yaml:"filepath,omitempty"`
21+
Flags *int `yaml:"flag,omitempty"`
22+
Mode *uint32 `yaml:"mode,omitempty"`
23+
Resolve *uint64 `yaml:"resolve,omitempty"`
24+
}
25+
1826
type SyscallStep struct {
19-
Syscall string `yaml:"syscall"`
20-
Args map[string]string `yaml:"args"`
27+
Syscall string `yaml:"syscall"`
28+
Args Args `yaml:"args"`
2129
}
2230

2331
type Test struct {

0 commit comments

Comments
 (0)