Repository navigation
Known Limitations and Roadmap
thefoulowl edited this page Sep 4, 2026
·
1 revision
-
No inode/rename tracking.
tracematches by exact path string. A file extracted or renamed to a new path shows up as an unrelated path, not a continuation of the same chain. The flagship "malware.zip → extracted → malware.exe" example only chains correctly because the extracting process opens both paths whilewatchis running (so the link is real, just derived from co-occurrence, not inode identity) — amvor archive tool that doesn't hold both paths open at once would break the link. -
No library-load tracking. Only the top-level
execve()target is recorded, notdlopen()/dynamic linker activity. -
PID reuse is handled, but coarsely.
processesis keyed by(pid, started_ns)so distinct lifetimes of a recycled pid don't collide in the schema — but nothing currently prunes old rows, so the database grows without bound under a long-runningwatch. -
Requires root (or
CAP_BPF+CAP_PERFMON) and a kernel exposing BTF at/sys/kernel/btf/vmlinux(5.8+, most distro kernels since ~2021). -
Single-host, no container/namespace awareness. A
pidis a host pid; events aren't tagged with cgroup or mount namespace, so container-to-container provenance isn't distinguished. - Ring buffer backpressure drops events, silently, under extreme burst. See BPF Hooks Reference § Ring buffer sizing.
-
Pre-existing processes are seeded from
/proc, not observed.watchsnapshots/procat startup so already-running processes get a name instead of a bare pid, but/proconly reports a process's current identity — a process that exec'd several times before provctl started shows only its latest image, and its earlier lineage is unrecoverable.
-
Inode-based provenance. Track
(device, inode)alongside path infile_eventsso renames/moves outside provctl's direct view can still be linked (requires also hooking rename-family syscalls). -
Database retention/pruning. A
--retain <duration>flag onwatchto cap how long old process lifetimes and event rows are kept. -
Container/namespace tagging. Record cgroup id / mount namespace on
each event so
ps/trace/timelinecan scope to one container. -
Library-load visibility. Either via
dlopenuprobes or by reading/proc/<pid>/mapsat exec time as a cheaper approximation. -
provctl watchas a systemd service with the distro packages (see Installation), so capture survives reboots without a manualsudo provctl watch &.
Have an idea or found a real gap? Open an issue on the repo.