Compare commits
2 Commits
99f43c14c4
...
a5048eb20f
Author | SHA1 | Date |
---|---|---|
|
a5048eb20f | |
|
6128233f0c |
2
go.mod
2
go.mod
|
@ -9,7 +9,7 @@ require (
|
||||||
github.com/containers/storage v1.58.0
|
github.com/containers/storage v1.58.0
|
||||||
github.com/iovisor/gobpf v0.2.1-0.20221005153822-16120a1bf4d4
|
github.com/iovisor/gobpf v0.2.1-0.20221005153822-16120a1bf4d4
|
||||||
github.com/opencontainers/runtime-spec v1.2.1
|
github.com/opencontainers/runtime-spec v1.2.1
|
||||||
github.com/seccomp/libseccomp-golang v0.10.0
|
github.com/seccomp/libseccomp-golang v0.11.1
|
||||||
github.com/sirupsen/logrus v1.9.3
|
github.com/sirupsen/logrus v1.9.3
|
||||||
github.com/stretchr/testify v1.10.0
|
github.com/stretchr/testify v1.10.0
|
||||||
)
|
)
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -34,8 +34,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
|
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
|
||||||
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
|
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
|
||||||
github.com/seccomp/libseccomp-golang v0.10.0 h1:aA4bp+/Zzi0BnWZ2F1wgNBs5gTpm+na2rWM6M9YjLpY=
|
github.com/seccomp/libseccomp-golang v0.11.1 h1:wuk4ZjSx6kyQII4rj6G6fvVzRHQaSiPvccJazDagu4g=
|
||||||
github.com/seccomp/libseccomp-golang v0.10.0/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg=
|
github.com/seccomp/libseccomp-golang v0.11.1/go.mod h1:5m1Lk8E9OwgZTTVz4bBOer7JuazaBa+xTkM895tDiWc=
|
||||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
||||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
|
|
@ -1,4 +1,12 @@
|
||||||
# For documentation, see https://golangci-lint.run/usage/configuration/
|
# For documentation, see https://golangci-lint.run/usage/configuration/
|
||||||
linters:
|
version: "2"
|
||||||
|
|
||||||
|
formatters:
|
||||||
enable:
|
enable:
|
||||||
- gofumpt
|
- gofumpt
|
||||||
|
|
||||||
|
linters:
|
||||||
|
exclusions:
|
||||||
|
generated: disable
|
||||||
|
presets:
|
||||||
|
- std-error-handling
|
||||||
|
|
|
@ -2,6 +2,21 @@ libseccomp-golang: Releases
|
||||||
===============================================================================
|
===============================================================================
|
||||||
https://github.com/seccomp/libseccomp-golang
|
https://github.com/seccomp/libseccomp-golang
|
||||||
|
|
||||||
|
* Version 0.11.1 - August 5, 2025
|
||||||
|
- Make GetArchFromString recognize "loong64"
|
||||||
|
|
||||||
|
* Version 0.11.0 - April 23, 2025
|
||||||
|
- Add new architectures (LOONGARCH64, M68K, SH, SHEB)
|
||||||
|
- Add support for SCMP_FLTATR_CTL_WAITKILL (GetWaitKill, SetWaitKill)
|
||||||
|
- Add support for filter precompute (Precompute)
|
||||||
|
- Add support for transactions (Transaction{Start,Commit,Reject})
|
||||||
|
- Add ExportBPFMem
|
||||||
|
- Improve documentation for struct fields
|
||||||
|
- Fix TestRuleAddAndLoad for ppc architecture
|
||||||
|
- Fix TestRuleAddAndLoad to not use magic number
|
||||||
|
- Remove unused get_*_version implementation
|
||||||
|
- Test against latest libseccomp and Go versions
|
||||||
|
|
||||||
* Version 0.10.0 - June 9, 2022
|
* Version 0.10.0 - June 9, 2022
|
||||||
- Minimum supported version of libseccomp bumped to v2.3.1
|
- Minimum supported version of libseccomp bumped to v2.3.1
|
||||||
- Add seccomp userspace notification API (ActNotify, filter.*Notif*)
|
- Add seccomp userspace notification API (ActNotify, filter.*Notif*)
|
||||||
|
|
|
@ -17,8 +17,28 @@ import (
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
// #include <stdlib.h>
|
/*
|
||||||
// #include <seccomp.h>
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <seccomp.h>
|
||||||
|
|
||||||
|
// The following functions were added in libseccomp v2.6.0.
|
||||||
|
#if SCMP_VER_MAJOR == 2 && SCMP_VER_MINOR < 6
|
||||||
|
int seccomp_precompute(scmp_filter_ctx ctx) {
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
int seccomp_export_bpf_mem(const scmp_filter_ctx ctx, void *buf, size_t *len) {
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
int seccomp_transaction_start(const scmp_filter_ctx ctx) {
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
int seccomp_transaction_commit(const scmp_filter_ctx ctx) {
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
void seccomp_transaction_reject(const scmp_filter_ctx ctx) {}
|
||||||
|
#endif
|
||||||
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
// Exported types
|
// Exported types
|
||||||
|
@ -33,8 +53,9 @@ type VersionError struct {
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
// This forces the cgo libseccomp to initialize its internal API support state,
|
// This forces the cgo libseccomp to initialize its internal API support state,
|
||||||
// which is necessary on older versions of libseccomp in order to work
|
// which is necessary on older versions of libseccomp (< 2.5.0) in order to work
|
||||||
// correctly.
|
// correctly.
|
||||||
|
// TODO: remove once libseccomp < v2.5.0 is not supported.
|
||||||
_, _ = getAPI()
|
_, _ = getAPI()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,49 +99,44 @@ type ScmpSyscall int32
|
||||||
type ScmpFd int32
|
type ScmpFd int32
|
||||||
|
|
||||||
// ScmpNotifData describes the system call context that triggered a notification.
|
// ScmpNotifData describes the system call context that triggered a notification.
|
||||||
//
|
|
||||||
// Syscall: the syscall number
|
|
||||||
// Arch: the filter architecture
|
|
||||||
// InstrPointer: address of the instruction that triggered a notification
|
|
||||||
// Args: arguments (up to 6) for the syscall
|
|
||||||
//
|
|
||||||
type ScmpNotifData struct {
|
type ScmpNotifData struct {
|
||||||
Syscall ScmpSyscall `json:"syscall,omitempty"`
|
// Syscall is the syscall number.
|
||||||
Arch ScmpArch `json:"arch,omitempty"`
|
Syscall ScmpSyscall `json:"syscall,omitempty"`
|
||||||
InstrPointer uint64 `json:"instr_pointer,omitempty"`
|
// Arch is the filter architecture.
|
||||||
Args []uint64 `json:"args,omitempty"`
|
Arch ScmpArch `json:"arch,omitempty"`
|
||||||
|
// InstrPointer is the address of the instruction that triggered a notification.
|
||||||
|
InstrPointer uint64 `json:"instr_pointer,omitempty"`
|
||||||
|
// Args are the arguments (up to 6) for the syscall.
|
||||||
|
Args []uint64 `json:"args,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ScmpNotifReq represents a seccomp userspace notification. See NotifReceive() for
|
// ScmpNotifReq represents a seccomp userspace notification. See NotifReceive() for
|
||||||
// info on how to pull such a notification.
|
// info on how to pull such a notification.
|
||||||
//
|
|
||||||
// ID: notification ID
|
|
||||||
// Pid: process that triggered the notification event
|
|
||||||
// Flags: filter flags (see seccomp(2))
|
|
||||||
// Data: system call context that triggered the notification
|
|
||||||
//
|
|
||||||
type ScmpNotifReq struct {
|
type ScmpNotifReq struct {
|
||||||
ID uint64 `json:"id,omitempty"`
|
// ID is the notification ID.
|
||||||
Pid uint32 `json:"pid,omitempty"`
|
ID uint64 `json:"id,omitempty"`
|
||||||
Flags uint32 `json:"flags,omitempty"`
|
// Pid is the process that triggered the notification event.
|
||||||
Data ScmpNotifData `json:"data,omitempty"`
|
Pid uint32 `json:"pid,omitempty"`
|
||||||
|
// Flags is filter flags (see seccomp(2)).
|
||||||
|
Flags uint32 `json:"flags,omitempty"`
|
||||||
|
// Data is system call context that triggered the notification.
|
||||||
|
Data ScmpNotifData `json:"data,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ScmpNotifResp represents a seccomp userspace notification response. See NotifRespond()
|
// ScmpNotifResp represents a seccomp userspace notification response. See NotifRespond()
|
||||||
// for info on how to push such a response.
|
// for info on how to push such a response.
|
||||||
//
|
|
||||||
// ID: notification ID (must match the corresponding ScmpNotifReq ID)
|
|
||||||
// Error: must be 0 if no error occurred, or an error constant from package
|
|
||||||
// syscall (e.g., syscall.EPERM, etc). In the latter case, it's used
|
|
||||||
// as an error return from the syscall that created the notification.
|
|
||||||
// Val: return value for the syscall that created the notification. Only
|
|
||||||
// relevant if Error is 0.
|
|
||||||
// Flags: userspace notification response flag (e.g., NotifRespFlagContinue)
|
|
||||||
//
|
|
||||||
type ScmpNotifResp struct {
|
type ScmpNotifResp struct {
|
||||||
ID uint64 `json:"id,omitempty"`
|
// ID is the notification ID (must match the corresponding ScmpNotifReq ID).
|
||||||
Error int32 `json:"error,omitempty"`
|
ID uint64 `json:"id,omitempty"`
|
||||||
Val uint64 `json:"val,omitempty"`
|
// Error must be 0 if no error occurred, or an error constant from
|
||||||
|
// package syscall (e.g., syscall.EPERM, etc). In the latter case, it
|
||||||
|
// is used as an error return from the syscall that created the
|
||||||
|
// notification.
|
||||||
|
Error int32 `json:"error,omitempty"`
|
||||||
|
// Val is a return value for the syscall that created the notification.
|
||||||
|
// Only relevant if Error is 0.
|
||||||
|
Val uint64 `json:"val,omitempty"`
|
||||||
|
// Flags is userspace notification response flag (e.g., NotifRespFlagContinue).
|
||||||
Flags uint32 `json:"flags,omitempty"`
|
Flags uint32 `json:"flags,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,6 +191,14 @@ const (
|
||||||
ArchPARISC64
|
ArchPARISC64
|
||||||
// ArchRISCV64 represents RISCV64
|
// ArchRISCV64 represents RISCV64
|
||||||
ArchRISCV64
|
ArchRISCV64
|
||||||
|
// ArchLOONGARCH64 represents 64-bit LoongArch.
|
||||||
|
ArchLOONGARCH64
|
||||||
|
// ArchM68K represents 32-bit Motorola 68000.
|
||||||
|
ArchM68K
|
||||||
|
// ArchSH represents SuperH.
|
||||||
|
ArchSH
|
||||||
|
// ArchSHEB represents Big-endian SuperH.
|
||||||
|
ArchSHEB
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -306,6 +330,14 @@ func GetArchFromString(arch string) (ScmpArch, error) {
|
||||||
return ArchPARISC64, nil
|
return ArchPARISC64, nil
|
||||||
case "riscv64":
|
case "riscv64":
|
||||||
return ArchRISCV64, nil
|
return ArchRISCV64, nil
|
||||||
|
case "loong64", "loongarch64":
|
||||||
|
return ArchLOONGARCH64, nil
|
||||||
|
case "m68k":
|
||||||
|
return ArchM68K, nil
|
||||||
|
case "sh":
|
||||||
|
return ArchSH, nil
|
||||||
|
case "sheb":
|
||||||
|
return ArchSHEB, nil
|
||||||
default:
|
default:
|
||||||
return ArchInvalid, fmt.Errorf("cannot convert unrecognized string %q", arch)
|
return ArchInvalid, fmt.Errorf("cannot convert unrecognized string %q", arch)
|
||||||
}
|
}
|
||||||
|
@ -352,6 +384,14 @@ func (a ScmpArch) String() string {
|
||||||
return "parisc64"
|
return "parisc64"
|
||||||
case ArchRISCV64:
|
case ArchRISCV64:
|
||||||
return "riscv64"
|
return "riscv64"
|
||||||
|
case ArchLOONGARCH64:
|
||||||
|
return "loong64"
|
||||||
|
case ArchM68K:
|
||||||
|
return "m68k"
|
||||||
|
case ArchSH:
|
||||||
|
return "sh"
|
||||||
|
case ArchSHEB:
|
||||||
|
return "sheb"
|
||||||
case ArchNative:
|
case ArchNative:
|
||||||
return "native"
|
return "native"
|
||||||
case ArchInvalid:
|
case ArchInvalid:
|
||||||
|
@ -798,6 +838,26 @@ func (f *ScmpFilter) RemoveArch(arch ScmpArch) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Precompute precomputes the seccomp filter for later use by [Load] and
|
||||||
|
// similar functions. Not only does this improve performance of [Load],
|
||||||
|
// it also ensures that the seccomp filter can be loaded in an
|
||||||
|
// async-signal-safe manner if no changes have been made to the filter
|
||||||
|
// since it was precomputed.
|
||||||
|
func (f *ScmpFilter) Precompute() error {
|
||||||
|
f.lock.Lock()
|
||||||
|
defer f.lock.Unlock()
|
||||||
|
|
||||||
|
if !f.valid {
|
||||||
|
return errBadFilter
|
||||||
|
}
|
||||||
|
|
||||||
|
if retCode := C.seccomp_precompute(f.filterCtx); retCode != 0 {
|
||||||
|
return errRc(retCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Load loads a filter context into the kernel.
|
// Load loads a filter context into the kernel.
|
||||||
// Returns an error if the filter context is invalid or the syscall failed.
|
// Returns an error if the filter context is invalid or the syscall failed.
|
||||||
func (f *ScmpFilter) Load() error {
|
func (f *ScmpFilter) Load() error {
|
||||||
|
@ -941,6 +1001,25 @@ func (f *ScmpFilter) GetRawRC() (bool, error) {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetWaitKill returns the current state of WaitKill flag,
|
||||||
|
// or an error if an issue was encountered retrieving the value.
|
||||||
|
// See SetWaitKill for more details.
|
||||||
|
func (f *ScmpFilter) GetWaitKill() (bool, error) {
|
||||||
|
val, err := f.getFilterAttr(filterAttrWaitKill)
|
||||||
|
if err != nil {
|
||||||
|
if e := checkAPI("GetWaitKill", 7, 2, 6, 0); e != nil {
|
||||||
|
err = e
|
||||||
|
}
|
||||||
|
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if val == 0 {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
// SetBadArchAction sets the default action taken on a syscall for an
|
// SetBadArchAction sets the default action taken on a syscall for an
|
||||||
// architecture not in the filter, or an error if an issue was encountered
|
// architecture not in the filter, or an error if an issue was encountered
|
||||||
// setting the value.
|
// setting the value.
|
||||||
|
@ -1053,6 +1132,25 @@ func (f *ScmpFilter) SetRawRC(state bool) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetWaitKill sets whether libseccomp should request wait killable semantics
|
||||||
|
// when possible. Defaults to false.
|
||||||
|
func (f *ScmpFilter) SetWaitKill(state bool) error {
|
||||||
|
var toSet C.uint32_t = 0x0
|
||||||
|
|
||||||
|
if state {
|
||||||
|
toSet = 0x1
|
||||||
|
}
|
||||||
|
|
||||||
|
err := f.setFilterAttr(filterAttrWaitKill, toSet)
|
||||||
|
if err != nil {
|
||||||
|
if e := checkAPI("SetWaitKill", 7, 2, 6, 0); e != nil {
|
||||||
|
err = e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// SetSyscallPriority sets a syscall's priority.
|
// SetSyscallPriority sets a syscall's priority.
|
||||||
// This provides a hint to the filter generator in libseccomp about the
|
// This provides a hint to the filter generator in libseccomp about the
|
||||||
// importance of this syscall. High-priority syscalls are placed
|
// importance of this syscall. High-priority syscalls are placed
|
||||||
|
@ -1154,6 +1252,30 @@ func (f *ScmpFilter) ExportBPF(file *os.File) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ExportBPFMem is similar to [ExportBPF], except the data is written into
|
||||||
|
// a memory and returned as []byte.
|
||||||
|
func (f *ScmpFilter) ExportBPFMem() ([]byte, error) {
|
||||||
|
f.lock.Lock()
|
||||||
|
defer f.lock.Unlock()
|
||||||
|
|
||||||
|
if !f.valid {
|
||||||
|
return nil, errBadFilter
|
||||||
|
}
|
||||||
|
|
||||||
|
var len C.size_t
|
||||||
|
// Get the size required.
|
||||||
|
if retCode := C.seccomp_export_bpf_mem(f.filterCtx, unsafe.Pointer(nil), &len); retCode < 0 {
|
||||||
|
return nil, errRc(retCode)
|
||||||
|
}
|
||||||
|
// Get the data.
|
||||||
|
buf := make([]byte, int(len))
|
||||||
|
if retCode := C.seccomp_export_bpf_mem(f.filterCtx, unsafe.Pointer(&buf[0]), &len); retCode < 0 {
|
||||||
|
return nil, errRc(retCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Userspace Notification API
|
// Userspace Notification API
|
||||||
|
|
||||||
// GetNotifFd returns the userspace notification file descriptor associated with the given
|
// GetNotifFd returns the userspace notification file descriptor associated with the given
|
||||||
|
@ -1186,3 +1308,53 @@ func NotifRespond(fd ScmpFd, scmpResp *ScmpNotifResp) error {
|
||||||
func NotifIDValid(fd ScmpFd, id uint64) error {
|
func NotifIDValid(fd ScmpFd, id uint64) error {
|
||||||
return notifIDValid(fd, id)
|
return notifIDValid(fd, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TransactionStart starts a new seccomp filter transaction that the caller can
|
||||||
|
// use to perform any number of filter modifications which can then be
|
||||||
|
// committed to the filter using [TransactionCommit] or rejected using
|
||||||
|
// [TransactionReject]. It is important to note that transactions only affect
|
||||||
|
// the seccomp filter state while it is being managed by libseccomp; seccomp
|
||||||
|
// filters which have been loaded into the kernel can not be modified, only new
|
||||||
|
// seccomp filters can be added on top of the existing loaded filter stack.
|
||||||
|
func (f *ScmpFilter) TransactionStart() error {
|
||||||
|
f.lock.Lock()
|
||||||
|
defer f.lock.Unlock()
|
||||||
|
|
||||||
|
if !f.valid {
|
||||||
|
return errBadFilter
|
||||||
|
}
|
||||||
|
|
||||||
|
if retCode := C.seccomp_transaction_start(f.filterCtx); retCode < 0 {
|
||||||
|
return errRc(retCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// TransactionReject rejects a transaction started by [TransactionStart].
|
||||||
|
func (f *ScmpFilter) TransactionReject() {
|
||||||
|
f.lock.Lock()
|
||||||
|
defer f.lock.Unlock()
|
||||||
|
|
||||||
|
if !f.valid {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
C.seccomp_transaction_reject(f.filterCtx)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TransactionCommit commits a transaction started by [TransactionStart].
|
||||||
|
func (f *ScmpFilter) TransactionCommit() error {
|
||||||
|
f.lock.Lock()
|
||||||
|
defer f.lock.Unlock()
|
||||||
|
|
||||||
|
if !f.valid {
|
||||||
|
return errBadFilter
|
||||||
|
}
|
||||||
|
|
||||||
|
if retCode := C.seccomp_transaction_commit(f.filterCtx); retCode < 0 {
|
||||||
|
return errRc(retCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -68,6 +68,22 @@ const uint32_t C_ARCH_BAD = ARCH_BAD;
|
||||||
#define SCMP_ARCH_RISCV64 ARCH_BAD
|
#define SCMP_ARCH_RISCV64 ARCH_BAD
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef SCMP_ARCH_LOONGARCH64
|
||||||
|
#define SCMP_ARCH_LOONGARCH64 ARCH_BAD
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SCMP_ARCH_M68K
|
||||||
|
#define SCMP_ARCH_M68K ARCH_BAD
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SCMP_ARCH_SH
|
||||||
|
#define SCMP_ARCH_SH ARCH_BAD
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SCMP_ARCH_SHEB
|
||||||
|
#define SCMP_ARCH_SHEB ARCH_BAD
|
||||||
|
#endif
|
||||||
|
|
||||||
const uint32_t C_ARCH_NATIVE = SCMP_ARCH_NATIVE;
|
const uint32_t C_ARCH_NATIVE = SCMP_ARCH_NATIVE;
|
||||||
const uint32_t C_ARCH_X86 = SCMP_ARCH_X86;
|
const uint32_t C_ARCH_X86 = SCMP_ARCH_X86;
|
||||||
const uint32_t C_ARCH_X86_64 = SCMP_ARCH_X86_64;
|
const uint32_t C_ARCH_X86_64 = SCMP_ARCH_X86_64;
|
||||||
|
@ -88,6 +104,10 @@ const uint32_t C_ARCH_S390X = SCMP_ARCH_S390X;
|
||||||
const uint32_t C_ARCH_PARISC = SCMP_ARCH_PARISC;
|
const uint32_t C_ARCH_PARISC = SCMP_ARCH_PARISC;
|
||||||
const uint32_t C_ARCH_PARISC64 = SCMP_ARCH_PARISC64;
|
const uint32_t C_ARCH_PARISC64 = SCMP_ARCH_PARISC64;
|
||||||
const uint32_t C_ARCH_RISCV64 = SCMP_ARCH_RISCV64;
|
const uint32_t C_ARCH_RISCV64 = SCMP_ARCH_RISCV64;
|
||||||
|
const uint32_t C_ARCH_LOONGARCH64 = SCMP_ARCH_LOONGARCH64;
|
||||||
|
const uint32_t C_ARCH_M68K = SCMP_ARCH_M68K;
|
||||||
|
const uint32_t C_ARCH_SH = SCMP_ARCH_SH;
|
||||||
|
const uint32_t C_ARCH_SHEB = SCMP_ARCH_SHEB;
|
||||||
|
|
||||||
#ifndef SCMP_ACT_LOG
|
#ifndef SCMP_ACT_LOG
|
||||||
#define SCMP_ACT_LOG 0x7ffc0000U
|
#define SCMP_ACT_LOG 0x7ffc0000U
|
||||||
|
@ -128,6 +148,11 @@ const uint32_t C_ACT_NOTIFY = SCMP_ACT_NOTIFY;
|
||||||
#define SCMP_FLTATR_API_SYSRAWRC _SCMP_FLTATR_MIN
|
#define SCMP_FLTATR_API_SYSRAWRC _SCMP_FLTATR_MIN
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Added in libseccomp v2.6.0.
|
||||||
|
#if SCMP_VER_MAJOR == 2 && SCMP_VER_MINOR < 6
|
||||||
|
#define SCMP_FLTATR_CTL_WAITKILL _SCMP_FLTATR_MIN
|
||||||
|
#endif
|
||||||
|
|
||||||
const uint32_t C_ATTRIBUTE_DEFAULT = (uint32_t)SCMP_FLTATR_ACT_DEFAULT;
|
const uint32_t C_ATTRIBUTE_DEFAULT = (uint32_t)SCMP_FLTATR_ACT_DEFAULT;
|
||||||
const uint32_t C_ATTRIBUTE_BADARCH = (uint32_t)SCMP_FLTATR_ACT_BADARCH;
|
const uint32_t C_ATTRIBUTE_BADARCH = (uint32_t)SCMP_FLTATR_ACT_BADARCH;
|
||||||
const uint32_t C_ATTRIBUTE_NNP = (uint32_t)SCMP_FLTATR_CTL_NNP;
|
const uint32_t C_ATTRIBUTE_NNP = (uint32_t)SCMP_FLTATR_CTL_NNP;
|
||||||
|
@ -136,6 +161,7 @@ const uint32_t C_ATTRIBUTE_LOG = (uint32_t)SCMP_FLTATR_CTL_LOG;
|
||||||
const uint32_t C_ATTRIBUTE_SSB = (uint32_t)SCMP_FLTATR_CTL_SSB;
|
const uint32_t C_ATTRIBUTE_SSB = (uint32_t)SCMP_FLTATR_CTL_SSB;
|
||||||
const uint32_t C_ATTRIBUTE_OPTIMIZE = (uint32_t)SCMP_FLTATR_CTL_OPTIMIZE;
|
const uint32_t C_ATTRIBUTE_OPTIMIZE = (uint32_t)SCMP_FLTATR_CTL_OPTIMIZE;
|
||||||
const uint32_t C_ATTRIBUTE_SYSRAWRC = (uint32_t)SCMP_FLTATR_API_SYSRAWRC;
|
const uint32_t C_ATTRIBUTE_SYSRAWRC = (uint32_t)SCMP_FLTATR_API_SYSRAWRC;
|
||||||
|
const uint32_t C_ATTRIBUTE_WAITKILL = (uint32_t)SCMP_FLTATR_CTL_WAITKILL;
|
||||||
|
|
||||||
const int C_CMP_NE = (int)SCMP_CMP_NE;
|
const int C_CMP_NE = (int)SCMP_CMP_NE;
|
||||||
const int C_CMP_LT = (int)SCMP_CMP_LT;
|
const int C_CMP_LT = (int)SCMP_CMP_LT;
|
||||||
|
@ -145,11 +171,6 @@ const int C_CMP_GE = (int)SCMP_CMP_GE;
|
||||||
const int C_CMP_GT = (int)SCMP_CMP_GT;
|
const int C_CMP_GT = (int)SCMP_CMP_GT;
|
||||||
const int C_CMP_MASKED_EQ = (int)SCMP_CMP_MASKED_EQ;
|
const int C_CMP_MASKED_EQ = (int)SCMP_CMP_MASKED_EQ;
|
||||||
|
|
||||||
const int C_VERSION_MAJOR = SCMP_VER_MAJOR;
|
|
||||||
const int C_VERSION_MINOR = SCMP_VER_MINOR;
|
|
||||||
const int C_VERSION_MICRO = SCMP_VER_MICRO;
|
|
||||||
|
|
||||||
#if SCMP_VER_MAJOR == 2 && SCMP_VER_MINOR >= 3
|
|
||||||
unsigned int get_major_version()
|
unsigned int get_major_version()
|
||||||
{
|
{
|
||||||
return seccomp_version()->major;
|
return seccomp_version()->major;
|
||||||
|
@ -164,22 +185,6 @@ unsigned int get_micro_version()
|
||||||
{
|
{
|
||||||
return seccomp_version()->micro;
|
return seccomp_version()->micro;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
unsigned int get_major_version()
|
|
||||||
{
|
|
||||||
return (unsigned int)C_VERSION_MAJOR;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int get_minor_version()
|
|
||||||
{
|
|
||||||
return (unsigned int)C_VERSION_MINOR;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int get_micro_version()
|
|
||||||
{
|
|
||||||
return (unsigned int)C_VERSION_MICRO;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// The libseccomp API level functions were added in v2.4.0
|
// The libseccomp API level functions were added in v2.4.0
|
||||||
#if SCMP_VER_MAJOR == 2 && SCMP_VER_MINOR < 4
|
#if SCMP_VER_MAJOR == 2 && SCMP_VER_MINOR < 4
|
||||||
|
@ -284,6 +289,7 @@ const (
|
||||||
filterAttrSSB
|
filterAttrSSB
|
||||||
filterAttrOptimize
|
filterAttrOptimize
|
||||||
filterAttrRawRC
|
filterAttrRawRC
|
||||||
|
filterAttrWaitKill
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -291,7 +297,7 @@ const (
|
||||||
scmpError C.int = -1
|
scmpError C.int = -1
|
||||||
// Comparison boundaries to check for architecture validity
|
// Comparison boundaries to check for architecture validity
|
||||||
archStart ScmpArch = ArchNative
|
archStart ScmpArch = ArchNative
|
||||||
archEnd ScmpArch = ArchRISCV64
|
archEnd ScmpArch = ArchSHEB
|
||||||
// Comparison boundaries to check for action validity
|
// Comparison boundaries to check for action validity
|
||||||
actionStart ScmpAction = ActKillThread
|
actionStart ScmpAction = ActKillThread
|
||||||
actionEnd ScmpAction = ActKillProcess
|
actionEnd ScmpAction = ActKillProcess
|
||||||
|
@ -552,6 +558,14 @@ func archFromNative(a C.uint32_t) (ScmpArch, error) {
|
||||||
return ArchPARISC64, nil
|
return ArchPARISC64, nil
|
||||||
case C.C_ARCH_RISCV64:
|
case C.C_ARCH_RISCV64:
|
||||||
return ArchRISCV64, nil
|
return ArchRISCV64, nil
|
||||||
|
case C.C_ARCH_LOONGARCH64:
|
||||||
|
return ArchLOONGARCH64, nil
|
||||||
|
case C.C_ARCH_M68K:
|
||||||
|
return ArchM68K, nil
|
||||||
|
case C.C_ARCH_SH:
|
||||||
|
return ArchSH, nil
|
||||||
|
case C.C_ARCH_SHEB:
|
||||||
|
return ArchSHEB, nil
|
||||||
default:
|
default:
|
||||||
return 0x0, fmt.Errorf("unrecognized architecture %#x", uint32(a))
|
return 0x0, fmt.Errorf("unrecognized architecture %#x", uint32(a))
|
||||||
}
|
}
|
||||||
|
@ -598,6 +612,14 @@ func (a ScmpArch) toNative() C.uint32_t {
|
||||||
return C.C_ARCH_PARISC64
|
return C.C_ARCH_PARISC64
|
||||||
case ArchRISCV64:
|
case ArchRISCV64:
|
||||||
return C.C_ARCH_RISCV64
|
return C.C_ARCH_RISCV64
|
||||||
|
case ArchLOONGARCH64:
|
||||||
|
return C.C_ARCH_LOONGARCH64
|
||||||
|
case ArchM68K:
|
||||||
|
return C.C_ARCH_M68K
|
||||||
|
case ArchSH:
|
||||||
|
return C.C_ARCH_SH
|
||||||
|
case ArchSHEB:
|
||||||
|
return C.C_ARCH_SHEB
|
||||||
case ArchNative:
|
case ArchNative:
|
||||||
return C.C_ARCH_NATIVE
|
return C.C_ARCH_NATIVE
|
||||||
default:
|
default:
|
||||||
|
@ -694,6 +716,8 @@ func (a scmpFilterAttr) toNative() uint32 {
|
||||||
return uint32(C.C_ATTRIBUTE_OPTIMIZE)
|
return uint32(C.C_ATTRIBUTE_OPTIMIZE)
|
||||||
case filterAttrRawRC:
|
case filterAttrRawRC:
|
||||||
return uint32(C.C_ATTRIBUTE_SYSRAWRC)
|
return uint32(C.C_ATTRIBUTE_SYSRAWRC)
|
||||||
|
case filterAttrWaitKill:
|
||||||
|
return uint32(C.C_ATTRIBUTE_WAITKILL)
|
||||||
default:
|
default:
|
||||||
return 0x0
|
return 0x0
|
||||||
}
|
}
|
||||||
|
@ -794,10 +818,7 @@ func notifReceive(fd ScmpFd) (*ScmpNotifReq, error) {
|
||||||
if retCode := C.seccomp_notify_alloc(&req, &resp); retCode != 0 {
|
if retCode := C.seccomp_notify_alloc(&req, &resp); retCode != 0 {
|
||||||
return nil, errRc(retCode)
|
return nil, errRc(retCode)
|
||||||
}
|
}
|
||||||
|
defer C.seccomp_notify_free(req, resp)
|
||||||
defer func() {
|
|
||||||
C.seccomp_notify_free(req, resp)
|
|
||||||
}()
|
|
||||||
|
|
||||||
for {
|
for {
|
||||||
retCode, errno := C.seccomp_notify_receive(C.int(fd), req)
|
retCode, errno := C.seccomp_notify_receive(C.int(fd), req)
|
||||||
|
@ -831,10 +852,7 @@ func notifRespond(fd ScmpFd, scmpResp *ScmpNotifResp) error {
|
||||||
if retCode := C.seccomp_notify_alloc(&req, &resp); retCode != 0 {
|
if retCode := C.seccomp_notify_alloc(&req, &resp); retCode != 0 {
|
||||||
return errRc(retCode)
|
return errRc(retCode)
|
||||||
}
|
}
|
||||||
|
defer C.seccomp_notify_free(req, resp)
|
||||||
defer func() {
|
|
||||||
C.seccomp_notify_free(req, resp)
|
|
||||||
}()
|
|
||||||
|
|
||||||
scmpResp.toNative(resp)
|
scmpResp.toNative(resp)
|
||||||
|
|
||||||
|
|
|
@ -39,8 +39,8 @@ github.com/opencontainers/runtime-spec/specs-go
|
||||||
# github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2
|
# github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2
|
||||||
## explicit
|
## explicit
|
||||||
github.com/pmezard/go-difflib/difflib
|
github.com/pmezard/go-difflib/difflib
|
||||||
# github.com/seccomp/libseccomp-golang v0.10.0
|
# github.com/seccomp/libseccomp-golang v0.11.1
|
||||||
## explicit; go 1.14
|
## explicit; go 1.19
|
||||||
github.com/seccomp/libseccomp-golang
|
github.com/seccomp/libseccomp-golang
|
||||||
# github.com/sirupsen/logrus v1.9.3
|
# github.com/sirupsen/logrus v1.9.3
|
||||||
## explicit; go 1.13
|
## explicit; go 1.13
|
||||||
|
|
Loading…
Reference in New Issue