-
Notifications
You must be signed in to change notification settings - Fork 5
/
scgen.go
104 lines (87 loc) · 1.7 KB
/
scgen.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package main
import (
"bufio"
"encoding/json"
"flag"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"regexp"
"runtime"
"sort"
"strings"
"github.com/apex/log"
clihander "github.com/apex/log/handlers/cli"
"github.com/blacktop/seccomp-gen/seccomp"
"github.com/blacktop/seccomp-gen/seccomp/syscalls"
)
var requiredSyscalls = []string{
"capget",
"capset",
"chdir",
"execve",
"fchown",
"futex",
"getdents64",
"getpid",
"getppid",
"lstat",
"openat",
"prctl",
"setgid",
"setgroups",
"setuid",
"stat",
}
func unique(slice []string, i string) []string {
for _, ele := range slice {
if ele == i {
return slice
}
}
return append(slice, i)
}
func init() {
log.SetHandler(clihander.Default)
}
func main() {
var sc string
var scs []string
verbosePtr := flag.Bool("verbose", false, "verbose output")
flag.Parse()
re := regexp.MustCompile(`^[a-zA-Z_]+\(`)
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
sc = strings.TrimRight(re.FindString(scanner.Text()), "(")
if len(sc) > 0 {
if syscalls.IsValid(sc) {
scs = unique(scs, sc)
}
}
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, "reading standard input:", err)
}
for _, sc := range scs {
if *verbosePtr {
log.Infof("found syscall: %s", sc)
}
requiredSyscalls = unique(requiredSyscalls, sc)
}
sort.Strings(requiredSyscalls)
// write out to file
wd, err := os.Getwd()
if err != nil {
panic(err)
}
f := filepath.Join(wd, "seccomp.json")
// write the default profile to the file
b, err := json.MarshalIndent(seccomp.DefaultProfile(requiredSyscalls, runtime.GOARCH), "", "\t")
if err != nil {
panic(err)
}
if err := ioutil.WriteFile(f, b, 0644); err != nil {
panic(err)
}
}