diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-07-02 00:22:27 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-07-02 00:22:27 +0900 |
| commit | d5532aade0c3f042c5daa7d1c16e7cce2f4b524a (patch) | |
| tree | d34166a17ad57439edf1a59d5f54ecc605bd1ba4 | |
| parent | 0c5409aec7455cbe9e34b0e4d2f0edf0bc3c6e37 (diff) | |
sandbox/seccomp: native rule slice in helpers
These helper functions took FilterPreset as input for ease of integration. This moves them to []NativeRule.
Signed-off-by: Ophestra <cat@gensokyo.uk>
| -rw-r--r-- | internal/app/internal/setuid/shim.go | 5 | ||||
| -rw-r--r-- | sandbox/init.go | 2 | ||||
| -rw-r--r-- | sandbox/seccomp/libseccomp_test.go | 11 | ||||
| -rw-r--r-- | sandbox/seccomp/presets.go | 6 | ||||
| -rw-r--r-- | sandbox/seccomp/proc.go | 18 | ||||
| -rw-r--r-- | sandbox/seccomp/seccomp.go | 12 |
6 files changed, 27 insertions, 27 deletions
diff --git a/internal/app/internal/setuid/shim.go b/internal/app/internal/setuid/shim.go index 196fcfe9..100cf1cc 100644 --- a/internal/app/internal/setuid/shim.go +++ b/internal/app/internal/setuid/shim.go @@ -163,7 +163,10 @@ func ShimMain() { hlog.PrintBaseError(err, "cannot configure container:") } - if err := seccomp.Load(seccomp.PresetStrict, seccomp.AllowMultiarch); err != nil { + if err := seccomp.Load( + seccomp.Preset(seccomp.PresetStrict, seccomp.AllowMultiarch), + seccomp.AllowMultiarch, + ); err != nil { log.Fatalf("cannot load syscall filter: %v", err) } diff --git a/sandbox/init.go b/sandbox/init.go index 9828adaf..4fcdd9cb 100644 --- a/sandbox/init.go +++ b/sandbox/init.go @@ -237,7 +237,7 @@ func Init(prepare func(prefix string), setVerbose func(verbose bool)) { log.Fatalf("cannot capset: %v", err) } - if err := seccomp.Load(params.Flags.seccomp(params.SeccompPresets), params.SeccompFlags); err != nil { + if err := seccomp.Load(seccomp.Preset(params.Flags.seccomp(params.SeccompPresets), params.SeccompFlags), params.SeccompFlags); err != nil { log.Fatalf("cannot load syscall filter: %v", err) } diff --git a/sandbox/seccomp/libseccomp_test.go b/sandbox/seccomp/libseccomp_test.go index 236a8d80..a4ca9a1f 100644 --- a/sandbox/seccomp/libseccomp_test.go +++ b/sandbox/seccomp/libseccomp_test.go @@ -88,7 +88,7 @@ func TestExport(t *testing.T) { buf := make([]byte, 8) for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - e := New(tc.presets, tc.flags) + e := New(Preset(tc.presets, tc.flags), tc.flags) digest := sha512.New() if _, err := io.CopyBuffer(digest, e, buf); (err != nil) != tc.wantErr { @@ -107,7 +107,7 @@ func TestExport(t *testing.T) { } t.Run("close without use", func(t *testing.T) { - e := New(0, 0) + e := New(Preset(0, 0), 0) if err := e.Close(); !errors.Is(err, syscall.EINVAL) { t.Errorf("Close: error = %v", err) return @@ -115,7 +115,7 @@ func TestExport(t *testing.T) { }) t.Run("close partial read", func(t *testing.T) { - e := New(0, 0) + e := New(Preset(0, 0), 0) if _, err := e.Read(nil); err != nil { t.Errorf("Read: error = %v", err) return @@ -133,8 +133,9 @@ func TestExport(t *testing.T) { func BenchmarkExport(b *testing.B) { buf := make([]byte, 8) for i := 0; i < b.N; i++ { - e := New(PresetExt| - PresetDenyNS|PresetDenyTTY|PresetDenyDevel|PresetLinux32, + e := New( + Preset(PresetExt|PresetDenyNS|PresetDenyTTY|PresetDenyDevel|PresetLinux32, + AllowMultiarch|AllowCAN|AllowBluetooth), AllowMultiarch|AllowCAN|AllowBluetooth) if _, err := io.CopyBuffer(io.Discard, e, buf); err != nil { b.Fatalf("cannot export: %v", err) diff --git a/sandbox/seccomp/presets.go b/sandbox/seccomp/presets.go index cb868644..c3b8f04c 100644 --- a/sandbox/seccomp/presets.go +++ b/sandbox/seccomp/presets.go @@ -21,7 +21,7 @@ const ( PresetLinux32 ) -func preparePreset(fd int, presets FilterPreset, flags PrepareFlag) error { +func Preset(presets FilterPreset, flags PrepareFlag) (rules []NativeRule) { allowedPersonality := PER_LINUX if presets&PresetLinux32 != 0 { allowedPersonality = PER_LINUX32 @@ -51,7 +51,7 @@ func preparePreset(fd int, presets FilterPreset, flags PrepareFlag) error { } } - rules := make([]NativeRule, 0, l) + rules = make([]NativeRule, 0, l) rules = append(rules, presetCommon...) if presets&PresetDenyNS != 0 { rules = append(rules, presetNamespace...) @@ -75,7 +75,7 @@ func preparePreset(fd int, presets FilterPreset, flags PrepareFlag) error { } } - return Prepare(fd, rules, flags) + return } var ( diff --git a/sandbox/seccomp/proc.go b/sandbox/seccomp/proc.go index 25417826..51c3bce8 100644 --- a/sandbox/seccomp/proc.go +++ b/sandbox/seccomp/proc.go @@ -13,14 +13,10 @@ const ( ) // New returns an inactive Encoder instance. -func New(presets FilterPreset, flags PrepareFlag) *Encoder { - return &Encoder{newExporter(presets, flags)} -} +func New(rules []NativeRule, flags PrepareFlag) *Encoder { return &Encoder{newExporter(rules, flags)} } // Load loads a filter into the kernel. -func Load(presets FilterPreset, flags PrepareFlag) error { - return preparePreset(-1, presets, flags) -} +func Load(rules []NativeRule, flags PrepareFlag) error { return Prepare(-1, rules, flags) } /* An Encoder writes a BPF program to an output stream. @@ -50,20 +46,20 @@ func (e *Encoder) Close() error { } // NewFile returns an instance of exporter implementing [proc.File]. -func NewFile(presets FilterPreset, flags PrepareFlag) proc.File { - return &File{presets: presets, flags: flags} +func NewFile(rules []NativeRule, flags PrepareFlag) proc.File { + return &File{rules: rules, flags: flags} } // File implements [proc.File] and provides access to the read end of exporter pipe. type File struct { - presets FilterPreset - flags PrepareFlag + rules []NativeRule + flags PrepareFlag proc.BaseFile } func (f *File) ErrCount() int { return 2 } func (f *File) Fulfill(ctx context.Context, dispatchErr func(error)) error { - e := newExporter(f.presets, f.flags) + e := newExporter(f.rules, f.flags) if err := e.prepare(); err != nil { return err } diff --git a/sandbox/seccomp/seccomp.go b/sandbox/seccomp/seccomp.go index adbe4d08..c538e4e4 100644 --- a/sandbox/seccomp/seccomp.go +++ b/sandbox/seccomp/seccomp.go @@ -8,9 +8,9 @@ import ( ) type exporter struct { - presets FilterPreset - flags PrepareFlag - r, w *os.File + rules []NativeRule + flags PrepareFlag + r, w *os.File prepareOnce sync.Once prepareErr error @@ -30,7 +30,7 @@ func (e *exporter) prepare() error { ec := make(chan error, 1) go func(fd uintptr) { - ec <- preparePreset(int(fd), e.presets, e.flags) + ec <- Prepare(int(fd), e.rules, e.flags) close(ec) _ = e.closeWrite() runtime.KeepAlive(e.w) @@ -55,6 +55,6 @@ func (e *exporter) closeWrite() error { return e.closeErr } -func newExporter(presets FilterPreset, flags PrepareFlag) *exporter { - return &exporter{presets: presets, flags: flags} +func newExporter(rules []NativeRule, flags PrepareFlag) *exporter { + return &exporter{rules: rules, flags: flags} } |
