Support Matrix

April 16, 2026 · View on GitHub

This document describes exactly what procscope can and cannot observe, under what conditions, and with what confidence.

Kernel Requirements

RequirementMinimumRecommendedNotes
Kernel version5.86.1+Ring buffer, CAP_BPF
BTFRequiredRequiredCONFIG_DEBUG_INFO_BTF=y
BPFRequiredRequiredCONFIG_BPF=y, CONFIG_BPF_SYSCALL=y
TracepointsRequiredRequiredCONFIG_TRACEPOINTS=y

BTF Availability

BTF is available by default on:

  • ✅ Kali Linux (6.x kernels)
  • ✅ Parrot Security OS (6.x kernels)
  • ✅ Ubuntu 20.10+
  • ✅ Fedora 31+
  • ✅ Debian 12+
  • ✅ Arch Linux (rolling, current kernels)
  • ⚠️ Older RHEL/CentOS may need explicit kernel-debuginfo or BTF backport

Event Support Matrix

Process Lifecycle

EventSyscall/TracepointConfidenceNotes
execsched/sched_process_execExactFilename from tracepoint data
forksched/sched_process_forkExactChild PID auto-tracked
exitsched/sched_process_exitExactExit code best-effort
argvN/APartialLimited by eBPF stack; first args only
ppidtask_struct->real_parentExactVia CO-RE

File Activity

EventSyscallConfidenceLimitations
opensys_enter_openatBest-effortMisses open() (rare on modern libc), openat2
createInferred from openat flagsBest-effortO_CREAT flag detection
renamesys_enter_renameat2Best-effortMisses rename() (uses renameat2 on modern libc)
unlinksys_enter_unlinkatBest-effortMisses unlink() (uses unlinkat on modern libc)
chmodsys_enter_fchmodatBest-effortMisses chmod(), fchmod()
chownsys_enter_fchownatBest-effortMisses chown(), fchown(), lchown()
read/writeNot tracedN/AData content is not captured by design
io_uringNot tracedN/Aio_uring file ops are invisible
sendfileNot tracedN/A

Path resolution: Paths from openat with dirfd != AT_FDCWD will be relative, not absolute. Full path resolution would require resolving /proc/[pid]/fd/[dirfd] which is expensive in BPF.

Network Activity

EventSyscallConfidenceLimitations
connectsys_enter_connectBest-effortIPv4/IPv6 address+port extracted
acceptsys_enter_accept4Best-effortRemote address not available at enter (would need exit probe)
bindsys_enter_bindBest-effortLocal address+port extracted
listensys_enter_listenBest-effortBacklog value captured
protocolInferredInferredAlways reports "tcp" (socket type not available at syscall enter)
UDPPartiallyBest-effortconnect() on UDP sockets visible, but sendto() is not traced
Unix domainPartiallyBest-effortAddress family visible but path not extracted

DNS

FeatureMethodConfidenceLimitations
DNS queriesNot directlyN/ADNS extraction is NOT implemented in eBPF v1
DNS via connectconnect() to port 53InferredCan detect connections to port 53, but not query content

Honest assessment: Full DNS query extraction would require packet payload parsing in BPF (complex, fragile) or userspace socket buffer reading. This is deferred to post-v1 and will remain best-effort when implemented.

Privilege Transitions

EventSyscallConfidenceLimitations
setuidsys_enter_setuidExactOld/new UID captured
setgidsys_enter_setgidExactOld/new GID captured
ptracesys_enter_ptraceBest-effortRequest type + target PID
setresuidNot tracedN/AWould need additional probe
setresgidNot tracedN/AWould need additional probe
capabilitiesNot tracedN/Acap_set would need separate probe

Namespace Changes

EventSyscallConfidenceLimitations
setnssys_enter_setnsBest-effortNS type flags captured
unsharesys_enter_unshareBest-effortClone flags captured
clone (ns flags)Not directlyN/AFork probe captures clone but doesn't parse ns flags

Mount Operations

EventSyscallConfidenceLimitations
mountsys_enter_mountBest-effortSource, target, fstype, flags
umountNot tracedN/A
mount_setattrNot tracedN/A

What procscope Does NOT Observe

  • File read/write content — by design, data payloads are not captured
  • io_uring operations — completely invisible to syscall tracepoints
  • sendfile/splice — not traced
  • Memory mapping — mmap not traced
  • Signal delivery — not traced (except as it causes exit)
  • IPC — shared memory, message queues, semaphores not traced
  • eBPF program loading — by other processes not traced
  • Kernel module loading — not traced
  • Static binary internals — statically linked programs may bypass libc wrappers; most syscalls are still visible via tracepoints
  • DoT/DoH DNS — encrypted DNS is opaque
  • Container runtime metadata — Docker/containerd labels require API access

Architecture Support

ArchitectureStatusNotes
amd64 (x86_64)✅ SupportedPrimary target
arm64 (aarch64)✅ SupportedCross-compiled, less tested
arm (32-bit)❌ Not supported
riscv64❌ Not supportedMay work with BTF but untested