<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mutasem Kharma</title>
    <description>The latest articles on DEV Community by Mutasem Kharma (@mutasem_mk4).</description>
    <link>https://dev.to/mutasem_mk4</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3884412%2F7e7dfb18-5f5a-43d3-ad5c-86b335a0a033.jpg</url>
      <title>DEV Community: Mutasem Kharma</title>
      <link>https://dev.to/mutasem_mk4</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mutasem_mk4"/>
    <language>en</language>
    <item>
      <title>Why I built procscope instead of just using Tracee or Falco</title>
      <dc:creator>Mutasem Kharma</dc:creator>
      <pubDate>Fri, 17 Apr 2026 14:17:54 +0000</pubDate>
      <link>https://dev.to/mutasem_mk4/why-i-built-procscope-instead-of-just-using-tracee-or-falco-19c2</link>
      <guid>https://dev.to/mutasem_mk4/why-i-built-procscope-instead-of-just-using-tracee-or-falco-19c2</guid>
      <description>&lt;p&gt;If you work in cloud security, you are probably exhausted by the acronym soup of eBPF tools. From Sysdig's Falco to Aqua's Tracee and Isovalent's Tetragon, the market is flooded with "Kernel-Level Observability" daemons.&lt;/p&gt;

&lt;p&gt;So why on earth did I write &lt;a href="https://github.com/Mutasem-mk4/procscope" rel="noopener noreferrer"&gt;procscope&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Because enterprise EDRs are built for fleets, not for incident responders.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Signal-to-Noise Problem
&lt;/h2&gt;

&lt;p&gt;When I get paged because a suspicious container is running a slightly strange binary, I don't want to deploy a massive DaemonSet across my cluster, configure 30 YAML policy files, and then try to grep through 10,000 JSON logs to find the single &lt;code&gt;/etc/shadow&lt;/code&gt; file access.&lt;/p&gt;

&lt;p&gt;I just want to know what the binary is doing &lt;em&gt;right now&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If I use &lt;code&gt;strace -p&lt;/code&gt;, any cleverly written malware instantly detects the &lt;code&gt;ptrace&lt;/code&gt; system call and goes silent (or worse, bombs the host).&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter procscope
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;procscope&lt;/code&gt; was designed to be the &lt;strong&gt;tactical sniper rifle&lt;/strong&gt; of eBPF, not the shotgun.&lt;/p&gt;

&lt;p&gt;It is a single, statically compiled binary. You don't configure policies. You don't deploy an agent. You literally just pass it the command you want to trace like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;procscope &lt;span class="nt"&gt;--&lt;/span&gt; ./sketchy_installer.sh

Under the hood, &lt;span class="sb"&gt;`&lt;/span&gt;procscope&lt;span class="sb"&gt;`&lt;/span&gt; injects kprobes and tracepoints into the kernel, but filters events &lt;span class="k"&gt;**&lt;/span&gt;at the kernel-level&lt;span class="k"&gt;**&lt;/span&gt; so it &lt;span class="k"&gt;*&lt;/span&gt;only&lt;span class="k"&gt;*&lt;/span&gt; evaluates events originating from that specific PID tree.

Tetragon monitors the entire host. &lt;span class="sb"&gt;`&lt;/span&gt;procscope&lt;span class="sb"&gt;`&lt;/span&gt; monitors the blast radius.

&lt;span class="c"&gt;## What you see in real time&lt;/span&gt;

