HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
opencontainers
runc
Go2015–2026
opencontainers / runc

runc

CLI tool for spawning and running containers according to the OCI specification

42Distinct people
57Mentions
0Explicit recommenders
13.6KGitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

CLI tool for spawning and running containers according to the OCI specification

GitHub

Where it is used

No documented product use was verified in the last source check.

What people are saying

No recommendation phrase was found in the indexed comments.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

Mentioned in the same Hacker News threads. That is not proof they are substitutes.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 1:49:46 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year57 dated mentions

Observed mentions: 2015-06-22 18:01:36 UTC to 2026-10-23 10:01:24 UTC.

02468102015-01-01 00:00:00 UTC to 2016-01-01 00:00:00 UTC (exclusive): 9 mentions; 0 submissions, 9 comments20152016-01-01 00:00:00 UTC to 2017-01-01 00:00:00 UTC (exclusive): 7 mentions; 0 submissions, 7 comments2017-01-01 00:00:00 UTC to 2018-01-01 00:00:00 UTC (exclusive): 6 mentions; 1 submissions, 5 comments2018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments2019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 4 mentions; 0 submissions, 4 comments2020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments20202021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 6 mentions; 0 submissions, 6 comments2022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 5 mentions; 2 submissions, 3 comments2025-01-01 00:00:00 UTC to 2026-01-01 00:00:00 UTC (exclusive): 7 mentions; 2 submissions, 5 comments2026-01-01 00:00:00 UTC to 2027-01-01 00:00:00 UTC (exclusive): 4 mentions; 0 submissions, 4 comments. Incomplete calendar period.2026*

* An incomplete calendar period is marked with an outlined bar. Its count is not directly comparable with a full period.

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20152015-01-01 00:00:00 UTC2016-01-01 00:00:00 UTC909
20162016-01-01 00:00:00 UTC2017-01-01 00:00:00 UTC707
20172017-01-01 00:00:00 UTC2018-01-01 00:00:00 UTC615
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC303
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC404
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC303
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC606
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC000
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC303
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC523
20252025-01-01 00:00:00 UTC2026-01-01 00:00:00 UTC725
2026 (partial)2026-01-01 00:00:00 UTC2027-01-01 00:00:00 UTC404

From the project README

An excerpt from the repository, fetched Nov 13, 2026.

