github containers/crun 1.30

3 hours ago
  • 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.

Don't miss a new crun release

NewReleases is sending notifications on new releases.