<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Runc on Ethan-ZYF</title><link>https://ethanzyf.com/tags/runc/</link><description>Recent content in Runc on Ethan-ZYF</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 20 May 2026 00:00:00 -0700</lastBuildDate><atom:link href="https://ethanzyf.com/tags/runc/index.xml" rel="self" type="application/rss+xml"/><item><title>Week2 Day 3: K8s security — seccomp</title><link>https://ethanzyf.com/blog/week2-day3-seccomp/</link><pubDate>Wed, 20 May 2026 00:00:00 -0700</pubDate><guid>https://ethanzyf.com/blog/week2-day3-seccomp/</guid><description>&lt;p&gt;Where Week 1 and Week 2 meet: K8s seccomp is the &lt;em&gt;same&lt;/em&gt; kernel seccomp from Week 1, except runc installs the BPF filter for you instead of your application. This post traces the full kubelet → containerd → runc chain (and what runc actually does — namespaces, cgroups, NNP, caps, seccomp, AppArmor, then exec), the three profile types (Unconfined / RuntimeDefault / Localhost), why the profile JSON is just the declarative form of the cBPF you&amp;rsquo;d hand-write, why &lt;code&gt;SCMP_ACT_ERRNO&lt;/code&gt; lets the process survive while &lt;code&gt;mkdir&lt;/code&gt; returns EPERM, and the crucial limitation: seccomp blocks &lt;em&gt;syscalls&lt;/em&gt;, not &lt;em&gt;intent&lt;/em&gt; — block &lt;code&gt;mkdir&lt;/code&gt; and &lt;code&gt;touch&lt;/code&gt; (which uses &lt;code&gt;openat&lt;/code&gt;) still creates files. Plus &lt;code&gt;/proc/&amp;lt;pid&amp;gt;/status&lt;/code&gt; as the ground-truth proof a filter is loaded.&lt;/p&gt;</description></item></channel></rss>