Read the project’s introduction
runc Introduction runc is a CLI tool for spawning and running containers on Linux according to the OCI specification. Releases You can find official releases of runc on the release page. All releases are signed by one of the keys listed in the runc.keyring file in the root of this repository. Security The reporting process and disclosure communications are outlined here. Security Audit A third party security audit was performed by Cure53, you can see the full report here. Building runc only supports Linux. See the header of go.mod for the minimally required Go version. Pre-Requisites Utilities and Libraries In addition to Go, building runc requires multiple utilities and libraries to be installed on your system. On Ubuntu/Debian, you can install the required dependencies with: apt update && apt install -y make gcc linux-libc-dev libseccomp-dev pkg-config git On CentOS/Fedora, you can install the required dependencies with: yum install -y make gcc kernel-headers libseccomp-devel pkg-config git On Alpine Linux, you can install the required dependencies with: apk --update add bash make gcc libseccomp-dev musl-dev linux-headers git The following dependencies are optional: libseccomp - only required if you enable seccomp support; to disable, see Build Tags. libpathrs - only required if you enable libpathrs support; to disable, see Build Tags. For notes on installing libpathrs, see the next section. libpathrs libpathrs is a Rust library runc can optionally use for path safety. As mentioned in the build tag section, its use is controlled with the libpathrs build tag. runc currently requires at least libpathrs 0.2.5 in order to function properly. At time of writing, very few distributions have libpathrs packages and so it is usually necessary to build and install it locally. For detailed installation instructions, see the upstream documentation, but for development builds the following instructions should be sufficient: libpathrs requires Rust 1.63+ (which is available on almost any distribution, including Debian oldstable and enterprise distributions like RHEL or SLES). Assuming you already have cargo installed (as well as other libpathrs dependencies like clang and lld), the following steps are all that are really necessary to install libpathrs: LIBPATHRS_VERSION=0.2.5 curl -o - -sSL https://github.com/cyphar/libpathrs/releases/download/v${LIBPATHRS_VERSION}/libpathrs-${LIBPATHRS_VERSION}.tar.xz | tar xvfJ - cd libpathrs-${LIBPATHRS_VERSION}/ make release sudo ./install.sh --prefix=/usr/local sudo ldconfig As part of our CI, we make use of a custom installation script for libpathrs which may be useful as a reference for folks with more complicated needs. With script/build-libpathrs.sh the installation of libpathrs becomes as simple as: sudo ./script/build-libpathrs.sh "$LIBPATHRS_VERSION" /usr/local sudo ldconfig However, please note that this installation script is completely unsupported and is not really intended for general use (it includes some workarounds for issues in our CI which will no longer be necessary once libpathrs has distribution packages we can use). Build # create a 'github.com/opencontainers' in your GOPATH/src cd github.com/opencontainers git clone https://github.com/opencontainers/runc cd runc make sudo make install You can also use go get to install to your GOPATH, assuming that you have a github.com parent folder already created under src: go get github.com/opencontainers/runc cd $GOPATH/src/github.com/opencontainers/runc make sudo make install runc will be installed to /usr/local/sbin/runc on your system. Version string customization You can see the runc version by running runc --version. You can append a custom string to the version using the EXTRA_VERSION make variable when building, e.g.: make EXTRA_VERSION="+build-1" Bear in mind to include some separator for readability. Build Tags runc supports optional build tags for compiling support of various features, with some of them enabled by default in the top-level Makefile. The following build tags are currently recognized: Build Tag Feature Set by Default Dependencies seccomp Syscall filtering using libseccomp. yes libseccomp libpathrs Use libpathrs for path safety. yes libpathrs runc_nocriu Disables runc checkpoint/restore. no criu To add or remove build tags from the default set, use the RUNC_BUILDTAGS make or shell variable. Tags prefixed with - are removed from the default set; others are added. For example: # Add runc_nocriu and remove seccomp tag. make RUNC_BUILDTAGS="runc_nocriu -seccomp" The following build tags were used earlier, but are now obsoleted: runc_nodmz (since runc v1.2.1 runc dmz binary is dropped) nokmem (since runc v1.0.0-rc94 kernel memory settings are ignored) apparmor (since runc v1.0.0-rc93 the feature is always enabled) selinux (since runc v1.0.0-rc93 the feature is always enabled) Running the test suite runc currently supports running its test suite via Docker. To run the suite just type make test. make test There are additional make targets for running the tests outside of a container but this is not recommended as the tests are written with the expectation that they can write and remove anywhere. You can run a specific test case by setting the TESTFLAGS variable. # make test TESTFLAGS="-run=SomeTestFunction" You can run a specific integration test by setting the TESTPATH variable. # make test TESTPATH="/checkpoint.bats" You can run a specific rootless integration test by setting the ROOTLESS_TESTPATH variable. # make test ROOTLESS_TESTPATH="/checkpoint.bats" You can run a test using your container engine's flags by setting CONTAINER_ENGINE_BUILD_FLAGS and CONTAINER_ENGINE_RUN_FLAGS variables. # make test CONTAINER_ENGINE_BUILD_FLAGS="--build-arg http_proxy=http://yourproxy/" CONTAINER_ENGINE_RUN_FLAGS="-e http_proxy=http://yourproxy/" Go Dependencies Management runc uses Go Modules for dependencies management. Please refer to Go Modules for how to add or update new
Read the full README on GitHub

What Hacker News says

