use seccompiler::SeccompCmpOp::Eq;
use seccompiler::{
BpfProgram, SeccompAction, SeccompCmpArgLen as ArgLen, SeccompCondition as Cond, SeccompFilter,
SeccompRule,
};
use crate::sandbox::ExtraAllowedSyscall;
use crate::{and, or, Result};
fn syscalls_allowlist() -> Result<Vec<(i64, Vec<SeccompRule>)>> {
Ok(vec![
(libc::SYS_sigaltstack, vec![]),
(libc::SYS_munmap, vec![]),
(libc::SYS_rt_sigprocmask, vec![]),
(libc::SYS_madvise, vec![]),
(libc::SYS_exit, vec![]),
(libc::SYS_rt_sigaction, vec![]),
(
libc::SYS_write,
or![
and![Cond::new(0, ArgLen::Dword, Eq, 1)?], and![Cond::new(0, ArgLen::Dword, Eq, 2)?], ],
),
(libc::SYS_rt_sigreturn, vec![]),
(
libc::SYS_ioctl,
or![and![Cond::new(1, ArgLen::Dword, Eq, libc::TCGETS)?]],
),
(libc::SYS_futex, vec![]),
(libc::SYS_sched_yield, vec![]),
])
}
pub(crate) fn get_seccomp_filter_for_host_function_worker_thread(
extra_allowed_syscalls: Option<Vec<ExtraAllowedSyscall>>,
) -> Result<BpfProgram> {
let mut allowed_syscalls = syscalls_allowlist()?;
if let Some(extra_allowed_syscalls) = extra_allowed_syscalls {
allowed_syscalls.extend(
extra_allowed_syscalls
.into_iter()
.map(|syscall| (syscall, vec![])),
);
allowed_syscalls.sort_by(|a, b| a.0.cmp(&b.0));
allowed_syscalls.dedup();
}
Ok(SeccompFilter::new(
allowed_syscalls.into_iter().collect(),
SeccompAction::Trap, SeccompAction::Allow, std::env::consts::ARCH.try_into().unwrap(),
)
.and_then(|filter| filter.try_into())?)
}