The timeline spit out on your terminal contains:
- 🌐 Every IP address and port the binary beaconed out to
- 🗂️ Every file it touched, &lt;span class="nb"&gt;read&lt;/span&gt;, or deleted
- 🔐 Every privilege escalation attempt &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;setuid&lt;span class="sb"&gt;`&lt;/span&gt;/&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;chown&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
- ☸️ The Kubernetes Pod and Namespace it belongs to &lt;span class="o"&gt;(&lt;/span&gt;v1.1.0+&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;**&lt;/span&gt;Zero noise. Zero host-wide overhead.&lt;span class="k"&gt;**&lt;/span&gt;

&lt;span class="c"&gt;## Try it right now — in your browser&lt;/span&gt;

No installation required. We built a &lt;span class="o"&gt;[&lt;/span&gt;free interactive sandbox on Killercoda]&lt;span class="o"&gt;(&lt;/span&gt;https://killercoda.com/mutasem04/scenario/procscope-scenario&lt;span class="o"&gt;)&lt;/span&gt; where you can trace a fake reverse-shell payload &lt;span class="k"&gt;in &lt;/span&gt;under 60 seconds.

&lt;span class="o"&gt;[![&lt;/span&gt;Try it &lt;span class="k"&gt;in &lt;/span&gt;the Browser]&lt;span class="o"&gt;(&lt;/span&gt;https://img.shields.io/badge/Try_in_Browser-Killercoda-23C13F?style&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="nt"&gt;-the-badge&lt;/span&gt;&amp;amp;logoColor&lt;span class="o"&gt;=&lt;/span&gt;white&lt;span class="o"&gt;)](&lt;/span&gt;https://killercoda.com/mutasem04/scenario/procscope-scenario&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;## Getting it&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;/p&gt;

&lt;h1&gt;
  
  
  Linux amd64 — single binary, no dependencies
&lt;/h1&gt;

&lt;p&gt;curl -sL &lt;a href="https://github.com/Mutasem-mk4/procscope/releases/download/v1.1.0/procscope_1.1.0_linux_amd64.tar.gz" rel="noopener noreferrer"&gt;https://github.com/Mutasem-mk4/procscope/releases/download/v1.1.0/procscope_1.1.0_linux_amd64.tar.gz&lt;/a&gt; | tar -xz&lt;br&gt;
sudo mv procscope /usr/local/bin/&lt;/p&gt;

&lt;p&gt;Star it on GitHub: github.com/Mutasem-mk4/procscope&lt;/p&gt;

&lt;p&gt;If you are an incident responder or malware reverse engineer tired of deploying massive agents just to trace a single shell script — this tool is for you.&lt;/p&gt;

&lt;p&gt;Once you’ve pasted that, click that blue &lt;strong&gt;Publish&lt;/strong&gt; button at the bottom left. 🚀&lt;/p&gt;

&lt;p&gt;Then, hit me with that &lt;strong&gt;Playtika session token&lt;/strong&gt; so we can start the BOLA hunt!&lt;/p&gt;

</description>
      <category>security</category>
      <category>go</category>
      <category>linux</category>
    </item>
    <item>
      <title>Building a Zero-Overhead Linux Runtime Investigator with eBPF and Go</title>
      <dc:creator>Mutasem Kharma</dc:creator>
      <pubDate>Fri, 17 Apr 2026 12:06:35 +0000</pubDate>
      <link>https://dev.to/mutasem_mk4/building-a-zero-overhead-linux-runtime-investigator-with-ebpf-and-go-5efl</link>
      <guid>https://dev.to/mutasem_mk4/building-a-zero-overhead-linux-runtime-investigator-with-ebpf-and-go-5efl</guid>
      <description>&lt;p&gt;When it comes to Linux observability and security, traditional tools like top, ps, and standard audit daemons have a fundamental flaw: they lie. Or more accurately, they only tell you what the system wants you to see. Advanced rootkits, fleeting container processes, and malicious scripts can easily evade user-space monitoring.&lt;/p&gt;

&lt;p&gt;The solution? We have to go deeper. We have to go to the Kernel itself.&lt;/p&gt;

&lt;p&gt;In this post, I'll walk you through why I built Procscope—a blazing-fast, process-scoped runtime investigator written in Go and powered by the absolute superpower of modern Linux: eBPF.&lt;/p&gt;

&lt;p&gt;The Problem with User-Space Observability&lt;br&gt;
Standard monitoring tools periodically poll the /proc filesystem to see what's running. This introduces two massive problems:&lt;/p&gt;

&lt;p&gt;Performance Overhead: Polling wastes CPU cycles.&lt;br&gt;
Blind Spots: If a malicious script starts, executes its payload, and dies between your polling intervals, you will never even know it happened.&lt;br&gt;
To solve this, modern security agents use eBPF (Extended Berkeley Packet Filter).&lt;/p&gt;

&lt;p&gt;Enter eBPF: The Kernel's Superpower&lt;br&gt;
eBPF allows us to run sandboxed programs directly inside the Linux kernel without changing kernel source code or loading unstable kernel modules. It is event-driven. Instead of asking the kernel "what's happening?" every second, we attach scripts to specific kernel events (like a file being opened or a network connection being made). When the event happens, our script fires instantly.&lt;/p&gt;

&lt;p&gt;It is the technology powering the next generation of cloud-native tools like Cilium, Tracee, Falco, and now, Procscope.&lt;/p&gt;

&lt;p&gt;How Procscope Works&lt;br&gt;
I wanted to build an open-source tool that DevOps and Platform Engineers could drop onto a Linux box to instantly trace application behavior with near-zero overhead.&lt;/p&gt;

&lt;p&gt;Procscope intercepts syscalls at the lowest possible level and bridges them up to a beautifully structured Go user-space application. Here is the architecture:&lt;/p&gt;

&lt;p&gt;eBPF C Code: Tiny, highly optimized C programs attach to tracepoints (like sys_enter_execve).&lt;br&gt;
Ring Buffers: When an event fires, the C program pushes the kernel data (Process ID, Comm name, arguments) into a high-performance eBPF Ring Buffer.&lt;br&gt;
Go User-Space: The main application, written in Golang using the excellent Cilium eBPF library, consumes these ring buffers in real-time and formats them for the user.&lt;br&gt;
A Look at the Code&lt;br&gt;
Writing eBPF requires bridging two worlds. Here is a simplified look at how Procscope catches a process execution.&lt;/p&gt;

&lt;p&gt;First, the eBPF Kernel probe (written in C):&lt;/p&gt;

&lt;p&gt;c&lt;br&gt;
SEC("tracepoint/syscalls/sys_enter_execve")&lt;br&gt;
int tracepoint_&lt;em&gt;syscalls&lt;/em&gt;_sys_enter_execve(struct trace_event_raw_sys_enter* ctx) {&lt;br&gt;
    struct event_t event = {};&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Get the Process ID and Thread ID
u64 id = bpf_get_current_pid_tgid();
event.pid = id &amp;gt;&amp;gt; 32;
// Get the process command name (e.g. "bash", "curl")
bpf_get_current_comm(&amp;amp;event.comm, sizeof(event.comm));
// Submit the event to our Go application
bpf_ringbuf_submit(&amp;amp;events, &amp;amp;event, 0);
return 0;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
Then, the Go application seamlessly consumes it:&lt;/p&gt;

&lt;p&gt;go&lt;br&gt;
// Start reading from the eBPF ring buffer&lt;br&gt;
rd, err := ringbuf.NewReader(bpfObjs.Events)&lt;br&gt;
if err != nil {&lt;br&gt;
    log.Fatalf("failed to create ringbuf reader: %v", err)&lt;br&gt;
}&lt;br&gt;
for {&lt;br&gt;
    record, err := rd.Read()&lt;br&gt;
    if err != nil {&lt;br&gt;
        log.Printf("ringbuf read error: %v", err)&lt;br&gt;
        continue&lt;br&gt;
    }&lt;br&gt;
    // Unmarshal the byte array directly into our Go struct!&lt;br&gt;
    var event bpfEvent&lt;br&gt;
    binary.Read(bytes.NewBuffer(record.RawSample), binary.LittleEndian, &amp;amp;event)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fmt.Printf("🚨 New Process Detected | PID: %d | Comm: %s\n", event.Pid, string(event.Comm[:]))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
Because we use Go's generate tools, compiling this application automatically compiles the C code into eBPF bytecode and embeds it directly into the final Go binary. The result is a single, static binary that you can drop onto any modern Linux server. No dependencies needed.&lt;/p&gt;

&lt;p&gt;Why Build This?&lt;br&gt;
While heavyweight enterprise agents exist, I wanted to create an open-source, lightweight alternative that is easy to compile, easy to read, and laser-focused on process scoping. Right now, it's perfect for incident response, malware analysis on a honeypot, or simply figuring out why a rogue container keeps crashing.&lt;/p&gt;

&lt;p&gt;What's Next (and How You Can Help)&lt;br&gt;
The project is entirely open-source, and I'd love to invite the community to help shape it! We are currently working on adding Kubernetes Pod Context Resolution so that intercepted PIDs can be automatically mapped to their respective Pods and Namespaces.&lt;/p&gt;

&lt;p&gt;I've opened up several Good First Issues specifically designed for developers wanting to dip their toes into Go and eBPF observability.&lt;/p&gt;

&lt;p&gt;If this sounds interesting to you: 🌟 Check out Procscope on GitHub and drop a Star! 🌟&lt;/p&gt;

&lt;p&gt;Have you worked with eBPF before? Let me know your thoughts or questions about kernel tracing in the comments below!&lt;/p&gt;

</description>
      <category>go</category>
      <category>linux</category>
      <category>security</category>
    </item>
  </channel>
</rss>
