Skip to content

Sensor Overview

The Telovix Sensor is the node-resident runtime that collects kernel-level activity from a Linux host and streams it to the Console over mTLS. It runs as a single self-contained binary (~89 MB) that embeds the eBPF engine, all BPF object files, and the sensor controller in one package. It requires no kernel patches, no kernel modules, and no external dependencies beyond a supported Linux kernel.


Where to start

If you are...Start here
Installing the sensor on a VM or bare-metal host for the first timeSensor: VM / Bare Metal
Deploying to a Kubernetes clusterSensor: Kubernetes (Helm)
Choosing between standard and telecom flavorStandard vs Telecom Flavor
Diagnosing a sensor that shows stale, degraded, or offlineHealth States and Heartbeat
Assigning a policy pack to a sensorPolicy Packs
Enabling enforcement to block or kill at the kernel levelEnforcement Mode
Writing a custom detection ruleCustom Detection Rules
Understanding what the sensor monitors (kprobes and LSM hooks)Kprobes Reference and LSM Hooks Reference
Isolating a sensor during an incidentContainment and Isolation
Checking kernel requirements for BTF and BPF LSMRequirements

What the sensor does

The sensor attaches eBPF hooks at enrollment time and runs two concurrent loops in steady state:

  • Heartbeat loop (every 15 seconds): reads events from the engine's JSONL export, enriches them, and sends a structured payload to the Console. The payload includes events, resource metrics, trust state, listening services, active connections, Kubernetes inventory, and (on the telecom flavor) telecom protocol reports.
  • WebSocket stream loop (every 500 ms): maintains a persistent WebSocket connection to the Console for low-latency event delivery and receipt of operator-initiated policy pushes. The Console treats any sensor with an active WebSocket connection as healthy regardless of the 90-second heartbeat staleness window.

If the Console is unreachable, the sensor spools events to /var/lib/telovix-sensor/events.jsonl (capped at 100,000 events). On reconnect, it drains up to 100 spooled events per heartbeat.


Sensor flavors

FlavorBinary nameWhat it collects
standardtelovix-sensorProcess execution, file access, network connections, privilege changes, namespace creation, kernel module loads, ptrace, FIM, SBOM, Kubernetes workload visibility, behavioral anomaly scoring.
telecomtelovix-sensor-telecomEverything in standard, plus: 5G Core NF role detection (24 roles), O-RAN node detection, NGAP/F1AP/E1AP/XnAP/E2AP/PFCP/GTP-U/SCTP/Diameter/RADIUS/SIP/SBI-HTTP2/NAS5G protocol parsing and anomaly detection, NF SLO monitoring, TLS uprobe visibility (OpenSSL, Go TLS, BoringSSL), timing and synchronization monitoring, and telecom-specific attack chain detection.

The flavor is selected at install time and embedded in the binary. Changing from standard to telecom (or back) requires re-installing the binary. Sensor identity (mTLS certificates, sensor ID, policy packs) is preserved across a flavor change.


eBPF event kinds

The sensor attaches kprobes, BPF LSM hooks, and uprobes. The following event kinds are produced:

Event kindSourceSeverityDescription
process_execsys_execve kprobeinfoProcess execution with full argument list and ancestor chain
process_exitsys_exit_group kprobeinfoProcess termination with exit code
process_forksys_clone kprobeinfoProcess or thread fork
process_exec_burstaggregationwarning5 or more execs from the same parent within 1 second
process_fork_burstaggregationwarning3 or more forks from the same parent within 1 second
network_connecttcp_connect kprobeinfoOutbound TCP or UDP connection
network_acceptinet_csk_accept kprobeinfoServer-side TCP accept
network_listeninet_listen kprobewarningSocket placed in LISTEN state
network_flowtcp_close aggregationinfoCompleted TCP flow with duration, state, and bytes sent
dns_queryudp_sendmsg kprobeinfoDNS query on port 53, 853, or 5353; non-standard resolvers flagged
dns_lookupgetaddrinfo uprobeinfoHostname resolution at the glibc level
dns_resolutioncorrelationinfoHostname-to-IP correlation from getaddrinfo and tcp_connect
file_openopenat kprobeinfoFile read access to sensitive paths (credentials, SSH keys)
file_writesys_write VFS kprobecriticalWrite to sensitive system file
fim_alertFIM baseline comparisoncriticalFile hash, inode, or size mismatch against startup baseline
ptracesys_ptrace kprobewarningDebugger or tracer attached
privilege_changesys_setuid kprobewarningUID or GID change
namespace_createsys_clone with CLONE_NEW*warningNew Linux namespace created
cap_changecap_capable BPF LSMwarningCapability mask change
signalsys_kill kprobewarningSignal sent between processes
module_loadsys_init_module kprobehighKernel module loaded
bpf_object_getsys_bpf kprobecriticalAccess to BPF map (potential sensor tampering)
bpf_map_updatesys_bpf kprobecriticaleBPF map modified (potential sensor disablement)

