CAP_ENTER(2)
π CAP_ENTER(2) π
okay so bestie, we're in the System Calls Manual today and this one is actually iconic. no cap. this is the cap_enter, cap_getmode page β Capability mode system calls β¨
π LIBRARY
Standard C Library (libc, -lc) π«Ά
π SYNOPSIS
#include <sys/capsicum.h>
int
cap_enter(void);
int
cap_getmode(u_int *modep);
β¨ DESCRIPTION β¨
so cap_enter() is the main character here. it places the current process into capability mode, which is a whole mode of execution where processes may only issue system calls that operate on file descriptors, or that read limited global system state. like, that's it. that's the vibe. π
access to global name spaces β think file system or IPC name spaces β is prevented. blocked. not invited to the party. π
and if the process is already in a capability mode sandbox? the system call is just a no-op. nothing happens, we move on, periodt.
future process descendants created with fork(2) or pdfork(2) will be placed in capability mode from inception. so the babies are born sandboxed, iykyk π
when you combine it with cap_rights_limit(2), cap_ioctls_limit(2), and cap_fcntls_limit(2), cap_enter() may be used to create kernel-enforced sandboxes in which appropriately-crafted applications or application components may be run. that's the dream setup fr fr π
then cap_getmode() β she's the vibes checker. she returns a flag indicating whether or not the process is in a capability mode sandbox. π¦
πΈ RUN-TIME SETTINGS πΈ
if the kern.trap_enotcap sysctl MIB is set to a non-zero value, then for any process executing in a capability mode sandbox, any syscall which results in either an ENOTCAPABLE or ECAPMODE error also generates the synchronous SIGTRAP signal to the thread on the syscall return. π
on signal delivery, the si_errno member of the siginfo signal handler parameter is set to the syscall error value, and the si_code member is set to TRAP_CAP.
also go peek at the PROC_TRAPCAP_CTL and PROC_TRAPCAP_STATUS operations of the procctl(2) function for similar per-process functionality. π
β οΈ CAVEAT β οΈ
ngl, creating effective process sandboxes is a tricky process. it involves identifying the least possible rights required by the process and then passing those rights into the process in a safe manner.
consumers of cap_enter() should also be aware of other inherited rights, such as access to VM resources, memory contents, and other process properties that should be considered. don't sleep on those. π
it is advisable to use fexecve(2) to create a runtime environment inside the sandbox that has as few implicitly acquired rights as possible. do that. for me. π«Ά
π RETURN VALUES π
the cap_enter() and cap_getmode() functions return the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.
when the process is in capability mode, cap_getmode() sets the flag to a non-zero value. a zero value means the process is not in capability mode. simple as that bestie β¨
π₯ ERRORS π₯
the cap_enter() and cap_getmode() system calls will fail if:
[ENOSYS]β The kernel is compiled without:
options CAPABILITY_MODE
the cap_getmode() system call may also return the following error:
[EFAULT]β Pointer modep points outside the process's allocated address space.
π SEE ALSO π
cap_fcntls_limit(2), cap_ioctls_limit(2), cap_rights_limit(2), fexecve(2), procctl(2), cap_sandboxed(3), capsicum(4), sysctl(9)
π¦ HISTORY π¦
the cap_getmode() system call first appeared in FreeBSD 8.3. support for capabilities and capabilities mode was developed as part of the TrustedBSD Project. we love a legacy π
π AUTHORS π
these functions and the capability facility were created by Robert N. M. Watson at the University of Cambridge Computer Laboratory, with support from a grant from Google, Inc. absolute legend behavior, honestly π
and that's the whole page bestie!! this was shipped as part of Debian, dated May 5, 2020, and it lives in the CAP_ENTER(2) slot of the manual. go forth and sandbox responsibly π β¨π
π¦ where this page comes from
- debian bookworm: freebsd-manpages 12.2-1 Β· BSD-2-Clause-FreeBSD AND BSD-4-Clause
- debian trixie: freebsd-manpages 12.2-2 Β· BSD-2-Clause-FreeBSD AND BSD-4-Clause
- ubuntu jammy: freebsd-manpages 12.2-1 Β· BSD-2-Clause-FreeBSD AND BSD-4-Clause
- ubuntu noble: freebsd-manpages 12.2-1 Β· BSD-2-Clause-FreeBSD AND BSD-4-Clause
- ubuntu questing: freebsd-manpages 12.2-2
- ubuntu resolute: freebsd-manpages 12.2-2build1 Β· BSD-2-Clause-FreeBSD AND BSD-4-Clause
- ubuntu stonking: freebsd-manpages 12.2-2build1 Β· BSD-2-Clause-FreeBSD AND BSD-4-Clause
- Copyright (c) 2008-2009 Robert N. M. Watson
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms