- CVE-2026-84042: prevent that rootful krun with passt can execute
payload from container without proper confinement. - CVE-2026-88264: do not follow symlinks when creating /dev/console.
A rootfs providing /dev/console as a symlink made crun create a root
owned file on the host at a path chosen by the container image, since
the devices are created before the pivot_root. - CVE-2026-88265: validate /dev/null before reopening the std streams.
A rootfs providing /dev/null as a symlink to a host file bind mounted
into the container made crun replace the pipe- or socketpair-based
std streams with a writable descriptor for that file, and chown it to
the container user. Refuse to continue unless /dev/null is the
character device 1:3, and only consider std streams that are
character devices themselves. - linux: skip OPEN_TREE_NAMESPACE when a bind source holds a pinned
namespace. A recursive clone of such a source picks one up, so the
bind mount cannot be attached from inside the namespace created by
OPEN_TREE_NAMESPACE, and by then there is no way to mount it at all. - krun: use absolute path for passt binary.
- krun: support TAP-backed networking.
- krun: start render server if required.
- linux: convert sysctl keys to /proc/sys paths as described in
sysctl.d(5), fixing sysctls for interface names containing dots
(e.g. VLAN interfaces such as "eth0.100"). - criu: fix --network-lock, which did not take the method argument.
- criu: block signals as soon as the container is restored, so that
a signal arriving before crun starts forwarding them is delivered to
the container init instead of killing crun. - criu: block signals across the vfork used for a detached restore, so
that a signal handler of a program embedding libcrun no longer runs
in the child and corrupts the state of the suspended caller. - build: add --enable-werror and --enable-sanitizers configure options.
- release: add crun.keyring with the release signing keys
- linux: apply recursive propagation flags recursively. A 1.29
regression dropped MS_REC when mount_setattr() is available, so an
"rslave" mount only had its top level mount converted and a mount
created by the container under it propagated back to the host,
clobbering the devpts of the host for a container bind mounting /dev. - linux: clear the flags which are not requested on a read-only
remount, so that a "bind,ro" mount of a nosuid,nodev,noexec source
only gets the requested flag, as it was before 1.27. - linux: honor options which only clear flags (e.g. "dev", "suid",
"exec", "rw") for bind mounts instead of silently keeping the flags
of the source. - linux: clear nosymfollow on remount unless it is requested.
- linux: set the atime flags the way mount(2) does, so that e.g. a
"bind,relatime" mount of a noatime source is no longer left with
noatime. - linux: fix idmapped bind mounts with a relative source.
- linux: do not crash on a mount without a type. This is reproducible
with podman by running a container with a CDI device in a pod that
has a user namespace, as the mounts in a CDI specification usually
have no type. - linux: do not crash on a mount without a source, or on a null entry
in maskedPaths or readonlyPaths; reject them with EINVAL. - libcrun: cope with a JSON null where the configuration expects a
string, instead of dereferencing it. - cgroup: refuse to run in a frozen cgroup, like runc does, instead of
hanging forever with no indication of what is going on. - cgroup: destroy the cgroup if its setup fails, so that an invalid
resource limit no longer leaves an empty cgroup behind. - cgroup: treat an empty cgroup path in the status file as no cgroup,
fixing "crun update" on a container started with
--cgroup-manager=disabled. - cgroup: handle a device entry with no "access" in the cgroup v1
writer, which wrote "c 1:3 (null)" to devices.allow. - exec: use the systemd AttachProcessesToUnit method as a fallback when
writing to cgroup.procs is denied, fixing "crun exec" for a rootless
user in a login session when the container uses the systemd cgroup
manager. - exec: use exit code 255 for "crun exec" failures, like runc does, so
that they can be told apart from the executed process exiting with 1. - exec: use the same error as runc for a paused container.
- seccomp: apply all the argument conditions, removing the arbitrary
limit of 6 conditions. - seccomp: validate the argument indices once per syscall entry, so an
out of range index is no longer accepted when every name of the entry
is unknown to libseccomp. - seccomp: checksum every field that affects the generated filter, so a
cached filter is not reused for a different configuration. - restore: forward signals to the container init on a foreground
restore, so that a ^C no longer kills crun and leaves the container
running. - restore: use a throw-away process to drive a detached restore, so
that a program embedding libcrun is no longer moved in and out of the
container cgroup and left with the container init as a child. - restore: put CRIU into the container cgroup, so that the restored
tasks are created there. - restore: fix --manage-cgroups-mode, which was always overridden with
the default "soft" mode. - restore: fix bind mounts with a relative source, and create the
missing mountpoints inside the bind mount sources. - checkpoint: fix masked directories with a non-default --root.
- criu: only relocate the unified hierarchy on restore with cgroup v2,
so that named v1 hierarchies are no longer duplicated on every
checkpoint and restore. - criu: fix stripping the rootfs prefix from the mount destination when
the rootfs is "/" or not set. - container: report the bundle path consistently, and pass it to the
createRuntime and poststart hooks instead of the working directory of
crun. - container: tell the hook type and its number when a hook fails.
- scheduler: reject a SCHED_DEADLINE value equal to 2^63.
- scheduler: fix the CPU affinity reset on systems with more than 1024
CPUs, and fix the CPU_ALLOC argument, which allocated a set about 8
times smaller than needed. - ring_buffer: fix an off-by-one in the wrapped regions, which could
truncate or garble the pty output once the ring buffer wrapped and
was drained partially. - intelrdt: fix a signed overflow in the schemata comparator, which
could misorder the qsort() and send the bsearch() down the wrong
branch. - status: fix a NULL dereference on the optional "owner" and
"external_descriptors" fields, which crashed "crun list --format=json"
and the checkpoint path on a status file without them. - utils: fall back to the uid_map heuristic to detect the initial user
namespace on OpenVZ, and on kernels without /proc/self/ns/user. - utils: say that the AppArmor profile is not loaded instead of
reporting a confusing ENOENT on the procfs file. - wamr: resolve the wasi socket pool functions via dlsym, fixing the
undefined references at link time. - python, lua: fix the bindings, which were missing the "start" method,
had a duplicate "spec" entry and a broken context capsule destructor.