Email me

Dev · · 6 min read · Matt Busel

By , who built the apps, crates and game he writes about · every number links to its source and every dataset is downloadable (methods) · corrections · featured in Kirino, gamebiz, This Week in Rust, New Mobile Life, By-Press

Filed under Rust

Docker is weird, and Rust won't fix it: youki had 3 high escapes

Docker is weird, and Rust won't fix it: youki had 3 high escapes
On this page · 9 sections
  1. Key numbers
  2. The post that set HN off: containers are 5 kernel features in a trenchcoat
  3. Receipt one: Docker's runtime smuggles C to dodge Go
  4. Receipt two: the Rust rewrite shipped the same escapes
  5. Receipt three: C is not the villain either
  6. Follow the money: who wins from "Docker is weird"
  7. Where this goes next
  8. What this means for you
  9. Sources

Short answer: Docker is weird because its runtime, runc, is a Go program that needs 1,232 lines of C to run before Go even wakes up. The popular fix people reach for is "rewrite it in Rust", but youki, the Rust runtime, has 4 security advisories on record and 3 of them are high severity: the same count of high-severity escapes runc has shipped since January 2025.

TL;DR: We pulled every GitHub security advisory for the three main OCI container runtimes on Oct 26 2026. Since Jan 1 2025, runc (Go) logged 4 advisories with 3 high, crun (C) logged 6 with 2 high, and youki (Rust) logged 4 with 3 high. Two of youki's high-severity bugs landed on Nov 5 2025, the same day runc disclosed its masked-path and procfs-write escapes, because the bug was in the design both runtimes copied, not in the memory. If you run containers, the language of your runtime matters far less than how fast you patch it.

Key numbers

WhatNumberSource, checked Oct 26 2026
youki (Rust) advisories, all time / high4 / 3GitHub advisories
runc (Go) advisories since Jan 2025 / high4 / 3GitHub advisories
crun (C) advisories since Jan 2025 / high6 / 2GitHub advisories
Lines of C in runc's nsexec.c1,232runc source
Docker Hub pulls of the ubuntu image10.1 billionDocker Hub API
GitHub stars: moby vs youki72,211 vs 7,654GitHub API
Animated bars: high-severity security advisories since Jan 2025, runc (Go) 3, crun (C) 2, youki (Rust) 3
High-severity advisories per container runtime since Jan 2025. GitHub security advisories, pulled Oct 26 2026

The post that set HN off: containers are 5 kernel features in a trenchcoat

On Oct 22 the blog Code and Cake posted "Docker is weird", a write-up from someone building their own container runtime for fun. It hit 876 points and 366 comments on Hacker News.

The core points land hard. Containers are not a thing the kernel knows about; they are a normal process wrapped in namespaces (what it can see), cgroups (how much it can use) and a pile of network plumbing. An image is a folder that Docker drops somewhere and then chroots into.

And the spiciest line: Go is "kind of a terrible language for a container runtime". Go starts many threads on its own, and a lot of the Linux calls a runtime needs only work from a single thread. Go also has no real fork.

Receipt one: Docker's runtime smuggles C to dodge Go

The author is right, and the source proves it. runc, the runtime under Docker, containerd and Kubernetes, ships nsexec.c: 1,232 lines of C (we counted the file on Oct 26) that run before the Go runtime starts, just to do the namespace setup Go can't do safely.

Then runc re-executes itself through /proc/self/exe to fake a fork. That is the "weird" in Docker is weird: the most-pulled software stack on earth (the ubuntu image alone has 10.1 billion Docker Hub pulls, alpine 12.4 billion) runs on a Go program wearing a C mask.

Stat card: 1,232 lines of C inside runc, the Go runtime under Docker
runc's nsexec.c line count, counted Oct 26 2026 from the runc main branch

Receipt two: the Rust rewrite shipped the same escapes

So the obvious r/rust answer is youki, a container runtime written in Rust with no Go runtime to fight. It is real, it is maintained (106 commits in the last 90 days), and its libcontainer crate has 137,368 downloads on crates.io.

Here is the part the rewrite-it-in-Rust crowd skips. youki has 4 security advisories on GitHub. 3 are rated high. That is 75% of its record, and it matches runc's 3 high-severity advisories since January 2025 one for one.

Bar chart: high-severity advisories since Jan 2025, runc 3, crun 2, youki 3
The Rust runtime ties the Go runtime on high-severity escapes. GitHub advisories, Oct 26 2026

Look at the dates. On Nov 5 2025 runc published container escape via "masked path" abuse due to mount race conditions and an escape via arbitrary write gadgets and procfs write redirects. The same day, youki published advisories with word-for-word the same titles (GHSA-vf95-55w6-qmrf and GHSA-4g74-7cff-xcv8).

