<?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: Kyubin Kim</title>
    <description>The latest articles on DEV Community by Kyubin Kim (@skwuwu).</description>
    <link>https://dev.to/skwuwu</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%2F3871226%2F7bc5ba75-ffdb-4713-a70c-61774d216fe6.png</url>
      <title>DEV Community: Kyubin Kim</title>
      <link>https://dev.to/skwuwu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/skwuwu"/>
    <language>en</language>
    <item>
      <title>Agent can bypass Proxy governance, What can we do?</title>
      <dc:creator>Kyubin Kim</dc:creator>
      <pubDate>Tue, 14 Apr 2026 16:57:05 +0000</pubDate>
      <link>https://dev.to/skwuwu/controlling-ai-agent-outbound-traffic-at-the-kernel-level14ms-overhead-2p8o</link>
      <guid>https://dev.to/skwuwu/controlling-ai-agent-outbound-traffic-at-the-kernel-level14ms-overhead-2p8o</guid>
      <description>&lt;p&gt;&lt;strong&gt;Source Code&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/skwuwu" rel="noopener noreferrer"&gt;
        skwuwu
      &lt;/a&gt; / &lt;a href="https://github.com/skwuwu/Analemma-GVM" rel="noopener noreferrer"&gt;
        Analemma-GVM
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A governance runtime for AI agents, built on Linux kernel security primitives.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Analemma-GVM&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;A lightweight secure runtime for autonomous AI agents.&lt;/strong&gt; Governs every outbound HTTP call, isolates the filesystem, and locks down syscalls — using a Rust proxy and Linux kernel primitives.&lt;/p&gt;
&lt;p&gt;I wanted to run multiple autonomous AI agents (such as OpenClaw) for my personal affairs. But every time I let agents do everything they want, there was always a little anxiety. What if it does something it shouldn't? What if it leaks personal information or deletes important data?&lt;/p&gt;
&lt;p&gt;Existing answers (such as NemoClaw, OPA+Envoy) required Docker, an embedded Kubernetes cluster, NVIDIA GPUs, or Envoy sidecars. I wanted a lightweight alternative that doesn't need infrastructure setup and strictly enforces what agents do.&lt;/p&gt;
&lt;p&gt;So I built GVM (Governance Virtual Machine) — a lightweight security runtime for AI agents. Two small Rust binaries (CLI + proxy, ~22MB total), no Kubernetes, no service mesh, no GPU. It sits between your agent and its actions…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/skwuwu/Analemma-GVM" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Continuing from the previous post, this time I will explain the monitoring and control methods for outbound traffic—one of the two central axes—divided into DNS and proxy.&lt;/p&gt;

&lt;p&gt;How do you stop an agent from making a malicious HTTP call? How do you prevent data exfiltration via DNS when cloud-managed services claim it's "out of scope"? Here is how I built a transparent interception layer for AI agents — adding just +14ms per HTTPS request.(measured on sandbox MITM path, EC2 t3.medium)&lt;/p&gt;




&lt;p&gt;1.&lt;strong&gt;The Core Problem&lt;/strong&gt;: &lt;br&gt;
Guardrails vs. Raw Sockets Most AI security focuses on the "Prompt" or "Tool definition." But if an agent has the autonomy to run code, it can bypass your Python decorators and call raw sockets directly.&lt;br&gt;
&lt;strong&gt;The Gap&lt;/strong&gt;: There is disconnect between what an agent should do (as defined in your prompt) and what it can do (as allowed by the OS).&lt;br&gt;
&lt;strong&gt;The Solution&lt;/strong&gt;: We must move governance from the Application Layer to the Runtime/Network Layer.&lt;/p&gt;




&lt;p&gt;2.&lt;strong&gt;DNS&lt;/strong&gt;: &lt;br&gt;
The First Gateway Before any HTTP call, there is a DNS query. In a GVM sandbox, the first step of the network governance.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;The resolv.conf Challenge *&lt;/em&gt;&lt;br&gt;
Inside sandbox, resolv.conf points to the host's virtual ethernet (veth) IP. I don't use the standard systemd-resolved stub (127.0.0.53) because it binds only to the loopback interface, making it unreachable from the sandbox namespace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transparent Redirection&lt;/strong&gt; &lt;br&gt;
Using iptables PREROUTING rules on the host, I intercept DNS traffic via DNAT, forwarding it to GVM's upstream resolver.&lt;/p&gt;

&lt;p&gt;-Note on DNS Tunneling: While GVM focuses on HTTP governance, I recognize DNS exfiltration is a threat. GVM logs query frequencies to provide visibility, but I delegate heavy DNS filtering (like Route 53 DNS Firewall) to the infrastructure layer to keep the runtime lightweight.&lt;/p&gt;