Events are enriched with the full process ancestor chain, workload context (container ID, Kubernetes namespace, workload name and type), and network namespace ID. On the telecom flavor, events for detected NF processes include the NF role.


In-memory caches

The sensor maintains four in-memory caches to enrich events without reading /proc on every event:

CacheKeyPurposeCapacity
ProcessCacheexec_idAncestor chain, workload context, cgroup path, network namespace8,192 entries
FlowTrackersocket cookieTCP flow duration and final stateEvicts flows older than 1 hour
DnsCorrelatorPIDCorrelates getaddrinfo hostname lookups with subsequent tcp_connect events16 pending lookups per PID, 10-second window
K8sCachepod UIDPod metadata, workload status, network policies, services, ingresses, pod security posturesRefreshed every 30 seconds

The telecom flavor adds a TelecomNfInventory that maps running process IDs to detected NF roles, updated on each heartbeat as the sensor observes protocol activity. Detection uses port binding patterns, process name heuristics, binary path patterns, and gRPC service port detection.


File Integrity Monitoring

At startup, the sensor builds a SHA-256 baseline for files under the following path groups:

  • System binaries and libraries: /usr/bin, /bin, /lib, /lib64, /usr/lib, /usr/local/bin, /usr/local/lib
  • Credentials: /etc/passwd, /etc/shadow, /etc/sudoers, /etc/sudoers.d, /etc/pam.d, PAM libraries
  • Dynamic linker: /etc/ld.so.preload, /etc/ld.so.conf
  • SSH configuration: /etc/ssh
  • Persistence paths: /etc/cron.d, /etc/crontab, cron directories, /etc/rc.local, /etc/init.d, /etc/systemd/system, /usr/lib/systemd/system, /etc/profile.d, /etc/udev/rules.d
  • Authentication logs: /var/log/auth.log, /var/log/secure, /var/log/audit/audit.log

On every file_write event, the sensor recomputes the SHA-256 hash and compares it to the baseline. A mismatch in hash, inode, or file size emits a fim_alert event with severity: critical.


Anomaly scoring

The sensor scores each event against per-binary behavioral baselines built over a 14-day learning window. During learning, scores are computed but alerts are suppressed. Full alerting activates automatically after 14 days or 100+ events for that binary.

final_score = max_signal × 0.65 + weighted_avg × 0.35

max_signal   = max(spawn_score, net_score, file_score, args_score)
weighted_avg = spawn×0.40 + net×0.25 + file×0.15 + args×0.20

High-signal events bypass the learning window: ptrace, fim_alert, module_load, bpf_map_update, and command-line arguments matching known shell injection patterns (scored 85 or above).


On-disk state

After enrollment, the sensor stores the following files under its state directory (default /var/lib/telovix-sensor):

PathDescription
client.key.pemActive mTLS private key (mode 600)
client.cert.pemActive mTLS client certificate
client.prev.key.pemPrevious key (kept during certificate renewal overlap window)
client.prev.cert.pemPrevious certificate (kept during renewal overlap window)
console-ca.cert.pemConsole CA trust anchor
policy-signing.pubEd25519 public key for policy pack signature verification
sensor-state.jsonEnrollment state, sensor ID, trust state, certificate expiry
assigned-pack.jsonCurrent policy pack ID, version, enforcement state
compiled-policies/Active TracingPolicy YAML files
events.jsonlOn-disk event spool
engine/v1.7.0/Extracted eBPF engine binaries and BPF object files

The eBPF engine writes its own event stream to engine/events.jsonl. The sensor tails this file continuously.



Operational model

After enrollment, the sensor is operated entirely from the Console:

  • Policy packs, enforcement rules, and custom detection rules are pushed via the heartbeat response
  • Certificate renewal is triggered automatically by the Console and completed at the next heartbeat
  • Binary upgrades are signaled via the heartbeat response and applied by the sensor itself (VM/bare-metal) or via helm upgrade (Kubernetes)
  • Tags and sensor metadata can be updated from Sensors > [sensor] without touching the host

The sensor never opens an inbound port. All communication is outbound from the sensor to the Console.


Further reading

Released under the Telovix Commercial License.