No buffer overflow, no use-after-free. These are races and symlink tricks on /proc, /dev and mount points. Rust's borrow checker protects memory. It does not know what a mount namespace is, and it can't stop a malicious image from swapping a path between your check and your use (a "TOCTOU" race: time of check vs time of use).

Receipt three: C is not the villain either

crun, Red Hat's runtime written in plain C, logged 6 advisories since 2025, the most of the three, but only 2 high. Several are the same family: crun following a /dev or /dev/console symlink planted by the container image.

Bar chart: all security advisories since Jan 2025, runc 4, crun 6, youki 4
Every severity, per runtime. GitHub advisories, Oct 26 2026

All three runtimes, in three languages, keep tripping over the same Linux surface. Our read: the bug class lives in the kernel API, not the compiler. Anyone selling a language as the cure for container escapes is selling vibes, and that includes our own Rust lane.

Follow the money: who wins from "Docker is weird"

Docker Inc wins from the weirdness staying hidden. Docker Desktop is the paid product, and its whole pitch is that you never have to see runc, cgroups or /proc/self/exe. The weirder the guts, the more a nice wrapper is worth.

Podman, backed by Red Hat, wins from the rootless story: 33,122 GitHub stars, almost half of moby's 72,211, sold on "no root daemon". The Code and Cake post nails the catch: rootless networking has to rebuild the network stack in userspace, so you trade one kind of weird for another.

GitHub stars: moby 72,211, podman 33,122, containerd 21,443, gVisor 19,779, runc 13,508, youki 7,654, crun 4,183
GitHub stars across the container stack. GitHub API, Oct 26 2026

The loser is anyone who reads "written in Rust" on a README and stops patching. youki has 7,654 stars and 3 high-severity escapes; it is a great project, and it is not a security exemption. No cap: the scariest container is the one on a runtime version from last year.

Where this goes next

Our bet: the next big runtime win is not a new language, it is fewer moving parts. gVisor (19,779 stars) and Kata Containers (9,020 stars, mostly Rust) put a real wall between the container and the host kernel instead of trusting namespaces. Expect more teams running untrusted code, especially AI agents running generated code, to pay that speed tax.

And expect more people to do what the Code and Cake author did: build a toy runtime to see the weirdness for themselves. Honestly, that's the best container security course on the internet, and it's free.

What this means for you

  • Check your runtime version today: runc --version, crun --version or youki --version, and compare it against the advisory pages linked below. The Nov 2025 fixes are the ones that matter.
  • Don't trust a language badge. Rust, Go and C runtimes all shipped escapes since 2025; patch speed is the real defense.
  • Running untrusted or AI-generated code? Put it behind gVisor or Kata, not just namespaces.
  • Want the numbers? Download our CSV of every advisory for all three runtimes (button above) and see our Rust hub, crate data and more in Rust articles and the news desk.

Stuck on a Rust build, a container that won't start, or an AI API error? Our paid fixes start at $49: fixed within 24 hours or a full refund.

Sources

First published here on tensorust.com on Oct 26, 2026. Related: .

Up next

More on Rustcrates.io download count: 80% of ours arrived with a new versionWhat the crates.io download count really measures: 69 Rust crates, 90 days of daily data, 80% within a day of a publish, 0 outside dependents.Read it next →

Cite this

Free to cite and reuse under CC BY 4.0 with a link back. How it was collected: methods. Spotted an error? Corrections.

Did this answer your question?

Get the next one by email.

What my AI agents tried this week, with the real numbers: what worked, what flopped, what made money. One email when there is something worth reading.

No spam, never sold. Every email has a one-click unsubscribe.

What are people saying about this? Read and post on The Floor →

More: the author, related reading, share this, a free game

Try it yourself · Rust dev?

Check a crate before you depend on it

Release health, reverse deps, real downloads and the alternatives for 1000 crates.

In The Manual: on this topic

Explainers answer one question, short answer first. Guides walk you through it step by step.

Open The Manual →

Read next

All articles →

1M+ X impressions in 4 days, run by AI agents · 8,000+ crates.io downloads across our 70 Rust crates, all time · 529 GitHub stars · 8 iPhone apps live on the App Store · O'BLOCK out now, free on Steam

Built by Matthew Busel · code on github.com/Mattbusel · numbers as of Oct 25, 2026, click any to check

Popular in the shop

All 124 tools →

Browse: Bundles and kitsHome, family and schoolMoney and businessAI toolsSports and fitnessMaking and hobbiesFood and drinkIndie dev and launchTrading and quant

Free: Landing page teardown iPhone app cost calculator LLM API cost calculator Paid online: $49 Launch Check App builds Articles FAQ