&lt;p&gt;3.&lt;strong&gt;Proxy&lt;/strong&gt;: &lt;br&gt;
Forcing the Traffic In GVM, I offer two modes of enforcement:&lt;/p&gt;

&lt;p&gt;Cooperative Mode: Injects HTTP_PROXY env vars. Simple, but "polite"—an agent can choose to ignore it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sandbox Mode&lt;/strong&gt;: kernel-level isolation. isolating the agent in a dedicated Network Namespace.&lt;/p&gt;

&lt;p&gt;-iptables OUTPUT Chain: It drops everything except traffic destined for Proxy (TCP) and DNS (UDP).&lt;br&gt;
-IPv6 Lockdown: GVM completely disable IPv6 to prevent "happy eyeballs" algorithms from bypassing IPv4-only firewall rules.&lt;br&gt;
-Result: No matter what library the agent uses—requests, httpx, or raw curl— all outbound traffic is routed through the proxy.&lt;/p&gt;




&lt;p&gt;4.&lt;strong&gt;MITM TLS Inspection&lt;/strong&gt;: &lt;br&gt;
Peeking Inside the Tunnel A standard CONNECT tunnel only lets you see the destination domain. To enforce granular policies (paths, methods, bodies), GVM must perform Man-in-the-Middle (MITM) inspection.&lt;/p&gt;

&lt;p&gt;Ephemeral CA &amp;amp; Just-in-Time Certs &lt;br&gt;
GVM generate an ephemeral CA and inject it into the sandbox's trust store.&lt;/p&gt;

&lt;p&gt;-Intercept: The agent initiates a TLS handshake.&lt;br&gt;
-Impersonate: GVM extracts the SNI, generates a per-domain ECDSA P-256 certificate on the fly, and terminates the TLS.&lt;br&gt;
-Inspect: The traffic is now plaintext. GVM apply SRR (Semantic Request Router) policies.&lt;br&gt;
-Relay: GVM establishes a new TLS connection to the actual upstream server.&lt;/p&gt;

&lt;p&gt;-Optimization: GVM force ALPN to HTTP/1.1 to simplify parsing and avoid the overhead of complex HTTP/2 frame inspection.&lt;/p&gt;




&lt;p&gt;5.&lt;strong&gt;SRR: Programmable Traffic Governance&lt;/strong&gt; &lt;br&gt;
Once the traffic is decrypted, Semantic Request Router (SRR) engine takes over. Using a TOML-based rule system, GVM define deterministic boundaries:&lt;/p&gt;