57 sources
Not to contradict anything you wrote, but if you look at the language stats for https://github.com/opencontainers/runc, it has 68.5% Go, 27.1% Shell and 3.5% C, so it's fair to say that it was "written in Go", even though the most important part was C - same as e.g. Doom was written in C, even though it used assembly for optimizing the performance-sensitive parts.
In Docker is weird
The repo you linked works by replacing files that are being used by other privileged containers on the same system. That works for the Kubernetes case (I'm a little surprised they don't use static binaries for their own privileged containers, seems a little dangerous to share any kind of data with untrusted tenants even if it's read-only) but not standalone containers. However, there is a much an easier way of doing a breakout -- you can corrupt the host runc binary in a way analogous to CVE-2019-5736. The next time a container is spawned, the host runc binary will get run as as root and that's that. Ironically, the first version of the protection against this attack I wrote also protected against page cache poisoning (by making a temporary copy of the runc binary during container setup in a sealed memfd and re-execing that) but the runti
Read the rest
me cost of copying a 10MB binary at container startup was seen as too expensive by some users[1] so we ended up with a setup that shares the same page cache. I also distinctly remember arguing at the time that something like Dirty Cow could always happen in the future, and the memfd approach was better for that reason -- maybe I should've stuck to my guns more... :/ In practice the solution for containers is to update your seccomp policy to block the vulnerable syscall. [1]: https://github.com/opencontainers/runc/issues/1980
In Dirty Frag: Universal Linux LPE
It looks to me like what is called a "container escape" in this context isn't necessarily as bad as it seems. For example, in the advisory for CVE-2025-31133 affecting runc[1]: > Container Escape: ...Thus, the attacker can simply trigger a coredump and gain complete root privileges over the host. Sounds bad. But... > this flaw effectively allows any attacker that can spawn containers (with some degree of control over what kinds of containers are being spawned) to achieve the above goals. The attacker needs already to have the capability to spawn containers! This isn't a case of "RCE within the container" -> "RCE outside the container", which is what I would think prima facie reading "container escape". I have always thought that running an untrusted image within an unprivileged container was a safe thing to do and I still believe so. [1]
Read the rest
In Don't trust AI agents
Here's the set up I use on Linux: The idea is to completely sandbox the program, and allow only access to specific bind mounted folders. But we also want to have to the frills of using GUI programs, audio, and network access. runc (https://github.com/opencontainers/runc) allows us to do exactly this. My config sets up a container with folders bind mounted from the host. The only difficult part is setting up a transparent network proxy so that all the programs that need internet just work. Container has a process namespace, network namespace, etc and has no access to host except through the bind mounted folders. Network is provided via a domain socket inside a bind mounted folder. GUI programs work by passing through a Wayland socket in a folder and setting environmental variables. The set up looks like this * config.json - runc config
Read the rest
* run.sh - runs runc and the proxy server * rootfs/ - runc rootfs (created by exporting a docker container) `mkdir rootfs && docker export $(docker create archlinux:multilib-devel) | tar -C rootfs -xvf -` * net/ - folder that is bind mounted into the container for networking Inside the container (inside rootfs/root): * net-conf.sh - transparent proxy setup * nft.conf - transparent proxy nft config * start.sh - run as a user account Clone-able repo with the files: https://github.com/dogestreet/dev-container
In Using proxies to hide secrets from Claude Code
> A quick search makes it seem like CRIs are trying to define their own custom Landlock interface. Are you referring to [0, 1]? > But if the CRI just blocks the syscalls by default Does it? Where are you getting this from? > I might be missing the whole idea here, but I really don't see why we need some custom layer in the middle instead of having container runtimes let the security syscalls through? Because in the latter case you have to trust the application it will actually do the appropriate locking? [0]: https://github.com/opencontainers/runc/issues/2859 [1]: https://github.com/opencontainers/runtime-spec/issues/1110
In Landlock-Ing Linux
This is a good explanation of how standard filesystem sandboxing works, but it's hopefully not trying to be convincing to security engineers. > At Greptile, we run our agent process in a locked-down rootless podman container so that we have kernel guarantees that it sees only things it’s supposed to. This sounds like a runc container because they've not said otherwise. runc has a long history with filesystem exploits based on leaked file descriptors and `openat` without NO_FOLLOW. The agent ecosystem seems to have already settled on VMs or gVisor[2] being table-stakes. We use the latter. 1. https://github.com/opencontainers/runc/security/advisories/G... 2. https://gvisor.dev/docs/architecture_guide/security/
In Sandboxing AI agents at the kernel level
While multiple authors' signatures would be nice, a lot of these kinds of attacks would be solved if there was any signature verification being done of the commits, tags, or generated artefacts at all. People like to complain about distribution packaging being obtuse, but most distributions have rich support for verifying that package sources were signed by a key in a keyring that is maintained by the distribution. My (somewhat biased) view is that language package managers still do not provide the same set of features for validation that (for instance) rpmbuild does. The release process for runc has the following safeguards: * As the upstream maintainer of runc, our releases are all signed with one of a set of keys that are maintained in our repo[1]. Our tags are also signed by one of the same keys. In my case, my key is stored in a
Read the rest
Yubikey and so cannot easily be exfiltrated. * Our release scripts include a step which validate that all of the keys in that keyring file are valid (sub)keys registered to the GitHub account of a maintainer[2]. They also prompt the person doing the signing to check that the list looks reasonable before signing anything[3]. * Distributions such as openSUSE have a copy of the keyring file[4] and the build system will automatically reject the build if the source code archive is not signed. Our official binary releases are also signed and so can be validated in a similar manner. Maybe there are still gaps in this setup, and I would love to hear them. But I think this setup would have blocked this kind of attack at several stages. I personally don't like the idea of signing releases in CI -- if you really want to build your binaries in CI, that's fine, but you should always require a maintainer to personally sign the binaries at the end of the process. For language package managers that do not support such a workflow, trusted publishing is a less awful setup than having long-lived publishing keys that may be incorrectly scoped (as happened in this case) but it still allows someone who gains access to your GitHub account (such as by stealing your cookies) to publish updated versions of your package with very little resource. GitHub supports setting a mandatory timeout for trusted publishing but the attacker could easily disable that. If someone got access to my GitHub account, it would be a very bad day but distributions would not accept the new releases because their copy of our keyring would not include the attackers keys (even if they added them to my account). Disclaimer: I work at SUSE, though I will say that I would like for OBS to have nice support for validating checksums of artefacts like Arch and Gentoo do (you can /theoretically/ do it with OBS services or emulate it with forcelocal -- and most packages actually store the archive in OBS rather than pulling it at build time -- but it would be nice to do both). [1]: https://github.com/opencontainers/runc/blob/v1.4.0-rc.1/runc... [2]: https://github.com/opencontainers/runc/blob/v1.4.0-rc.1/scri... [3]: https://github.com/opencontainers/runc/blob/v1.4.0-rc.1/scri... [4]: https://build.opensuse.org/projects/openSUSE:Factory/package...
In Tinycolor supply chain attack post-mortem
I can't say I've seen the same, so I dug into it. There's a good list from RedHat[1] on CVEs SELinux mitigated. I went through them: - CVE-2016-9962 - Bypasses Apparmor [2], mitigated by SELinux - CVE-2022-0492 - Apparmor and Seccomp also protect against - CVE-2019-5736 - Mixed, blocked by the default SELinux policy in RHEL (not Fedora), not blocked by the default AppArmor policy[3] - CVE-2021-3156 - This one is not a good one for RedHat to put on the list. SELinux by default doesn't protect against it, Debian 10 at the time had a Linux security feature enabled (fs.protected_symlinks) that helped mitigate it, and additionally CVE-2021-23240 came out which had similar effects but only occurred on SELinux systems. - CVE-2019-9213 - Not mitigated by AppArmor, mitigated by SELinux - CVE-2019-13272 - Not mitigated by AppArmor, not mitigated by
Read the rest
default SELinux policy, but easy to mitigate by enabling boolean. I'd consider this a win for SELinux, but only just. While digging into this more, I came across this BlackHat talk[4] which really quantifies how SELinux improves security (though doesn't contrast it with AppArmor). I also came across a paper on usability of SELinux and AppArmor[5] which brings up an interesting point: If the tool is too complex, even if it's more powerful, more often than not it won't end up having better results. That's all to say, I think if you're willing to invest a lot of time into it (say you want to make security your niche in your development career), SELinux is still the best. But I can see why many may gravitate towards AppArmor so as to not make perfect the enemy of good. That said, I still wish Debian had a choice between the two, right now SELinux isn't really doable without a lot of work. [1]: https://access.redhat.com/solutions/7032454 [2]: https://github.com/opencontainers/runc/issues/2128 [3]: https://www.cloudfoundry.org/blog/cve-2019-5736/ [4]: https://www.youtube.com/watch?v=EkL1sDMXRVk [5]: https://researchportal.murdoch.edu.au/esploro/outputs/journa...
In The Insecurity of Debian
I can speak to this. Containers, and by extension k8s, break a well known security boundary that has existed for a very long time - whether you are using a real (hardware) server or a virtual machine on the cloud if you pop that instance/server generally speaking you only have access to that server. Yeh, you might find a db config with connection details if you landed on say a web app host but in general you still have to work to start popping the next N servers. That's not the case when you are running in k8s and the last container breakout was just announced ~1 month ago: https://github.com/opencontainers/runc/security/advisories/G... . At the end of the day it is simply not a security boundary. It can solve other problems but not security ones.
In Nanos – A Unikernel

Showing the 15 most recent of 57 sources. Enable JavaScript to search and browse every indexed mention.

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.