Helius
Get in touch

Kernel & Linux

Detect attacks where they happen: in the Linux kernel

Security that runs in the kernel, not beside it.

The problem

Runtime security on Linux is mostly sold as a closed agent, licensed per host, running as root, doing something you are not allowed to read. It sees what its vendor decided to instrument, it costs more as you grow, and when it misses something you have no way to find out why. Meanwhile the primitives to do this properly have been in the kernel for years.

The approach

I write the instrumentation instead of renting it. eBPF programs attached to process lifecycle and the syscalls that matter most, LSM and kprobe hooks that enforce rather than observe, and filtering done in the kernel so the uninteresting 99% never becomes egress or an ingest bill. The userspace side is Rust, because memory safety matters more than usual in a process that runs privileged on every host you own.

What you get

  • eBPF probes attached to the process and syscall events your threat model cares about
  • Rust userspace agent, built from source in your pipeline, no vendor binary
  • In-kernel filtering so uninteresting events never leave the kernel
  • Attack surface review: what runs, what is reachable, what can be removed
  • Detection alerts in the monitoring you already run — Prometheus, Zabbix or Grafana — each with a runbook
  • The probe source in your repository, documented well enough to change

Example

probes/src/exec.bpf.c

// SPDX-License-Identifier: GPL-2.0
#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_tracing.h>
#include <bpf/bpf_core_read.h>

char LICENSE[] SEC("license") = "GPL";

struct event {
    u32 pid;
    u32 ppid;
    u32 uid;
    char filename[128];
};

struct {
    __uint(type, BPF_MAP_TYPE_RINGBUF);
    __uint(max_entries, 256 * 1024);
} events SEC(".maps");

/* Report execs that run as root. Everything else is dropped here, in the
   kernel — no ring buffer slot, no userspace wakeup, no egress, no bill. */
static __always_inline bool should_report(struct task_struct *task)
{
    return BPF_CORE_READ(task, cred, euid.val) == 0;
}

SEC("tp_btf/sched_process_exec")
int BPF_PROG(on_exec, struct task_struct *task,
             pid_t old_pid, struct linux_binprm *bprm)
{
    struct event *e;

    if (!should_report(task))
        return 0;

    e = bpf_ringbuf_reserve(&events, sizeof(*e), 0);
    if (!e)
        return 0;

    e->pid  = BPF_CORE_READ(task, tgid);
    e->ppid = BPF_CORE_READ(task, real_parent, tgid);
    e->uid  = BPF_CORE_READ(task, cred, uid.val);
    bpf_probe_read_kernel_str(e->filename, sizeof(e->filename),
                              BPF_CORE_READ(bprm, filename));

    bpf_ringbuf_submit(e, 0);
    return 0;
}

Tell me what is broken

A short description is enough. Within one business day I will tell you what I think the problem is, roughly how long it takes, and whether you need me at all. Sometimes the honest answer is no.

I reply within 1 business day · No contact forms, no tracking pixels, no CRM sequence.