&lt;p&gt;example:&lt;br&gt;
[[rules]]&lt;br&gt;
method = "POST"&lt;br&gt;
pattern = "api.telegram.org"&lt;br&gt;
path_regex = "^/bot[^/]+/sendMessage$"&lt;br&gt;
decision = { type = "Delay", milliseconds = 500 }&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why SRR is different&lt;/strong&gt;:&lt;br&gt;
Payload Inspection: GVM can block specific GraphQL mutations or gRPC calls by inspecting the body fields.&lt;br&gt;
Default-to-Caution: If no rule matches, GVM applies a "Caution" penalty (a 300ms delay) for user to recognize.&lt;br&gt;
It doesn't trust Agents: not verifying intent, but the actual request/behavior&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;: &lt;br&gt;
The Multi-Layer DefenseLayerTechnologyPrevents&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Prevents&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;L0 (DNS)&lt;/td&gt;
&lt;td&gt;DNAT / Query logging&lt;/td&gt;
&lt;td&gt;Domain-based exfiltration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L1 (TCP)&lt;/td&gt;
&lt;td&gt;iptables OUTPUT&lt;/td&gt;
&lt;td&gt;Proxy bypass, non-standard port leakage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L1 (TLS)&lt;/td&gt;
&lt;td&gt;Ephemeral CA MITM&lt;/td&gt;
&lt;td&gt;Hidden malicious payloads in HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L2 (App)&lt;/td&gt;
&lt;td&gt;SRR Engine&lt;/td&gt;
&lt;td&gt;Unauthorized API calls, Data theft&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What’s Next?&lt;/strong&gt;&lt;br&gt;
Governing the network is only half the system. What if the agent tries to read your /etc/shadow or escape the container via a kernel exploit? In the next post, I will explore lower level: How I use Namespaces, Seccomp-bpf, and OverlayFS to create a secure filesystem and process isolation.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>agents</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I built a secure runtime for AI agents with Rust and Linux kernel features</title>
      <dc:creator>Kyubin Kim</dc:creator>
      <pubDate>Fri, 10 Apr 2026 14:01:13 +0000</pubDate>
      <link>https://dev.to/skwuwu/gvm-light-weight-governance-runtime-for-ai-agentsrust-proxy-linux-kernel-featuresseccomp-bpf-2bml</link>
      <guid>https://dev.to/skwuwu/gvm-light-weight-governance-runtime-for-ai-agentsrust-proxy-linux-kernel-featuresseccomp-bpf-2bml</guid>
      <description>&lt;p&gt;&lt;strong&gt;Source Code&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/skwuwu" rel="noopener noreferrer"&gt;
        skwuwu
      &lt;/a&gt; / &lt;a href="https://github.com/skwuwu/Analemma-GVM" rel="noopener noreferrer"&gt;
        Analemma-GVM
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A governance runtime for AI agents, built on Linux kernel security primitives.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Analemma-GVM&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;A lightweight secure runtime for autonomous AI agents.&lt;/strong&gt; Governs every outbound HTTP call, isolates the filesystem, and locks down syscalls — using a Rust proxy and Linux kernel primitives.&lt;/p&gt;
&lt;p&gt;I wanted to run multiple autonomous AI agents (such as OpenClaw) for my personal affairs. But every time I let agents do everything they want, there was always a little anxiety. What if it does something it shouldn't? What if it leaks personal information or deletes important data?&lt;/p&gt;
&lt;p&gt;Existing answers (such as NemoClaw, OPA+Envoy) required Docker, an embedded Kubernetes cluster, NVIDIA GPUs, or Envoy sidecars. I wanted a lightweight alternative that doesn't need infrastructure setup and strictly enforces what agents do.&lt;/p&gt;
&lt;p&gt;So I built GVM (Governance Virtual Machine) — a lightweight security runtime for AI agents. Two small Rust binaries (CLI + proxy, ~22MB total), no Kubernetes, no service mesh, no GPU. It sits between your agent and its actions…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/skwuwu/Analemma-GVM" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpr3yf62ip8os8bfl474n.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpr3yf62ip8os8bfl474n.gif" alt="Terminal demo of GVM showing the workflow: watching agent behavior, auto-generating rules with suggest command, and enforcing security policies in sandbox mode" width="688" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I built this?:&lt;/strong&gt;&lt;br&gt;
I really wanted to use multiple autonomous agents (such as OpenClaw) 24/7 to automate my workflows, but letting them to do everything they require made me anxious. For example, they can read my .env files and expose it to internet by misleading context, call external api incorrectly that making financial costs, and delete my important data accidentally. Because they are not essentially deterministic the probability of such events occurring isn't zero. In fact, a lot of security accident cases are found in reality.&lt;/p&gt;

&lt;p&gt;For sure, i considered about using existing security options such as NVDIA's NemoClaw, docker/VM isolation for agents, but i didn't want to build and maintain kubernetes or virtual machine infrastructure. For solo dev or small teams, this solutions are so heavy. Also, they don't enforce what agent actually do.&lt;/p&gt;

&lt;p&gt;So i decided to build this project(GVM), light weight governance runtime with low dependencies for AI agent made with Rust proxy combining Linux kernel features(Namespace, Overlayfs, seccomp-bpf). Rust proxy governs agent's actual external I/O, and Linux kernel stacks enforce agent to use proxy, and what syscalls they can use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it actually can do:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;-Proxy catches every outbound HTTP/HTTPS call and checks if it matches with your ruleset. unknown calls are delayed or denied.&lt;/p&gt;

&lt;p&gt;-On Linux environment, kernel level isolation guarantees that the proxy isn't bypassed by agent.&lt;/p&gt;

&lt;p&gt;-Agents write to an overlay file system, so they can't directly change real data.&lt;/p&gt;

&lt;p&gt;-GVM is just binary, and it does not extract your data from your server like saas services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works, briefly:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agent → GVM Proxy (rule check) → External API&lt;br&gt;
↓ denied/delayed&lt;br&gt;
Merkle-chained audit log&lt;/p&gt;

&lt;p&gt;On Linux, kernel-level network isolation forces all traffic through&lt;br&gt;
the proxy — the agent has no userspace path around it. On macOS/Windows, cooperative mode works via HTTP_PROXY injection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typical workflow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;gvm run --sandbox --watch&lt;/code&gt; — see what your agent calls&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gvm suggest&lt;/code&gt; — generate rules from the session&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gvm run --sandbox&lt;/code&gt; — enforce with kernel isolation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;About more technical information&lt;/strong&gt;: &lt;br&gt;
It will be covered in next posts. explaining all about my project can make this post too long, so there will be another deep dive posts. If you are interested before my next posts are written, please read github link's docs!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Welcome for Feedbacks!&lt;/strong&gt;&lt;br&gt;
It's alpha release stage, so it's not hardened yet. It has only been tested on the EC2 and OpenClaw combination now. I'd be glad to get architecture and technical feedbacks.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rust</category>
      <category>showdev</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
