use std::{
os::{
fd::{AsRawFd, BorrowedFd, RawFd},
unix::ffi::OsStrExt,
},
sync::{LazyLock, OnceLock},
time::Duration,
};
use btoi::btoi;
use nix::{
errno::Errno,
fcntl::OFlag,
sys::{personality::Persona, stat::Mode},
unistd::{close, sysconf, Gid, SysconfVar, Uid},
};
use crate::{
compat::{STATX_MNT_ID, STATX_MNT_ID_UNIQUE, STATX_MODE},
confine::check_cross_memory_attach,
fs::{is_dev_null, FileMap, FileMapEntry, FileType},
fstatx, info,
path::{XPath, XPathBuf},
proc::proc_mmap_min_addr,
rng::{duprand, randint},
sandbox::Version,
sysinfo::RandTimer,
};
type KeyValue<'a> = (&'a str, u64);
pub const PATH_ETC: &[u8] = b"/etc";
pub const SYD_SH: &str = "/bin/sh";
pub const ESYD_SH: &str = include_str!("esyd.sh");
pub const SYD_EL: &str = include_str!("syd.el");
pub const ENV_ASSUME_KERNEL: &str = "SYD_ASSUME_KERNEL";
pub const ENV_SH: &str = "SYD_SHELL";
pub const ENV_LOG: &str = "SYD_LOG";
pub const ENV_LOG_FD: &str = "SYD_LOG_FD";
pub const ENV_LOG_BUF_LEN: &str = "SYD_LOG_BUF_LEN";
pub const ENV_NPROC: &str = "SYD_NPROC";
pub const ENV_NPROC_MAX: &str = "SYD_NPROC_MAX";
pub const ENV_PID_FN: &str = "SYD_PID_FN";
pub const ENV_FORCE_NOXDEV: &str = "SYD_FORCE_NOXDEV";
pub const ENV_FORCE_RANDFD: &str = "SYD_FORCE_RANDFD";
pub const ENV_FORCE_TTY: &str = "SYD_FORCE_TTY";
pub const ENV_QUIET_TTY: &str = "SYD_QUIET_TTY";
pub const ENV_PTY_FD: &str = "SYD_PTY_FD";
pub const ENV_IPC: &str = "SYD_IPC";
pub const ENV_IPC_POLL_FD: &str = "SYD_IPC_POLL_FD";
pub const ENV_IPC_UNIX_FD: &str = "SYD_IPC_UNIX_FD";
pub const ENV_PROXY_HOST: &str = "SYD_PROXY_HOST";
pub const ENV_PROXY_PORT: &str = "SYD_PROXY_PORT";
pub const ENV_PROXY_UNIX: &str = "SYD_PROXY_UNIX";
pub const ENV_NO_CROSS_MEMORY_ATTACH: &str = "SYD_NO_CROSS_MEMORY_ATTACH";
pub const ENV_PROC_PID_MEM_FALLBACK: &str = "SYD_PROC_PID_MEM_FALLBACK";
pub const ENV_DUMP_SCMP: &str = "SYD_DUMP_SCMP";
pub const ENV_SKIP_SCMP: &str = "SYD_SKIP_SCMP";
pub const ENV_QUICK_BOOT: &str = "SYD_QUICK_BOOT";
pub const ENV_RAND: &str = "SYD_RAND";
pub const ENV_SING: &str = "SYD_SING";
pub const ENV_ID: &str = "SYD_ID";
pub const ENV_OCI_NO_CONFIG: &str = "SYD_OCI_NO_CONFIG";
pub const ENV_PDS: &str = "SYD_PDS";
pub const UID_MIN: Uid = Uid::from_raw(11);
pub const GID_MIN: Gid = Gid::from_raw(14);
pub const MAGIC_PREFIX: &[u8] = b"/dev/syd";
pub static VERSION: LazyLock<&'static str> = LazyLock::new(|| {
if env!("SYD_GIT_HEAD").is_empty() {
env!("CARGO_PKG_VERSION")
} else {
env!("SYD_GIT_HEAD")
}
});
pub const API_VERSION: Version = Version::new(3, 1);
pub const API_MAJOR_VERSION: &str = env!("CARGO_PKG_VERSION_MAJOR");
pub const API_MINOR_VERSION: &str = "1";
pub const IPC_MINOR_VERSION: &str = "1";
pub const CRYPT_MAGIC: &[u8] = &[0x7F, b'S', b'Y', b'D', 3];
pub const MAGIC_FILE: &[u8] = b"/dev/null";
pub const PATH_MAX_COMP: usize = 128;
pub const DIRENT_BUF_SIZE: usize = 2048;
#[expect(clippy::cast_sign_loss)]
pub static PAGE_SIZE: LazyLock<u64> = LazyLock::new(|| {
sysconf(SysconfVar::PAGE_SIZE)
.unwrap_or(Some(4096))
.unwrap_or(4096) as u64
});
pub const KCAPI_SIZE: usize = 16 * libc::PIPE_BUF;
pub const PIPE_BUF: usize = 16 * libc::PIPE_BUF;
pub const PIPE_BUF_ALG: usize = 15 * libc::PIPE_BUF;
pub static NPROC: LazyLock<usize> = LazyLock::new(num_cpus::get);
#[expect(clippy::disallowed_methods)]
pub static EMU_POOL_SIZE: LazyLock<usize> = LazyLock::new(|| {
let n = std::env::var_os(ENV_NPROC)
.map(|val| btoi::<usize>(val.as_bytes()).expect("SYD_NPROC"))
.unwrap_or_else(|| *NPROC);
assert!(n >= 1, "SYD_NPROC must be at least 1!");
n
});
#[expect(clippy::disallowed_methods)]
pub static EMU_MAX_SIZE: LazyLock<usize> = LazyLock::new(|| {
let n = std::env::var_os(ENV_NPROC_MAX)
.map(|val| btoi::<usize>(val.as_bytes()).expect("SYD_NPROC_MAX"))
.unwrap_or(usize::MAX);
assert!(
n > *EMU_POOL_SIZE,
"SYD_NPROC_MAX must be greater than SYD_NPROC!"
);
n
});
pub const EMU_KEEP_ALIVE: u16 = 3;
pub const MON_GRACE_TIME: Duration = Duration::from_millis(250);
pub const MON_CYCLE_TIME: Duration = Duration::from_millis(25);
pub const INT_CYCLE_TIME: Duration = Duration::from_millis(10);
pub const EMU_STACK_SIZE: usize = 208 * 1024;
pub const MON_STACK_SIZE: usize = 128 * 1024;
pub const INT_STACK_SIZE: usize = 128 * 1024;
pub const IPC_STACK_SIZE: usize = 256 * 1024;
pub const AES_STACK_SIZE: usize = 96 * 1024;
pub const MINI_STACK_SIZE: usize = 8 * 1024;
pub const CHLD_STACK_SIZE: usize = 2 * 1024 * 1024;
#[cfg(target_arch = "x86_64")]
const SYSLOG_CAPSHIFT: usize = 18;
#[cfg(target_arch = "x86")]
const SYSLOG_CAPSHIFT: usize = 18;
#[cfg(target_arch = "aarch64")]
const SYSLOG_CAPSHIFT: usize = 14;
#[cfg(target_arch = "arm")]
const SYSLOG_CAPSHIFT: usize = 13;
#[cfg(target_arch = "riscv64")]
const SYSLOG_CAPSHIFT: usize = 14;
#[cfg(any(target_arch = "powerpc", target_arch = "powerpc64"))]
const SYSLOG_CAPSHIFT: usize = 18;
#[cfg(target_arch = "s390x")]
const SYSLOG_CAPSHIFT: usize = 17;
#[cfg(not(any(
target_arch = "x86_64",
target_arch = "x86",
target_arch = "aarch64",
target_arch = "arm",
target_arch = "s390x",
target_arch = "riscv64",
target_arch = "powerpc",
target_arch = "powerpc64",
)))]
const SYSLOG_CAPSHIFT: usize = 14;
pub const SYSLOG_STACK_SIZE: usize = 1 << SYSLOG_CAPSHIFT;
pub const SYSLOG_CAPACITY: usize = 2 * 1024 * 1024;
pub const SEGVGUARD_EXPIRY: Duration = Duration::from_secs(2 * 60);
pub const SEGVGUARD_SUSPENSION: Duration = Duration::from_secs(10 * 60);
pub const SEGVGUARD_MAXCRASHES: u8 = 5;
pub const SAFE_PERSONAS: &[KeyValue] = &[
("PER_LINUX", 0x0000),
("PER_LINUX32", 0x0800000),
("UNAME26", 0x0020000),
("PER_LINUX32|UNAME26", 0x0800000 | 0x0020000),
("GET_PERSONALITY", 0xffffffff),
];
pub const UNSAFE_PERSONAS: &[Persona] = &[Persona::READ_IMPLIES_EXEC, Persona::ADDR_NO_RANDOMIZE];
pub const ALLOWLIST_MADVISE: &[KeyValue] = &[
("MADV_NORMAL", libc::MADV_NORMAL as u64),
("MADV_SEQUENTIAL", libc::MADV_SEQUENTIAL as u64),
("MADV_DONTNEED", libc::MADV_DONTNEED as u64),
("MADV_REMOVE", libc::MADV_REMOVE as u64),
("MADV_HUGEPAGE", libc::MADV_HUGEPAGE as u64),
("MADV_NOHUGEPAGE", libc::MADV_NOHUGEPAGE as u64),
("MADV_DONTDUMP", libc::MADV_DONTDUMP as u64),
("MADV_COLLAPSE", 25),
("MADV_POPULATE_READ", libc::MADV_POPULATE_READ as u64),
("MADV_POPULATE_WRITE", libc::MADV_POPULATE_WRITE as u64),
("MADV_GUARD_INSTALL", 102),
("MADV_GUARD_REMOVE", 103),
];
pub const NOOP_MADVISE: &[u64] = &[
libc::MADV_RANDOM as u64,
libc::MADV_WILLNEED as u64,
libc::MADV_DONTFORK as u64,
libc::MADV_DOFORK as u64,
libc::MADV_MERGEABLE as u64,
libc::MADV_UNMERGEABLE as u64,
libc::MADV_SOFT_OFFLINE as u64,
libc::MADV_DODUMP as u64,
libc::MADV_FREE as u64,
libc::MADV_WIPEONFORK as u64,
libc::MADV_KEEPONFORK as u64,
libc::MADV_COLD as u64,
libc::MADV_PAGEOUT as u64,
];
pub const DENY_MADVISE: &[u64] = &[libc::MADV_HWPOISON as u64];
pub const SYD_MADVISE: &[u64] = &[
libc::MADV_DONTNEED as u64,
libc::MADV_FREE as u64,
libc::MADV_HUGEPAGE as u64,
102, 103, ];
pub const ALLOWLIST_PRCTL: &[KeyValue] = &[
("PR_SET_PDEATHSIG", 1),
("PR_GET_PDEATHSIG", 2),
("PR_GET_DUMPABLE", 3),
("PR_SET_DUMPABLE", 4),
("PR_GET_ALIGN", 5),
("PR_GET_SETALIGN", 6),
("PR_GET_KEEPCAPS", 7),
("PR_SET_KEEPCAPS", 8),
("PR_GET_FPEMU", 9),
("PR_SET_FPEMU", 10),
("PR_GET_FPEXC", 11),
("PR_SET_FPEXC", 12),
("PR_GET_TIMING", 13),
("PR_SET_TIMING", 14),
("PR_SET_NAME", 15),
("PR_GET_NAME", 16),
("PR_GET_ENDIAN", 19),
("PR_SET_ENDIAN", 20),
("PR_GET_SECCOMP", 21), ("PR_SET_SECCOMP", 22), ("PR_CAPBSET_READ", 23),
("PR_CAPBSET_DROP", 24),
("PR_GET_TSC", 25),
("PR_SET_TSC", 26),
("PR_GET_SECUREBITS", 27),
("PR_SET_SECUREBITS", 28),
("PR_SET_TIMERSLACK", 29),
("PR_GET_TIMERSLACK", 30),
("PR_TASK_PERF_EVENTS_DISABLE", 31), ("PR_TASK_PERF_EVENTS_ENABLE", 32), ("PR_MCE_KILL", 33),
("PR_MCE_KILL_GET", 34),
("PR_SET_CHILD_SUBREAPER", 36),
("PR_GET_CHILD_SUBREAPER", 37),
("PR_SET_NO_NEW_PRIVS", 38),
("PR_GET_NO_NEW_PRIVS", 39),
("PR_GET_TID_ADDRESS", 40),
("PR_SET_THP_DISABLE", 41),
("PR_GET_THP_DISABLE", 42),
("PR_SET_FP_MODE", 45),
("PR_GET_FP_MODE", 46),
("PR_CAP_AMBIENT", 47),
("PR_SVE_SET_VL", 50),
("PR_SVE_GET_VL", 51),
("PR_GET_SPECULATION_CTRL", 52), ("PR_SET_SPECULATION_CTRL", 53), ("PR_PAC_RESET_KEYS", 54),
("PR_SET_TAGGED_ADDR_CTRL", 55),
("PR_GET_TAGGED_ADDR_CTRL", 56),
("PR_SET_IO_FLUSHER", 57),
("PR_GET_IO_FLUSHER", 58),
("PR_SET_SYSCALL_USER_DISPATCH", 59),
("PR_PAC_SET_ENABLED_KEYS", 60),
("PR_PAC_GET_ENABLED_KEYS", 61),
("PR_SCHED_CORE", 62),
("PR_SET_MDWE", 65),
("PR_GET_MDWE", 66),
("PR_SET_VMA", 0x53564d41),
];
pub const UNSAFE_ENV: &[&[u8]] = &[
b"GCONV_PATH",
b"GETCONF_DIR",
b"GLIBC_TUNABLES",
b"HOSTALIASES",
b"LD_AOUT_LIBRARY_PATH",
b"LD_AOUT_PRELOAD",
b"LD_AUDIT",
b"LD_BIND_NOT",
b"LD_DEBUG",
b"LD_DEBUG",
b"LD_DEBUG_OUTPUT",
b"LD_DYNAMIC_WEAK",
b"LD_DYNAMIC_WEAK",
b"LD_ELF_HINTS_PATH",
b"LD_HWCAP_MASK",
b"LD_LIBMAP",
b"LD_LIBMAP_DISABLE",
b"LD_LIBRARY_PATH",
b"LD_LIBRARY_PATH_FDS",
b"LD_LIBRARY_PATH_RPATH",
b"LD_LOADFLTR",
b"LD_ORIGIN_PATH",
b"LD_PREFER_MAP_32BIT_EXEC",
b"LD_PRELOAD",
b"LD_PRELOAD_FDS",
b"LD_PROFILE",
b"LD_SHOW_AUXV",
b"LD_USE_LOAD_BIAS",
b"LOCALDOMAIN",
b"LOCPATH",
b"MALLOC_TRACE",
b"MUSL_LOCPATH",
b"NIS_PATH",
b"NLSPATH",
b"RESOLV_HOST_CONF",
b"RES_OPTIONS",
b"TMPDIR",
b"TZ",
b"TZDIR",
b"LANG",
b"LC_CTYPE",
b"LC_NUMERIC",
b"LC_TIME",
b"LC_COLLATE",
b"LC_MONETARY",
b"LC_MESSAGES",
b"LC_PAPER",
b"LC_NAME",
b"LC_ADDRESS",
b"LC_TELEPHONE",
b"LC_MEASUREMENT",
b"LC_IDENTIFICATION",
b"LC_ALL",
];
pub const DEFAULT_IOCTL: &[(&str, bool)] = &[
("FIOCLEX", false),
("FIONCLEX", false),
("FIONBIO", false),
("FIONREAD", false),
("FIOASYNC", false),
("FIOQSIZE", false),
("FIFREEZE", true), ("FITHAW", true), ("FS_IOC_FIEMAP", true), ("FIGETBSZ", true), ("FICLONE", false),
("FICLONERANGE", false),
("FIDEDUPERANGE", false),
("FS_IOC_GETFSUUID", true), ("FS_IOC_GETFSSYSFSPATH", true), ("FIBMAP", true), ("KDSETKEYCODE", true),
("KDSIGACCEPT", true),
("TIOCSETD", true),
("TIOCSTI", true),
("TIOCCONS", true),
("TIOCLINUX", true),
("FS_IOC_FSGETXATTR", true), ("FS_IOC_FSSETXATTR", true), ("FS_IOC_SETFLAGS", true), ("RNDGETENTCNT", false), ("RNDADDTOENTCNT", true), ("RNDGETPOOL", true), ("RNDADDENTROPY", true), ("RNDZAPENTCNT", true), ("RNDCLEARPOOL", true), ("SECCOMP_IOCTL_NOTIF_RECV", true),
("SECCOMP_IOCTL_NOTIF_SEND", true),
("SECCOMP_IOCTL_NOTIF_ID_VALID", true),
("SECCOMP_IOCTL_NOTIF_ADDFD", true),
("SECCOMP_IOCTL_NOTIF_SET_FLAGS", true),
];
pub const PROFILE_OFF: &[&str] = &["sandbox/all:off", "sandbox/net,mem,pid,pty,force,tpe:off"];
pub const PROFILE_LIB: &[&str] = &["include_profile off", "lock:exec"];
pub const PROFILE_QUIET: &[&str] = &[
"default/all:filter",
"default/net,block,mem,pid,force,segvguard,tpe:filter",
];
pub const PROFILE_TRACE: &[&str] = &[
"log/level:info",
"sandbox/force:on",
"default/all,force,tpe:warn",
];
pub const PROFILE_OCI: &[&str] = &[
"include_profile nopie", "include_profile trace",
"lock:off", "trace/allow_safe_syslog:true",
];
pub const PROFILE_ENFORCE: &[&str] = &[
"default/all,net,force,tpe:deny",
"trace/allow_safe_syslog:false",
"trace/allow_unsafe_exec_nopie:false",
"lock:exec", ];
pub const PROFILE_NOIPV4: &[&str] = &[
"sandbox/net:on",
"allow/cnet+any6!0-65535",
"deny/cnet+any4!0-65535",
];
pub const PROFILE_NOIPV6: &[&str] = &[
"sandbox/net:on",
"allow/cnet+any4!0-65535",
"deny/cnet+any6!0-65535",
];
pub const PROFILE_PRIVILEGED: &[&str] = &["trace/allow_unsafe_caps:true"];
pub const PROFILE_CORE: &[&str] = &["trace/allow_unsafe_prlimit:true"];
pub const PROFILE_DEBUG: &[&str] = &[
"trace/allow_unsafe_dumpable:true", "trace/allow_unsafe_magiclinks:true", "trace/allow_unsafe_exec_memory:true", "trace/allow_unsafe_prctl:true", "trace/allow_unsafe_prlimit:true", "trace/allow_unsafe_ptrace:true", ];
pub const PROFILE_NOMEM: &[&str] = &["trace/allow_unsafe_exec_memory:true"];
pub const PROFILE_NOPIE: &[&str] = &["trace/allow_unsafe_exec_nopie:true"];
pub const PROFILE_RAND: &[&str] = &["trace/force_rand_fd:true"];
pub const PROFILE_FIREFOX: &[&str] = &[
"sandbox/pty:off", "trace/allow_unsafe_exec_libc:true", "trace/allow_unsafe_exec_memory:true", "trace/allow_unsafe_page_cache:true", ];
pub const PROFILE_READONLY: &[&str] = &["deny/cpath,wpath+/***"];
pub const PROFILE_CONTAINER: &[&str] = &[
"unshare/all:true",
"allow/lpath,rpath+/proc/uptime", ];
pub const PROFILE_IMMUTABLE: &[&str] = &[
"include_profile container",
"bind+/opt:/opt:ro,nodev,nosuid,nosymfollow",
"bind+/usr:/usr:ro,nodev,nosuid,nosymfollow",
"bind+/etc:/etc:ro,nodev,nosuid,noexec,nosymfollow",
"bind+/mnt:/mnt:ro,nodev,nosuid,noexec,nosymfollow",
"bind+/srv:/srv:ro,nodev,nosuid,noexec,nosymfollow",
"bind+/home:/home:ro,nodev,nosuid,noexec,nosymfollow",
"bind+tmpfs:/boot:ro,nodev,nosuid,noexec,nosymfollow,mode=0",
"bind+tmpfs:/run:nodev,nosuid,nosymfollow,mode=1777",
"bind+tmpfs:/tmp:nodev,nosuid,nosymfollow,mode=1777",
"bind+tmpfs:/dev/shm:nodev,nosuid,noexec,nosymfollow,mode=1777",
];
pub const PROFILE_LANDLOCK: &[&str] = &[
"sandbox/lock:on",
"allow/lock/rpath+/dev",
"allow/lock/rpath,exec+/etc",
"allow/lock/rpath,exec+/bin",
"allow/lock/rpath,exec+/sbin",
"allow/lock/rpath,exec+/lib",
"allow/lock/rpath,exec+/opt",
"allow/lock/rpath,exec+/usr",
"allow/lock/rpath+/run",
"allow/lock/rpath+/var",
"allow/lock/read,ioctl,write+/dev/full",
"allow/lock/read,ioctl+/dev/random",
"allow/lock/read,ioctl+/dev/urandom",
"allow/lock/read,ioctl+/dev/zero",
"allow/lock/rpath,cpath,wpath,tpath+/dev/shm",
"allow/lock/rpath,cpath,wpath,tpath+/var/tmp",
"allow/lock/rpath,cpath,wpath,tpath+/tmp",
];
pub const PROFILE_PALUDIS: &[&str] = &[
"include_profile linux",
"include_profile tty",
"default/lock:warn", "allow/lock/rpath+/sys", "lock:exec", "mask^", "sandbox/pty:off", "trace/memory_access:0", "trace/allow_safe_bind:true",
"trace/allow_safe_kcapi:true",
"trace/allow_unsafe_cbpf:true", "trace/allow_unsafe_chroot:true", "trace/allow_unsafe_dumpable:true", "trace/allow_unsafe_env:true",
"trace/allow_unsafe_exec_libc:true",
"trace/allow_unsafe_exec_memory:true",
"trace/allow_unsafe_exec_nopie:true",
"trace/allow_unsafe_exec_null:true",
"trace/allow_unsafe_exec_stack:true",
"trace/allow_unsafe_exec_script:true", "trace/allow_unsafe_exec_interactive:true", "trace/allow_unsafe_exec_speculative:true", "trace/allow_unsafe_filename:true", "trace/allow_unsafe_create:true", "trace/allow_unsafe_hardlinks:true", "trace/allow_unsafe_magiclinks:true", "trace/allow_unsafe_symlinks:true", "trace/allow_unsafe_machine_id:true", "trace/allow_unsafe_memfd:true", "trace/allow_unsafe_mkbdev:true", "trace/allow_unsafe_mkcdev:true", "trace/allow_unsafe_msgsnd:true",
"trace/allow_unsafe_nice:true",
"trace/allow_unsafe_nocookie:true", "trace/allow_unsafe_nomseal:true", "trace/allow_unsafe_open_path:true",
"trace/allow_unsafe_page_cache:true",
"trace/allow_unsafe_perf:true",
"trace/allow_unsafe_personality:true", "trace/allow_unsafe_ptrace:true",
"trace/allow_unsafe_prctl:true", "trace/allow_unsafe_prlimit:true",
"trace/allow_unsafe_proc_files:true", "trace/allow_unsafe_proc_pid_status:true", "trace/allow_unsafe_shm:true", "trace/allow_unsafe_sigreturn:true",
"trace/allow_unsafe_socket:true",
"trace/allow_unsafe_sysinfo:true", "trace/allow_unsupp_socket:true",
"trace/allow_unsafe_time:true",
"trace/allow_unsafe_xattr:true", "allow/lock/readdir+/",
"ioctl/deny-FS_IOC_SETFLAGS!", "ioctl/allow+FS_IOC_SETFLAGS!",
"sandbox/exec:off",
"sandbox/tpe:off",
"filter/cnet+/run/systemd/userdb/io.systemd.DynamicUser",
"allow/lpath,rpath+/selinux",
"allow/lpath,rpath+/selinux/context",
"allow/lpath,rpath,write+/selinux/context/**",
"allow/lpath,rpath+/sys",
"allow/lpath,rpath+/sys/devices",
"allow/lpath,rpath+/sys/devices/system",
"allow/lpath,rpath+/sys/devices/system/cpu",
"allow/lpath,rpath+/sys/devices/system/cpu/isolated",
"allow/lpath,rpath+/sys/devices/system/cpu/kernel_max",
"allow/lpath,rpath+/sys/devices/system/cpu/online",
"allow/lpath,rpath+/sys/devices/system/cpu/offline",
"allow/lpath,rpath+/sys/devices/system/cpu/possible",
"allow/lpath,rpath+/sys/devices/system/cpu/present",
"allow/lpath,rpath+/sys/fs",
"allow/lpath,rpath+/sys/fs/cgroup/***",
"allow/lpath,rpath+/sys/kernel",
"allow/lpath,rpath+/sys/kernel/mm",
"allow/lpath,rpath+/sys/kernel/mm/transparent_hugepage/***",
"allow/lpath,rpath+/sys/kernel/security",
"allow/lpath,rpath+/sys/kernel/security/apparmor/***",
"allow/lpath,rpath,rename+/proc/crypto",
"allow/lpath,rpath,rename+/proc/cpuinfo",
"allow/lpath,rpath,rename+/proc/loadavg",
"allow/lpath,rpath,rename+/proc/meminfo",
"allow/lpath,rpath,rename+/proc/stat",
"allow/lpath,rpath,rename+/proc/uptime",
"allow/lpath,rpath,rename+/proc/version",
"allow/lpath,rpath,rename+/proc/[0-9]*/stat",
"allow/lpath,rpath,rename+/proc/[0-9]*/task/[0-9]*/stat",
"allow/lpath,rpath,rename+/proc/[0-9]*",
"allow/lpath,rpath,rename+/proc/filesystems",
"allow/lpath,rpath,rename,ioctl+/proc/self/maps",
"allow/lpath,rpath,rename,ioctl+/proc/self/task/[0-9]*/maps",
"allow/lpath,rpath,rename+/proc/self/smaps*",
"allow/lpath,rpath,rename+/proc/self/task/[0-9]*/smaps*",
"allow/lpath,rpath,rename+/proc/self/pagemap",
"allow/lpath,rpath,rename+/proc/self/task/[0-9]*/pagemap",
"allow/lpath,rpath,rename+/proc/mounts", "allow/lpath,rpath,rename+/proc/self/mounts",
"allow/lpath,rpath,rename+/proc/self/task/[0-9]*/mounts",
"allow/lpath,rpath,rename+/proc/self/mountinfo",
"allow/lpath,rpath,rename+/proc/self/task/[0-9]*/mountinfo",
"allow/lpath,rpath,rename+/proc/self/attr/***",
"allow/lpath,rpath,rename+/proc/self/task/[0-9]*/attr/***",
"allow/lpath,rpath,rename+/proc/self/cgroup",
"allow/lpath,rpath,rename+/proc/self/task/[0-9]*/cgroup",
"allow/lpath,rpath,rename+/proc/sys",
"allow/lpath,rpath,rename+/proc/sys/fs/***",
"allow/lpath,rpath,rename+/proc/sys/kernel/***",
"allow/lpath,rpath,rename+/proc/sys/net/***",
"allow/lpath,rpath,rename+/proc/sys/vm/***",
"allow/exec,ioctl,spath,bnet,fown+/dev/shm/**",
"allow/exec,ioctl,spath,bnet,fown+/var/tmp/**",
"allow/exec,ioctl,spath,bnet,fown+/tmp/**",
"allow/lock/exec,ioctl,spath,bnet+/dev/shm",
"allow/lock/exec,ioctl,spath,bnet+/var/tmp",
"allow/lock/exec,ioctl,spath,bnet+/tmp",
"allow/lpath,rpath,mktemp+/var/cache/***",
"allow/lpath,rpath,wpath,cpath,spath,tpath,exec,ioctl,bnet,fown,fattr+/var/cache/**",
"allow/lock/rpath,wpath,cpath,spath,tpath,exec,ioctl,bnet+/var/cache",
"allow/bnet+loopback!0",
"allow/bnet+loopback!1024-65535",
"allow/lock/bnet+0",
"allow/lock/bnet+1024-65535",
"allow/lock/cnet+1024-65535",
"allow/exec,lpath,rpath,wpath,cpath+!memfd:**",
"allow/exec,lpath,rpath,wpath,cpath+!memfd-hugetlb:**",
"allow/exec,lpath,rpath,wpath,cpath+/proc/self/fd/!memfd:**",
"allow/exec,lpath,rpath,wpath,cpath+/proc/self/fd/!memfd-hugetlb:**",
"allow/lpath,rpath+/var/db",
"allow/lpath,rpath+/var/db/paludis/***",
];
pub const PROFILE_LTP: &[&str] = &[
"include_profile paludis",
"trace/allow_unsafe_chroot:false", "trace/allow_unsafe_deprecated:true", "trace/allow_unsafe_keyring:true", "trace/allow_unsafe_madvise:true", "trace/allow_unsafe_mbind:true", "trace/allow_unsafe_oob:true", "trace/allow_unsafe_stat_bdev:true", "trace/allow_unsafe_stat_cdev:true", "allow/all+/***",
"allow/net+@**",
"allow/net+any!0-65535",
"ioctl/deny-FIGETBSZ",
];
pub const PROFILE_NIX: &[&str] = &[
"include_profile paludis",
"trace/allow_unsafe_madvise:true", "trace/allow_unsafe_mqueue:true", "trace/allow_unsafe_vmsplice:true", "allow/all+/***",
"allow/net+@**",
"allow/net+any!0-65535",
];
pub const PROFILE_USER: &[&str] = &[
"include_profile linux",
"include_profile rand",
"include_profile tty",
"trace/allow_safe_syslog:true",
"tpe/negate:1",
"tpe/user_owned:1",
"tpe/gid:${SYD_GID}",
"trace/force_umask:7177",
"allow/all+${HOME}/**",
"allow/lpath,rpath+${HOME}/***",
"deny/all+${HOME}/**/.*/***",
"allow/all+${HOME}/**/.*history*",
"append+${HOME}/.*history",
"allow/all+/run/user/${SYD_UID}/**",
"allow/lpath,rpath+/run/user/${SYD_UID}/***",
];
pub const PROFILE_LINUX: &[&str] = &[
"allow/stat,chdir,readdir+/",
"allow/lpath,rpath,exec+/bin/***",
"allow/lpath,rpath,exec+/sbin/***",
"allow/lpath,rpath,exec+/lib*/***",
"allow/lpath,rpath,exec+/usr/***",
"allow/lpath,rpath,exec+/opt/***",
"deny/lpath,rpath,exec+/lib*/modules/***",
"allow/net/link+route", "allow/cnet+/run/nscd/socket",
"allow/cnet+/var/run/nscd/socket",
"allow/cnet+/var/lib/sss/pipes/nss",
"allow/cnet+loopback!65535", "allow/lpath,rpath+/dev",
"allow/lpath,rpath+/dev/fd",
"allow/lpath,rpath,mktemp+/dev/shm/***",
"allow/lpath,rpath,mktemp+/var/tmp/***",
"allow/lpath,rpath,mktemp+/tmp/***",
"allow/lpath,rpath,wpath,cpath,tpath,fattr+/dev/shm/**",
"allow/lpath,rpath,wpath,cpath,tpath,fattr+/var/tmp/**",
"allow/lpath,rpath,wpath,cpath,tpath,fattr+/tmp/**",
"allow/lpath,rpath,wpath,ioctl+/dev/full",
"allow/lpath,rpath,wpath,ioctl+/dev/zero",
"allow/lpath,rpath,wpath,ioctl+/dev/null",
"allow/lpath,rpath,wpath+/dev/stdin",
"allow/lpath,rpath,wpath+/dev/stdout",
"allow/lpath,rpath,wpath+/dev/stderr",
"allow/lpath,rpath,wpath,ioctl+/dev/random",
"allow/lpath,rpath,wpath,ioctl+/dev/urandom",
"allow/lpath,rpath+/proc",
"allow/lpath,rpath+/proc/self/stat",
"allow/lpath,rpath+/proc/self/task/[0-9]*/stat",
"allow/lpath,rpath+/proc/self/statm",
"allow/lpath,rpath+/proc/self/task/[0-9]*/statm",
"allow/lpath,rpath+/proc/self/status",
"allow/lpath,rpath+/proc/self/task/[0-9]*/status",
"mask+/proc/*info*/***:/dev/null:/var/empty",
"mask+/proc/*stat*/***:/dev/null:/var/empty",
"allow/lpath,rpath+/proc/cmdline",
"mask+/proc/cmdline",
"allow/lpath,rpath+/proc/version",
"mask+/proc/version",
"mask+/proc/interrupts",
"mask+/proc/kcore",
"mask+/proc/keys",
"mask+/proc/acpi/***:/dev/null:/var/empty",
"mask+/proc/asound/***:/dev/null:/var/empty",
"mask+/proc/bus/***:/dev/null:/var/empty",
"mask+/proc/driver/***:/dev/null:/var/empty",
"mask+/proc/*debug*/***:/dev/null:/var/empty",
"mask+/proc/fs/***:/dev/null:/var/empty",
"mask+/proc/irq/***:/dev/null:/var/empty",
"mask+/proc/latency_*/***:/dev/null:/var/empty",
"mask+/proc/timer_*/***:/dev/null:/var/empty",
"mask+/proc/*_stats/***:/dev/null:/var/empty",
"mask+/proc/pressure/***:/dev/null:/var/empty",
"mask+/proc/sched*/***:/dev/null:/var/empty",
"mask+/proc/scsi/***:/dev/null:/var/empty",
"mask+/proc/sys*/***:/dev/null:/var/empty",
"mask+/proc/tty/***:/dev/null:/var/empty",
"allow/lpath,rpath+/proc/sys",
"allow/lpath,rpath+/proc/sys/kernel",
"allow/lpath,rpath+/proc/sys/kernel/random",
"allow/lpath,rpath+/proc/sys/kernel/random/*id",
"mask+/proc/sys/kernel/random/boot_id:/proc/sys/kernel/random/uuid",
"mask+/proc/sys/kernel/random/uuid:/proc/sys/kernel/random/uuid",
"mask+/sys/dev/***:/dev/null:/var/empty",
"mask+/sys/devices/***:/dev/null:/var/empty",
"mask+/sys/firmware/***:/dev/null:/var/empty",
"mask+/sys/fs/***:/dev/null:/var/empty",
"mask+/sys/kernel/***:/dev/null:/var/empty",
"allow/lpath,rpath+/proc/self",
"allow/lpath,rpath+/proc/thread-self",
"allow/lpath,rpath+/proc/self/comm",
"allow/lpath,rpath+/proc/self/task/[0-9]*/comm",
"allow/lpath,rpath+/proc/self/cmdline",
"allow/lpath,rpath+/proc/self/task/[0-9]*/cmdline",
"allow/lpath,rpath+/proc/self/fd",
"allow/lpath,rpath+/proc/self/fdinfo",
"allow/lpath,rpath+/proc/self/task",
"allow/lpath,rpath+/proc/self/task/[0-9]*",
"allow/lpath,rpath+/proc/self/task/[0-9]*/fd",
"allow/lpath,rpath+/proc/self/task/[0-9]*/fdinfo",
"allow/lpath,rpath+/proc/self/cwd",
"allow/lpath,rpath+/proc/self/task/[0-9]*/cwd",
"allow/lpath,rpath+/proc/self/exe",
"allow/lpath,rpath+/proc/self/task/[0-9]*/exe",
"allow/lpath,rpath+/proc/self/root",
"allow/lpath,rpath+/proc/self/task/[0-9]*/root",
"allow/lpath,rpath+/proc/self/fdinfo/[0-9]*",
"allow/lpath,rpath+/proc/self/task/[0-9]*/fdinfo/[0-9]*",
"allow/lpath,rpath,wpath,ioctl+/proc/self/fd/[0-9]*",
"allow/lpath,rpath,wpath,ioctl+/proc/self/task/[0-9]*/fd/[0-9]*",
r"allow/lpath,rpath,wpath,ioctl+/proc/self/fd/anon_inode:\[pidfd\]",
r"allow/lpath,rpath,wpath,ioctl+/proc/self/fd/pipe:\[[0-9]*\]",
r"allow/lpath,rpath,wpath,ioctl+/proc/self/fd/socket:\[[0-9]*\]",
r"allow/lpath,rpath,wpath,ioctl+/proc/self/task/[0-9]*/fd/anon_inode:\[pidfd\]",
r"allow/lpath,rpath,wpath,ioctl+/proc/self/task/[0-9]*/fd/pipe:\[[0-9]*\]",
r"allow/lpath,rpath,wpath,ioctl+/proc/self/task/[0-9]*/fd/socket:\[[0-9]*\]",
"allow/lpath,rpath+/run",
"allow/lpath,rpath+/run/systemd",
"allow/lpath,rpath+/run/systemd/resolve",
"allow/lpath,rpath+/run/systemd/resolve/*.conf",
"allow/lpath,rpath+/var",
"allow/lpath,rpath+/var/lib/sss/mc/passwd", "allow/lpath,rpath+/var/lib/sss/mc/group", "allow/lpath,rpath,chroot+/var/empty", "allow/lpath,rpath+/etc",
"allow/lpath,rpath+/etc/DIR_COLORS",
"allow/lpath,rpath+/etc/GREP_COLORS",
"allow/lpath,rpath+/etc/bash*/***",
"allow/lpath,rpath+/etc/alternatives/***",
"allow/lpath,rpath+/etc/ca-certificates/***",
"allow/lpath,rpath+/etc/env.d/***",
"allow/lpath,rpath+/etc/groff/***",
"allow/lpath,rpath+/etc/ld.so.conf.d/***",
"allow/lpath,rpath+/etc/environment",
"allow/lpath,rpath+/etc/ethertypes",
"allow/lpath,rpath+/etc/group",
"allow/lpath,rpath+/etc/hosts",
"allow/lpath,rpath+/etc/inputrc",
"allow/lpath,rpath+/etc/issue",
"allow/lpath,rpath+/etc/ld*",
"allow/lpath,rpath+/etc/locale.alias",
"allow/lpath,rpath+/etc/locale.conf",
"allow/lpath,rpath+/etc/localtime",
"mask+/etc/localtime:/usr/share/zoneinfo/UTC", "mask+/usr/share/zoneinfo/**:/usr/share/zoneinfo/UTC:/var/empty", "allow/lpath,rpath+/etc/machine-id", "allow/lpath,rpath+/etc/hostid", "allow/lpath,rpath+/var/adm/hostid", "allow/lpath,rpath+/etc/man_db.conf",
"allow/lpath,rpath+/etc/nanorc",
"allow/lpath,rpath+/etc/**/nsswitch.conf",
"allow/lpath,rpath+/etc/passwd",
"allow/lpath,rpath+/etc/profile*/***",
"allow/lpath,rpath+/etc/services",
"allow/lpath,rpath+/etc/*-release",
"allow/lpath,rpath+/etc/protocols",
"allow/lpath,rpath+/etc/resolv.conf",
"allow/lpath,rpath+/etc/skel/***",
"allow/stat,chdir,readdir+/etc/ssl",
"allow/lpath,rpath+/etc/ssl/certs/***",
"allow/lpath,rpath+/etc/ssl/misc/***",
"allow/lpath,rpath+/etc/ssl/openssl.cnf",
"allow/lpath,rpath+/etc/terminfo/***",
"allow/lpath,rpath+/etc/zsh/***",
"allow/lpath,chdir+/home",
"allow/net+!unnamed",
];
pub const PROFILE_TTY: &[&str] = &[
"include_profile tty_native",
"allow/lock/read,ioctl,write+/dev/ptmx",
"allow/lock/read,ioctl,write+/dev/tty",
"allow/lock/read,ioctl,write+${SYD_TTY}",
"allow/lock/rpath,ioctl,write+/dev/pts",
"allow/lpath,rpath,wpath,ioctl+/dev/ptmx",
"allow/lpath,rpath,wpath,ioctl+/dev/tty",
"allow/lpath,rpath,wpath,ioctl+${SYD_TTY}",
"allow/lpath,rpath,wpath,ioctl+/dev/pts/ptmx",
"allow/lpath,rpath,wpath,ioctl+/dev/pts/[0-9]*/***",
];
pub const PROFILE_TTY_NATIVE: &[&str] = &[
"ioctl/allow+TIOCGPGRP",
"ioctl/allow+TIOCSPGRP",
"ioctl/allow+TIOCGSID",
"ioctl/allow+TCFLSH",
"ioctl/allow+TCGETA",
"ioctl/allow+TCGETS",
"ioctl/allow+TCGETS2",
"ioctl/allow+TCGETX",
"ioctl/allow+TCSETA",
"ioctl/allow+TCSETAF",
"ioctl/allow+TCSETAW",
"ioctl/allow+TCSETS",
"ioctl/allow+TCSETS2",
"ioctl/allow+TCSETSF",
"ioctl/allow+TCSETSF2",
"ioctl/allow+TCSETSW",
"ioctl/allow+TCSETSW2",
"ioctl/allow+TCSETX",
"ioctl/allow+TCSETXF",
"ioctl/allow+TCSETXW",
"ioctl/allow+TCXONC",
"ioctl/allow+TIOCGLCKTRMIOS",
"ioctl/allow+TIOCSLCKTRMIOS",
"ioctl/allow+TIOCGWINSZ",
"ioctl/allow+TIOCSWINSZ",
"ioctl/allow+TIOCGDEV",
"ioctl/allow+TIOCGEXCL",
"ioctl/allow+TIOCGPKT",
"ioctl/allow+TIOCGPTLCK",
"ioctl/allow+TIOCGPTN",
"ioctl/allow+TIOCGPTPEER",
"ioctl/allow+TIOCSCTTY",
"ioctl/allow+TIOCSIG",
"ioctl/allow+TIOCVHANGUP",
"ioctl/allow+TIOCGPKT",
"ioctl/allow+TIOCGPTLCK",
"ioctl/allow+TIOCGPTPEER",
"ioctl/allow+TIOCPKT",
"ioctl/allow+TIOCSPTLCK",
];
pub const PROFILE_KVM: &[&str] = &[
"allow/wpath,ioctl+/dev/kvm",
"include_profile kvm_native",
"ioctl/allow+KVM_GET_API_VERSION",
"ioctl/allow+KVM_CREATE_VM",
"ioctl/allow+KVM_GET_VCPU_MMAP_SIZE",
"ioctl/allow+KVM_CREATE_VCPU",
"ioctl/allow+KVM_GET_DIRTY_LOG",
"ioctl/allow+KVM_SET_TSS_ADDR",
"ioctl/allow+KVM_RUN",
"ioctl/allow+KVM_NMI",
"ioctl/allow+KVM_CHECK_EXTENSION",
"ioctl/allow+KVM_GET_TSC_KHZ",
"ioctl/allow+KVM_SET_TSC_KHZ",
"ioctl/allow+KVM_INTERRUPT",
"ioctl/allow+KVM_SET_MSRS",
"ioctl/allow+KVM_SET_USER_MEMORY_REGION",
"ioctl/allow+KVM_SET_REGS",
"ioctl/allow+KVM_SET_SREGS",
"ioctl/allow+KVM_GET_MSRS",
"ioctl/allow+KVM_GET_REGS",
"ioctl/allow+KVM_GET_SREGS",
"ioctl/allow+KVM_GET_SUPPORTED_CPUID",
"ioctl/allow+KVM_GET_EMULATED_CPUID",
"ioctl/allow+KVM_SET_CPUID2",
"ioctl/allow+KVM_SET_SIGNAL_MASK",
"ioctl/allow+KVM_GET_VCPU_EVENTS",
"ioctl/allow+KVM_SET_VCPU_EVENTS",
"ioctl/allow+KVM_SET_DEVICE_ATTR",
"ioctl/allow+KVM_SET_IDENTITY_MAP_ADDR",
"ioctl/allow+KVM_CREATE_IRQCHIP",
"ioctl/allow+KVM_IRQ_LINE",
"ioctl/allow+KVM_REGISTER_COALESCED_MMIO",
"ioctl/allow+KVM_UNREGISTER_COALESCED_MMIO",
"ioctl/allow+KVM_SET_GSI_ROUTING",
"ioctl/allow+KVM_IRQFD",
"ioctl/allow+KVM_IOEVENTFD",
"ioctl/allow+KVM_GET_MP_STATE",
"ioctl/allow+KVM_SET_MP_STATE",
"ioctl/allow+KVM_SIGNAL_MSI",
"ioctl/allow+KVM_SET_GUEST_DEBUG",
"ioctl/allow+KVM_CREATE_DEVICE",
"ioctl/allow+KVM_SET_DEVICE_ATTR",
"ioctl/allow+KVM_GET_DEVICE_ATTR",
"ioctl/allow+KVM_HAS_DEVICE_ATTR",
];
#[cfg(any(target_arch = "arm", target_arch = "aarch64"))]
pub const PROFILE_KVM_NATIVE: &[&str] = &[
"ioctl/allow+0x4680aea3", "ioctl/allow+0x4010aeab", "ioctl/allow+0x4010aeac", "ioctl/allow+0xc008aeb0", "ioctl/allow+5", "ioctl/allow+0x8020aeaf", "ioctl/allow+0x4020aeae", "ioctl/allow+0x4040aec2", "ioctl/allow+0x6030000000100042", "ioctl/allow+0x6030000000100044", "ioctl/allow+0x6030000000100000", "ioctl/allow+0x6030000000100002", "ioctl/allow+0x6030000000100004", "ioctl/allow+0x6030000000100006", "ioctl/allow+0x6030000000100010", "ioctl/allow+0x6030000000100024", "ioctl/allow+0x6030000000100040", "ioctl/allow+0x603000000013c510", "ioctl/allow+0x603000000013c102", "ioctl/allow+0x603000000013c100", "ioctl/allow+0x603000000013c101", "ioctl/allow+0x603000000013c080", "ioctl/allow+0x603000000013c082", "ioctl/allow+0x603000000013c600", "ioctl/allow+0x603000000013df1a", "ioctl/allow+0x603000000013df00", "ioctl/allow+0x6030000000138012", "ioctl/allow+0x603000000013c708", "ioctl/allow+0x603000000013c684", ];
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
pub const PROFILE_KVM_NATIVE: &[&str] = &[
"ioctl/allow+0x0", "ioctl/allow+0x0", "ioctl/allow+0xc004ae02", "ioctl/allow+0xc004ae0a", "ioctl/allow+0x4040ae77", "ioctl/allow+0xc208ae62", "ioctl/allow+0x4208ae63", "ioctl/allow+0x4030ae7b", "ioctl/allow+0x8030ae7c", "ioctl/allow+0x8070ae9f", "ioctl/allow+0x4070aea0", "ioctl/allow+0xc008aeba", "ioctl/allow+0x8010aebb", "ioctl/allow+0x8010aebc", "ioctl/allow+0xc018ae85", "ioctl/allow+0x81a0ae8c", "ioctl/allow+0x41a0ae8d", "ioctl/allow+0x8400ae8e", "ioctl/allow+0x4400ae8f", "ioctl/allow+0x4008ae90", "ioctl/allow+0xc008ae91", "ioctl/allow+0x8080aea1", "ioctl/allow+0x4080aea2", "ioctl/allow+0x9000aea4", "ioctl/allow+0x5000aea5", "ioctl/allow+0x8188aea6", "ioctl/allow+0x4188aea7", "ioctl/allow+0xaead", ];
#[cfg(not(any(
target_arch = "arm",
target_arch = "x86",
target_arch = "x86_64",
target_arch = "aarch64"
)))]
pub const PROFILE_KVM_NATIVE: &[&str] = &[];
pub const EBPF_SYSCALLS: &[&str] = &["bpf", "uretprobe"];
pub const MOUNT_SYSCALLS: &[&str] = &[
"fsconfig",
"fsmount",
"fsopen",
"fspick",
"listmount",
"mount",
"mount_setattr",
"open_tree",
"open_tree_attr",
"statmount",
"umount",
"umount2",
];
pub const NICE_SYSCALLS: &[&str] = &[
"ioprio_set",
"sched_setattr",
"sched_setscheduler",
"sched_setparam",
"setpriority",
];
pub const PAGE_CACHE_SYSCALLS: &[&str] = &["cachestat", "mincore"];
pub const PERF_SYSCALLS: &[&str] = &[
"lookup_dcookie",
"perf_event_open",
"rtas",
"s390_runtime_instr",
"sys_debug_setcontext",
];
pub const PTRACE_SYSCALLS: &[&str] = &[
"kcmp",
"pidfd_getfd",
"ptrace",
"process_madvise",
"process_vm_readv",
"process_vm_writev",
];
pub const EPOLL_SYSCALLS: &[&str] = &[
"epoll_ctl",
"epoll_ctl_old",
"epoll_wait",
"epoll_wait_old",
"epoll_pwait",
"epoll_pwait2",
];
pub const UTS_SYSCALLS: &[&str] = &["setdomainname", "sethostname"];
pub const GET_ID_SYSCALLS: &[&str] = &[
"getuid",
"getuid32",
"getgid",
"getgid32",
"geteuid",
"geteuid32",
"getegid",
"getegid32",
"getresuid",
"getresuid32",
"getresgid",
"getresgid32",
"getgroups",
"getgroups32",
];
pub const FADVISE_SYSCALLS: &[&str] = &["arm_fadvise64_64", "fadvise64", "fadvise64_64"];
pub const FUTEX_SYSCALLS: &[&str] = &[
"futex",
"futex_requeue",
"futex_time64",
"futex_wait",
"futex_waitv",
"futex_wake",
"swapcontext",
"sys_debug_swapcontext",
];
pub const SET_ID_SYSCALLS: &[&str] = &[
"setuid",
"setuid32",
"setgid",
"setgid32",
"setreuid",
"setreuid32",
"setregid",
"setregid32",
"setresuid",
"setresuid32",
"setresgid",
"setresgid32",
];
pub const UNSAFE_ID_SYSCALLS: &[&str] = &["setgroups", "setgroups32"];
pub const VDSO_SYSCALLS: &[&str] = &[
"clock_getres",
"clock_getres_time64",
"clock_gettime",
"clock_gettime64",
"getcpu",
"getrandom",
"gettimeofday",
"time",
];
pub const HOOK_SYSCALLS: &[&str] = &[
"accept",
"accept4",
"bind",
"connect",
"getpeername",
"getsockname",
"getsockopt",
"recvfrom",
"recvmsg",
"recvmmsg",
"recvmmsg_time64",
"sendto",
"sendmsg",
"sendmmsg",
"socket",
"socketcall",
"socketpair",
"execve",
"execveat",
"getdents64",
"stat",
"access",
"fstat",
"fstat64",
"fstatat64",
"lstat",
"newfstatat",
"stat64",
"statx",
"faccessat",
"faccessat2",
"chdir",
"fchdir",
"chmod",
"fchmod",
"fchmodat",
"fchmodat2",
"fchown",
"fchown32",
"chown",
"lchown",
"fchownat",
"creat",
"link",
"symlink",
"unlink",
"linkat",
"symlinkat",
"unlinkat",
"mkdir",
"rmdir",
"mkdirat",
"mknod",
"mknodat",
"open",
"openat",
"openat2",
"rename",
"renameat",
"renameat2",
"utime",
"utimes",
"futimesat",
"utimensat",
"truncate",
"truncate64",
"ftruncate",
"ftruncate64",
"getxattr",
"getxattrat",
"fgetxattr",
"lgetxattr",
"setxattr",
"setxattrat",
"fsetxattr",
"lsetxattr",
"listxattr",
"listxattrat",
"flistxattr",
"llistxattr",
"removexattr",
"removexattrat",
"fremovexattr",
"lremovexattr",
"ioctl",
"prctl",
"kill",
"tkill",
"tgkill",
"rt_sigqueueinfo",
"rt_tgsigqueueinfo",
"pidfd_open",
"brk",
"mmap",
"mmap2",
"mremap",
"setrlimit",
"prlimit64",
"statfs",
"statfs64",
"fstatfs",
"fstatfs64",
"fallocate",
"uname",
"fanotify_mark",
"inotify_add_watch",
"memfd_create",
"fcntl",
"fcntl64",
"sysinfo",
"sigaction",
"rt_sigaction",
"chroot",
"syslog",
];
pub(crate) const HOOK_SCKCALLS: &[u8] = &[
0x1, 0x2, 0x3, 0x5, 0x6, 0x7, 0x8, 0x9, 0xb, 0xc, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14, ];
pub const STAT_SYSCALLS: &[&str] = &[
"access",
"faccessat",
"faccessat2",
"fanotify_mark",
"fgetxattr",
"flistxattr",
"fstatat64",
"fstatfs",
"fstatfs64",
"getxattr",
"getxattrat",
"inotify_add_watch",
"lgetxattr",
"listxattr",
"listxattrat",
"llistxattr",
"lstat",
"lstat64",
"newfstatat",
"stat",
"stat64",
"statfs",
"statfs64",
"statx",
];
pub const RENAME_SYSCALLS: &[&str] = &["link", "linkat", "rename", "renameat", "renameat2"];
pub const TRUNCATE_SYSCALLS: &[&str] = &[
"fallocate",
"ftruncate",
"ftruncate64",
"truncate",
"truncate64",
];
pub const CONNECT_SYSCALLS: &[&str] = &["connect", "sendmmsg", "sendmsg", "sendto"];
pub const CPU_SYSCALLS: &[&str] = &[
"modify_ldt",
"subpage_prot",
"switch_endian",
"vm86",
"vm86old",
];
pub const KEYRING_SYSCALLS: &[&str] = &["add_key", "keyctl", "request_key"];
pub const PKEY_SYSCALLS: &[&str] = &["pkey_alloc", "pkey_free", "pkey_mprotect"];
pub const DEPRECATED_SYSCALLS: &[&str] = &[
"_sysctl",
"remap_file_pages",
"setfsgid",
"setfsgid32",
"setfsuid",
"setfsuid32",
"stime",
"uselib",
"ustat",
];
pub const TIME_SYSCALLS: &[&str] = &[
"adjtimex",
"clock_adjtime",
"clock_adjtime64",
"clock_settime",
"clock_settime64",
"settimeofday",
];
pub const SYNC_SYSCALLS: &[&str] = &["sync", "syncfs"];
pub const IOURING_SYSCALLS: &[&str] = &["io_uring_enter", "io_uring_register", "io_uring_setup"];
#[cfg(feature = "prof")]
pub const PROF_SYSCALLS: &[&str] = &["setitimer"];
#[cfg(not(feature = "prof"))]
pub const PROF_SYSCALLS: &[&str] = &[];
pub const SAFE_SYSCALLS: &[&str] = &[
"_llseek",
"_newselect",
"alarm",
"arch_prctl", "arm_fadvise64_64",
"arm_sync_file_range",
"atomic_barrier",
"atomic_cmpxchg_32",
"breakpoint", "cacheflush", "capget",
"capset",
"clock_nanosleep",
"clock_nanosleep_time64",
"clone", "close",
"close_range",
"copy_file_range",
"dup",
"dup2",
"dup3",
"epoll_create",
"epoll_create1",
"epoll_ctl",
"epoll_ctl_old",
"epoll_pwait",
"epoll_pwait2",
"epoll_wait",
"epoll_wait_old",
"eventfd",
"eventfd2",
"exit",
"exit_group",
"fadvise64",
"fadvise64_64",
"fanotify_init",
"fdatasync",
"flock",
"fork",
"fsync",
"getpagesize",
"get_mempolicy",
"get_robust_list",
"get_thread_area",
"getcwd",
"getgroups",
"getgroups32",
"getitimer",
"getpgid",
"getpgrp",
"getpid",
"getpmsg",
"getppid",
"getpriority",
"getresgid",
"getresuid",
"getrlimit",
"getrusage",
"getsid",
"gettid",
"inotify_init",
"inotify_init1",
"inotify_rm_watch",
"io_cancel",
"io_destroy",
"io_getevents",
"io_pgetevents",
"io_pgetevents_time64",
"io_setup",
"io_submit",
"ioprio_get",
"landlock_add_rule",
"landlock_create_ruleset",
"landlock_restrict_self",
"listen",
"lseek",
"map_shadow_stack",
"membarrier",
"mlock",
"mlock2",
"mlockall",
"mprotect",
"mq_getsetattr",
"mq_notify",
"mq_timedreceive",
"mq_timedreceive_time64",
"mq_timedsend",
"mq_timedsend_time64",
"mq_unlink",
"mseal",
"msgrcv",
"msync",
"munlock",
"munlockall",
"munmap",
"nanosleep",
"pause",
"pidfd_send_signal",
"pipe",
"poll",
"ppoll",
"ppoll_time64",
"pread64",
"preadv",
"preadv2",
"process_mrelease",
"pselect6",
"pselect6_time64",
"pwrite64",
"pwritev",
"read",
"readahead",
"readlink",
"readlinkat",
"readv",
"recv",
"restart_syscall",
"riscv_flush_icache",
"rt_sigpending",
"rt_sigprocmask",
"rt_sigsuspend",
"rt_sigtimedwait",
"rt_sigtimedwait_time64",
"s390_pci_mmio_read",
"s390_pci_mmio_write",
"s390_runtime_instr",
"sched_get_priority_max",
"sched_get_priority_min",
"sched_getaffinity",
"sched_getattr",
"sched_rr_get_interval",
"sched_rr_get_interval_time64",
"sched_getparam",
"sched_getscheduler",
"sched_setaffinity",
"sched_yield",
"select",
"semop",
"semtimedop",
"semtimedop_time64",
"send",
"sendfile",
"sendfile64",
"set_mempolicy",
"set_mempolicy_home_node",
"set_robust_list",
"set_thread_area",
"set_tid_address",
"setitimer",
"setns", "setpgid",
"setsid",
"setsockopt",
"set_tls", "shmdt",
"shutdown",
"signal",
"sigaltstack",
"signalfd",
"signalfd4",
"sigpending",
"sigprocmask",
"sigsuspend",
"splice",
"sync_file_range",
"sync_file_range2", "tee",
"timer_create",
"timer_delete",
"timer_getoverrun",
"timer_gettime",
"timer_gettime64",
"timer_settime",
"timer_settime64",
"timerfd_create",
"timerfd_gettime",
"timerfd_gettime64",
"timerfd_settime",
"timerfd_settime64",
"times",
"ugetrlimit",
"umask",
"unshare", "vfork",
"wait4",
"waitid",
"waitpid",
"write",
"writev",
];
pub const EMU_SYSCALLS: &[&str] = &[
"_llseek",
"brk",
"clock_nanosleep",
"close",
"exit",
"exit_group",
"fallocate", "fanotify_mark",
"fchdir",
"fchmod",
"fchown",
"fgetxattr",
"flistxattr",
"fremovexattr",
"fsetxattr",
"fstat",
"fstat64",
"fstatfs",
"fstatfs64",
"get_robust_list",
"getdents64",
"getpgid",
"getpgrp",
"getpid",
"getsockname",
"getsockopt",
"gettid",
"getxattrat",
"inotify_add_watch",
"kcmp",
"landlock_create_ruleset",
"landlock_restrict_self",
"lgetxattr",
"listxattrat",
"llistxattr",
"lremovexattr",
"lseek",
"lsetxattr",
"lstat",
"mlock",
"mmap",
"mmap2",
"mprotect",
"mremap",
"munlock",
"munmap",
"nanosleep",
"pidfd_getfd",
"pidfd_open",
"pidfd_send_signal",
"process_mrelease", "process_vm_readv",
"process_vm_writev",
"read",
"readv",
"recv",
"recvfrom",
"recvmsg",
"recvmmsg",
"recvmmsg_time64",
"removexattrat",
"restart_syscall",
"rseq",
"rt_sigprocmask",
"rt_sigtimedwait", "rt_sigtimedwait_time64", "sched_getaffinity",
"sched_yield",
"send",
"sendmsg",
"sendto",
"set_robust_list",
"setxattrat",
"sigaltstack",
"sigprocmask",
"splice",
"symlinkat", "tee",
"tgkill",
"tkill",
"timer_create", "timer_delete", "timer_settime", "timer_settime64", "umask",
"waitid",
"sigreturn",
"rt_sigreturn",
"faccessat2",
"fchmodat", "fchmodat2", "fchownat", "mkdirat", "mknodat", "newfstatat",
"readlinkat",
"statx",
"utimensat",
"write",
];
pub const EMU_FCNTL_OPS: &[u64] = &[
libc::F_GETFD as u64,
libc::F_SETFD as u64,
libc::F_GETFL as u64,
libc::F_SETFL as u64,
libc::F_OFD_SETLK as u64,
libc::F_OFD_SETLKW as u64,
libc::F_ADD_SEALS as u64,
];
pub const EMU_PRCTL_OPS: &[KeyValue] = &[
("PR_SET_NAME", 15), ("PR_SET_VMA", 0x53564d41), ];
pub const EMU_PRCTL_OPS_SAFESETID: &[KeyValue] = &[("PR_CAP_AMBIENT", 47), ("PR_CAPBSET_DROP", 24)];
pub const INT_SYSCALLS: &[&str] = &[
"clock_nanosleep",
"close",
"exit",
"exit_group", "getpid",
"gettid",
"brk",
"mremap",
"munmap",
"nanosleep",
"lseek", "_llseek", "read",
"restart_syscall",
"rt_sigprocmask",
"rseq",
"sched_yield",
"sigaltstack", "sigprocmask", ];
pub const INT_FCNTL_OPS: &[u64] = &[
libc::F_GETFD as u64,
libc::F_SETFD as u64,
libc::F_OFD_SETLK as u64,
libc::F_OFD_SETLKW as u64,
];
pub const INT_PRCTL_OPS: &[KeyValue] = &[("PR_SET_VMA", 0x53564d41)];
pub const IPC_SYSCALLS: &[&str] = &[
"close",
"exit",
"getpid",
"gettid",
"getsockopt",
"accept4",
"recvmsg",
"sendmsg",
"brk",
"mremap",
"mseal",
"munmap",
"restart_syscall",
"rt_sigprocmask",
"rseq",
"sched_yield",
"sigaltstack", "sigprocmask", ];
pub const IPC_FCNTL_OPS: &[u64] = &[
libc::F_GETFD as u64,
libc::F_SETFD as u64,
libc::F_OFD_SETLK as u64,
libc::F_OFD_SETLKW as u64,
];
pub const IPC_PRCTL_OPS: &[KeyValue] = &[("PR_SET_VMA", 0x53564d41)];
pub const AES_SYSCALLS: &[&str] = &[
"_llseek",
"brk",
"clock_nanosleep",
"close",
"exit",
"fremovexattr",
"get_robust_list",
"getpid",
"getsockopt",
"gettid",
"landlock_create_ruleset",
"landlock_restrict_self",
"lseek",
"mlock",
"mmap",
"mmap2",
"mprotect",
"mremap",
"munlock",
"munmap",
"nanosleep",
"recvmsg",
"restart_syscall",
"rseq",
"rt_sigprocmask",
"sched_getaffinity",
"sched_yield",
"send", "sendmsg", "sendto", "set_robust_list",
"sigaltstack",
"sigprocmask",
"splice",
"tee",
];
pub const AES_FCNTL_OPS: &[u64] = &[
libc::F_GETFD as u64,
libc::F_SETFD as u64,
libc::F_ADD_SEALS as u64,
libc::F_OFD_SETLK as u64, libc::F_OFD_SETLKW as u64,
];
pub const AES_PRCTL_OPS: &[KeyValue] = &[
("PR_SET_NAME", 15), ("PR_SET_VMA", 0x53564d41), ];
pub const MAIN_SYSCALLS: &[&str] = &[
"_llseek",
"brk",
"clock_nanosleep",
"close",
"exit_group",
"fstat",
"fstat64",
"fstatfs",
"fstatfs64",
"get_robust_list",
"getdents64", "getpgid",
"getpgrp",
"getpid",
"gettid",
"kill", "lseek",
"mmap",
"mmap2",
"mprotect",
"mremap",
"munlock",
"munmap",
"nanosleep",
"pidfd_open",
"pidfd_getfd",
"pidfd_send_signal",
"process_mrelease", "process_vm_readv", "process_vm_writev", "ptrace",
"read",
"readv",
"restart_syscall",
"rseq",
"rt_sigprocmask",
"sched_getaffinity",
"sched_yield",
"set_robust_list",
"sigaltstack",
"sigprocmask",
"statx",
"sysinfo", "tgkill",
"tkill",
"waitid",
"faccessat2",
"newfstatat",
"readlinkat",
];
pub const MAIN_FCNTL_OPS: &[u64] = &[
libc::F_GETFD as u64,
libc::F_SETFD as u64,
libc::F_GETFL as u64,
libc::F_SETFL as u64,
libc::F_OFD_SETLK as u64,
libc::F_OFD_SETLKW as u64,
];
pub const MAIN_PRCTL_OPS: &[KeyValue] = &[("PR_SET_VMA", 0x53564d41)];
pub const OCI_SYSCALLS: &[&str] = &[
"kcmp",
"pidfd_getfd",
"process_mrelease",
"process_vm_readv",
"process_vm_writev",
"ptrace",
"syslog",
"unshare",
];
#[expect(clippy::disallowed_methods)]
pub static KERNEL_VERSION: LazyLock<(u32, u32)> = LazyLock::new(|| {
use std::os::unix::ffi::OsStrExt;
use btoi::btoi;
use memchr::memchr;
use nix::sys::utsname::uname;
let version = if let Some(version) = std::env::var_os(ENV_ASSUME_KERNEL) {
version.as_bytes().to_owned()
} else {
let version = uname().unwrap();
version.release().as_bytes().to_owned()
};
let nextdot = memchr(b'.', &version).expect("BUG: Invalid kernel version!");
let major = btoi::<u32>(&version[..nextdot]).expect("BUG: Invalid kernel version!");
let version = &version[nextdot + 1..];
let nextdot = memchr(b'.', version).unwrap_or(version.len());
let minor = btoi::<u32>(&version[..nextdot]).expect("BUG: Invalid kernel version!");
(major, minor)
});
#[expect(clippy::disallowed_methods)]
pub static KERNEL_VERSION_STR: LazyLock<String> = LazyLock::new(|| {
let (major, minor) = *KERNEL_VERSION;
let micro = randint(0u8..=u8::MAX).expect("BUG: Failed to randomize kernel micro version!");
format!("{major}.{minor}.{micro}")
});
pub static HAVE_MFD_NOEXEC_SEAL: LazyLock<bool> = LazyLock::new(|| {
let (major, minor) = *KERNEL_VERSION;
major > 6 || (major == 6 && minor >= 3)
});
pub static SAFE_MFD_FLAGS: LazyLock<libc::c_uint> = LazyLock::new(|| {
if *HAVE_MFD_NOEXEC_SEAL {
libc::MFD_NOEXEC_SEAL
} else {
libc::MFD_ALLOW_SEALING
}
});
pub static HAVE_PIDFD_THREAD: LazyLock<bool> = LazyLock::new(|| {
let (major, minor) = *KERNEL_VERSION;
major > 6 || (major == 6 && minor >= 9)
});
pub static HAVE_SECCOMP_USER_NOTIF_FD_SYNC_WAKE_UP: LazyLock<bool> = LazyLock::new(|| {
let (major, minor) = *KERNEL_VERSION;
major > 6 || (major == 6 && minor >= 6)
});
pub(crate) static HAVE_STATX_MNT_ID_UNIQUE: LazyLock<bool> = LazyLock::new(|| {
let (major, minor) = *KERNEL_VERSION;
major > 6 || (major == 6 && minor >= 8)
});
pub static HAVE_AT_EXECVE_CHECK: LazyLock<bool> = LazyLock::new(|| {
let (major, minor) = *KERNEL_VERSION;
major > 6 || (major == 6 && minor >= 14)
});
pub static HAVE_PROCMAP_QUERY: LazyLock<bool> = LazyLock::new(|| {
let (major, minor) = *KERNEL_VERSION;
major > 6 || (major == 6 && minor >= 11)
});
pub static HAVE_MADV_GUARD: LazyLock<bool> = LazyLock::new(|| {
let (major, minor) = *KERNEL_VERSION;
major > 6 || (major == 6 && minor >= 13)
});
pub static HAVE_CROSS_MEMORY_ATTACH: LazyLock<bool> = LazyLock::new(check_cross_memory_attach);
pub static HAVE_PROC_PID_FD_STAT_SIZE: LazyLock<bool> = LazyLock::new(|| {
let (major, minor) = *KERNEL_VERSION;
major > 6 || (major == 6 && minor >= 2)
});
pub static HAVE_RWF_NOAPPEND: LazyLock<bool> = LazyLock::new(|| {
let (major, minor) = *KERNEL_VERSION;
major > 6 || (major == 6 && minor >= 9)
});
pub static HAVE_NAMESPACED_PID_MAX: LazyLock<bool> = LazyLock::new(|| {
let (major, minor) = *KERNEL_VERSION;
major > 6 || (major == 6 && minor >= 14)
});
pub(crate) const SHM_UNSAFE_MASK: u64 = 0o177;
pub const MFD_NAME_PREFIX: &[u8] = b"!memfd:";
pub const MFD_HUGETLB_NAME_PREFIX: &[u8] = b"!memfd-hugetlb:";
pub const LOOPBACK_BIGTCP_MAX: u32 = 0x30d40;
pub static MMAP_MIN_ADDR: LazyLock<u64> =
LazyLock::new(|| proc_mmap_min_addr().unwrap_or(*PAGE_SIZE).max(*PAGE_SIZE));
pub(crate) const PTRACE_DATA_CHDIR: u16 = 0;
pub(crate) const PTRACE_DATA_EXECVE: u16 = 1;
pub(crate) const PTRACE_DATA_EXECVEAT: u16 = 2;
pub(crate) const PTRACE_DATA_SIGRETURN: u16 = 3;
pub(crate) const PTRACE_DATA_RT_SIGRETURN: u16 = 4;
pub(crate) static _RAND_TIMER: OnceLock<RandTimer> = OnceLock::new();
#[expect(clippy::disallowed_methods)]
#[expect(non_snake_case)]
#[inline(always)]
pub(crate) fn RAND_TIMER() -> &'static RandTimer {
_RAND_TIMER.get().unwrap()
}
pub fn timer_init() -> Result<(), Errno> {
let timer = RandTimer::new()?;
info!("ctx": "run", "op": "sysinfo_init_timer",
"msg": "initialized internal sysinfo(2) randomized timer",
"off": [timer.uptime_offset, timer.idle_offset]);
_RAND_TIMER.set(timer).or(Err(Errno::EAGAIN))?;
Ok(())
}
#[expect(clippy::disallowed_methods)]
#[expect(non_snake_case)]
#[inline(always)]
pub(crate) fn ROOT_FD() -> RawFd {
*_ROOT_FD.get().unwrap()
}
#[expect(clippy::disallowed_methods)]
#[expect(non_snake_case)]
#[inline(always)]
pub(crate) fn ROOT_F_MODE() -> u16 {
*_ROOT_F_MODE.get().unwrap()
}
#[expect(clippy::disallowed_methods)]
#[expect(non_snake_case)]
#[inline(always)]
pub(crate) fn ROOT_MNT_ID() -> u64 {
*_ROOT_MNT_ID.get().unwrap()
}
#[expect(non_snake_case)]
#[inline(always)]
pub(crate) fn ROOT_FILE() -> BorrowedFd<'static> {
unsafe { BorrowedFd::borrow_raw(ROOT_FD()) }
}
#[expect(clippy::disallowed_methods)]
#[expect(non_snake_case)]
#[inline(always)]
pub(crate) fn PROC_FD() -> RawFd {
*_PROC_FD.get().unwrap()
}
#[expect(clippy::disallowed_methods)]
#[expect(non_snake_case)]
#[inline(always)]
pub(crate) fn PROC_F_MODE() -> u16 {
*_PROC_F_MODE.get().unwrap()
}
#[expect(clippy::disallowed_methods)]
#[expect(non_snake_case)]
#[inline(always)]
pub(crate) fn PROC_MNT_ID() -> u64 {
*_PROC_MNT_ID.get().unwrap()
}
#[expect(non_snake_case)]
#[inline(always)]
pub(crate) fn PROC_FILE() -> BorrowedFd<'static> {
unsafe { BorrowedFd::borrow_raw(PROC_FD()) }
}
#[expect(clippy::disallowed_methods)]
#[expect(non_snake_case)]
#[inline(always)]
pub(crate) fn NULL_FD() -> RawFd {
*_NULL_FD.get().unwrap()
}
#[expect(clippy::disallowed_methods)]
#[expect(non_snake_case)]
#[inline(always)]
pub(crate) fn NULL_F_MODE() -> u16 {
*_NULL_F_MODE.get().unwrap()
}
#[expect(clippy::disallowed_methods)]
#[expect(non_snake_case)]
#[inline(always)]
pub(crate) fn NULL_MNT_ID() -> u64 {
*_NULL_MNT_ID.get().unwrap()
}
pub(crate) static _ROOT_FD: OnceLock<RawFd> = OnceLock::new();
pub(crate) static _ROOT_F_MODE: OnceLock<u16> = OnceLock::new();
pub(crate) static _ROOT_MNT_ID: OnceLock<u64> = OnceLock::new();
pub(crate) static _PROC_FD: OnceLock<RawFd> = OnceLock::new();
pub(crate) static _PROC_F_MODE: OnceLock<u16> = OnceLock::new();
pub(crate) static _PROC_MNT_ID: OnceLock<u64> = OnceLock::new();
pub(crate) static _NULL_FD: OnceLock<RawFd> = OnceLock::new();
pub(crate) static _NULL_F_MODE: OnceLock<u16> = OnceLock::new();
pub(crate) static _NULL_MNT_ID: OnceLock<u64> = OnceLock::new();
#[expect(clippy::cast_possible_truncation)]
#[expect(clippy::cognitive_complexity)]
#[expect(clippy::disallowed_methods)]
pub fn proc_init() -> Result<(), Errno> {
let mut mask = STATX_MODE;
mask |= if *HAVE_STATX_MNT_ID_UNIQUE {
STATX_MNT_ID_UNIQUE
} else {
STATX_MNT_ID
};
let fd_root = nix::fcntl::open(
"/",
OFlag::O_PATH | OFlag::O_DIRECTORY | OFlag::O_CLOEXEC,
Mode::empty(),
)?;
let (f_mode_root, mnt_id_root) = fstatx(&fd_root, mask)
.map(|stx| (stx.stx_mode & !(libc::S_IFMT as u16), stx.stx_mnt_id))?;
let fd_root = duprand(fd_root.as_raw_fd(), OFlag::O_CLOEXEC)?;
info!("ctx": "run", "op": "opendir_root",
"msg": "opened root directory",
"fd": fd_root,
"f_mode": f_mode_root,
"mnt_id": mnt_id_root);
_ROOT_FD.set(fd_root).or(Err(Errno::EAGAIN))?;
_ROOT_F_MODE.set(f_mode_root).or(Err(Errno::EAGAIN))?;
_ROOT_MNT_ID.set(mnt_id_root).or(Err(Errno::EAGAIN))?;
let fd_root = unsafe { BorrowedFd::borrow_raw(fd_root) };
let fd_proc = nix::fcntl::openat(
fd_root,
XPath::from_bytes(b"proc"),
OFlag::O_DIRECTORY | OFlag::O_CLOEXEC,
Mode::empty(),
)?;
let (f_mode_proc, mnt_id_proc) = fstatx(&fd_proc, mask)
.map(|stx| (stx.stx_mode & !(libc::S_IFMT as u16), stx.stx_mnt_id))?;
let fd_proc = duprand(fd_proc.as_raw_fd(), OFlag::O_CLOEXEC)?;
info!("ctx": "run", "op": "opendir_proc",
"msg": "opened /proc directory",
"fd": fd_proc,
"f_mode": f_mode_proc,
"mnt_id": mnt_id_proc);
_PROC_FD.set(fd_proc).or(Err(Errno::EAGAIN))?;
_PROC_F_MODE.set(f_mode_proc).or(Err(Errno::EAGAIN))?;
_PROC_MNT_ID.set(mnt_id_proc).or(Err(Errno::EAGAIN))?;
let fd_null = nix::fcntl::openat(
fd_root,
XPath::from_bytes(b"dev/null"),
OFlag::O_PATH | OFlag::O_CLOEXEC,
Mode::empty(),
)?;
let (f_mode_null, mnt_id_null) = fstatx(&fd_null, mask)
.map(|stx| (stx.stx_mode & !(libc::S_IFMT as u16), stx.stx_mnt_id))?;
if !is_dev_null(&fd_null).unwrap_or(false) {
return Err(Errno::ENODEV);
}
let fd_null = duprand(fd_null.as_raw_fd(), OFlag::O_CLOEXEC)?;
info!("ctx": "run", "op": "opendev_null",
"msg": "opened /dev/null",
"fd": fd_null,
"f_mode": f_mode_null,
"mnt_id": mnt_id_null);
_NULL_FD.set(fd_null).or(Err(Errno::EAGAIN))?;
_NULL_F_MODE.set(f_mode_null).or(Err(Errno::EAGAIN))?;
_NULL_MNT_ID.set(mnt_id_null).or(Err(Errno::EAGAIN))?;
Ok(())
}
pub fn proc_close() {
if let Some(fd) = _ROOT_FD.get() {
let _ = close(*fd);
}
if let Some(fd) = _PROC_FD.get() {
let _ = close(*fd);
}
if let Some(fd) = _NULL_FD.get() {
let _ = close(*fd);
}
}
pub(crate) static FILEMAP: LazyLock<FileMap> = LazyLock::new(|| {
let mut filemap: FileMap = FileMap::with_capacity(FILECAP);
let entry = FileMapEntry::new(
ROOT_FD().into(),
Some(FileType::Dir),
Some(ROOT_F_MODE()),
Some(ROOT_MNT_ID()),
None,
);
filemap.0.insert(XPathBuf::from("/"), entry);
let entry = FileMapEntry::new(
PROC_FD().into(),
Some(FileType::Dir),
Some(PROC_F_MODE()),
Some(PROC_MNT_ID()),
None,
);
filemap.0.insert(XPathBuf::from("/proc"), entry);
let entry = FileMapEntry::new(
NULL_FD().into(),
Some(FileType::Chr),
Some(NULL_F_MODE()),
Some(NULL_MNT_ID()),
None,
);
filemap.0.insert(XPathBuf::from("/dev/null"), entry);
filemap
});
pub(crate) const FILECAP: usize = 8;
#[cfg(panic = "unwind")]
#[deprecated(
note = "Built with panic=unwind. This configuration is not supported; you have been warned."
)]
#[expect(dead_code)]
const SYD_PANIC_UNWIND_BUILD: () = ();
#[cfg(panic = "unwind")]
const _: () = {
let _ = SYD_PANIC_UNWIND_BUILD;
};
pub const PINK_FLOYD: &str = concat!(
"\x1b[01;35m",
" ..uu. \n",
" ?$\"\"`?i z' \n",
" `M .@\" x\" \n",
" 'Z :#\" . . f 8M \n",
" '&H?` :$f U8 < MP x#' \n",
" d#` XM $5. $ M' xM\" \n",
" .!\"> @ 'f`$L:M R.@!` \n",
" +` > R X \"NXF R\"*L \n",
" k 'f M \"$$ :E 5. \n",
" %% `~ \" ` 'K 'M \n",
" .uH 'E `h \n",
" .x*` X ` \n",
" .uf` * \n",
" .@8 . \n",
" 'E9F uf\" , , \n",
" 9h+\" $M eH. 8b. .8 ..... \n",
" .8` $' M 'E `R;' d?\"\"\"`\"# \n",
" ` E @ b d 9R ?* @ \n",
" > K.zM `%%M' 9' Xf .f \n",
" ; R' 9 M .=` \n",
" t M Mx~ \n",
" @ lR z\" \n",
" @ ` ;\" \n",
" ` \n",
"\x1b[0m",
);
pub const SEE_EMILY_PLAY: &str = concat!(
"\x1b[0;1;35;95mTh",
"\x1b[0;1;31;91mer",
"\x1b[0;1;33;93me",
"\x1b[0m ",
"\x1b[0;1;32;92mis",
"\x1b[0m ",
"\x1b[0;1;36;96mn",
"\x1b[0;1;34;94mo",
"\x1b[0m ",
"\x1b[0;1;35;95mot",
"\x1b[0;1;31;91mhe",
"\x1b[0;1;33;93mr",
"\x1b[0m ",
"\x1b[0;1;32;92mda",
"\x1b[0;1;36;96my",
"\x1b[0m",
"\n",
"\x1b[0;1;35;95mLe",
"\x1b[0;1;31;91mt'",
"\x1b[0;1;33;93ms",
"\x1b[0m ",
"\x1b[0;1;32;92mtr",
"\x1b[0;1;36;96my",
"\x1b[0m ",
"\x1b[0;1;34;94mit",
"\x1b[0m ",
"\x1b[0;1;35;95ma",
"\x1b[0;1;31;91mno",
"\x1b[0;1;33;93mth",
"\x1b[0;1;32;92mer",
"\x1b[0m ",
"\x1b[0;1;36;96mw",
"\x1b[0;1;34;94may",
"\x1b[0m",
"\n",
"\x1b[0;1;35;95mYo",
"\x1b[0;1;31;91mu'",
"\x1b[0;1;33;93mll",
"\x1b[0m ",
"\x1b[0;1;32;92ml",
"\x1b[0;1;36;96mos",
"\x1b[0;1;34;94me",
"\x1b[0m ",
"\x1b[0;1;35;95myo",
"\x1b[0;1;31;91mur",
"\x1b[0m ",
"\x1b[0;1;33;93mm",
"\x1b[0;1;32;92min",
"\x1b[0;1;36;96md",
"\x1b[0m ",
"\x1b[0;1;34;94man",
"\x1b[0;1;35;95md",
"\x1b[0m ",
"\x1b[0;1;31;91mpl",
"\x1b[0;1;33;93may",
"\x1b[0m",
"\n",
"\x1b[0;1;35;95mFr",
"\x1b[0;1;31;91mee",
"\x1b[0m \x1b[0;1;33;93mg",
"\x1b[0;1;32;92mam",
"\x1b[0;1;36;96mes",
"\x1b[0m ",
"\x1b[0;1;34;94mf",
"\x1b[0;1;35;95mor",
"\x1b[0m ",
"\x1b[0;1;31;91mm",
"\x1b[0;1;33;93may",
"\x1b[0m",
"\n",
"\x1b[0;1;35;95mSe",
"\x1b[0;1;31;91me",
"\x1b[0m ",
"\x1b[0;1;33;93mEm",
"\x1b[0;1;32;92mil",
"\x1b[0;1;36;96my",
"\x1b[0m ",
"\x1b[0;1;34;94mpl",
"\x1b[0;1;35;95may",
"\x1b[0m",
"\n",
);
pub const THE_PIPER: &str = concat!(
"Helper and healer, I cheer\n",
"Small waifs in the woodland wet\n",
"Strays I find in it, wounds I bind in it\n",
"Bidding them all forget!\n",
);