返回新闻概述

LXC 3.0.4 已发布

2019 年 6 月 21 日

简介

LXC 团队很高兴地宣布发布 LXC 3.0.4!

作为一个稳定的错误修复版本,没有进行重大更改,而是专注于错误修复和次要可用性改进。

亮点

runC CVE-2019-5736 的修复

此版本包含针对今年早些时候发现的特权容器逃逸的修复。根据我们的策略,我们不认为特权容器是根安全的,因此 LXC 没有收到此漏洞的 CVE。但是,我们仍然在此版本中提供修复。有关更多详细信息,请参阅这篇博文

使用调用者的 uid 为 veth 接口名称添加前缀

为了便于用户检查 veth 设备,LXC 现在将为主机 veth 设备添加调用者的 uid 前缀。

改进在 Android 设备上使用 LXC

这使得 LXC 在 Android 特定的位置(如 /system/bin)中查找标准工具。
此外,现在可以正确地在 Android 上分配循环设备。

反向移植所有当前主版本中标准的编译器硬化选项。

这反向移植了

-fdiagnostics-color
-Wimplicit-fallthrough=5
-Wcast-align
-Wstrict-prototypes
-fno-strict-aliasing
-fstack-clash-protection
-fstack-protector-strong
--param=ssp-buffer-size=4
-g
--mcet -fcf-protection
-Werror=implicit-function-declaration
-Wlogical-op
-Wmissing-include-dirs 
-Wold-style-definition
-Winit-self
-Wfloat-equal
-Wsuggest-attribute=noreturn
-Werror=return-type
-Werror=incompatible-pointer-types
-Wformat=2
-Wshadow
-Wendif-labels
-Werror=overflow
-fdiagnostics-show-option
-Werror=shift-count-overflow
-Werror=shift-overflow=2
-Wdate-time
-Wnested-externs
-fasynchronous-unwind-tables
-pipe
-fexceptions
-z relro
-z now

删除所有堆栈分配 (alloca())

与主版本已经一样,所有通过 alloca() 的堆栈分配都已从代码库中删除,以提高安全性。

添加对 LGTM 的支持

这添加了对 LGTM 代码质量检查器的支持。

添加对 coccinelle 代码转换工具的支持

这使我们能够自动检测、删除或添加代码到 LXC 代码库中,以提高安全性并增强可靠性。

基于编译器的资源清理

代码库将缓慢切换到使用编译器(如 gccclang)支持的清理属性。

从代码库中删除 fgets()

为了提高安全性,所有 fgets() 的使用都已从代码库中删除。强烈建议在新代码中不要使用此函数。

改进 cgroup2 处理

在此版本中,cgroup2 布局将得到更好的支持。

lxc.mount.fstab 之后立即设置 lxc.mount.entry

这使我们能够在 LXC 中统一挂载逻辑。

扩展命名空间共享选项

继承命名空间时,现在可以指定到命名空间文件描述符的路径名。

扩展 close-on-exec 使用

所有可以设置为 close-on-exec 的文件描述符现在都是 close-on-exec。

支持 pidfd api

较新的内核版本允许通过进程文件描述符 (pidfd) 与进程进行交互。这消除了各种竞争条件,例如发送信号或检索进程信息。此 LXC 版本使用 pidfd_send_signal() 系统调用和 clone() 系统调用的 CLONE_PIDFD 标志。

错误修复 (LXC)

  • 修复 cgroup 删除,方法是不要过早地释放要删除的路径
  • 修复 lxc-usernsexec 在回退到默认 ID 映射时的行为
  • 修复编译器不支持 stack-protector 选项时的 LXC 构建
  • 从代码库中删除各种未使用的函数
  • 确保 lxc-cgroup 在所有相关情况下都给出输出
  • 从内部命令处理程序中删除 SIGWINCH 信号的处理程序,因为现在通过 signalfd 处理此信号
  • 通过从目标路径剥离存储类型前缀来修复复制容器
  • 确保 veth 设备名称可以包含所有 ASCII 字母字符
  • 修复 Android 构建
  • 处理不支持 CLONE_NEWCGROUP 的内核
  • 释放用于记录继承的命名空间的内存
  • 删除各种已弃用的头文件
  • 确保 lxc-init 在所有失败路径中报告错误
  • 使各种函数 static
  • 改进设置父进程死亡处理
  • 修复网络设备删除
  • zfs 存储后端更新为新的 zfs 工具语法
  • 通过 upscripts 修复 vlan 设备处理
  • clone() 动态分配堆栈,并使用标准 8MB 堆栈大小
  • 改进静态链接
  • 确保在 cpuset cgroup 中初始化正确祖先的 cgroup.mems

完整的提交列表

摘要
  • apparmor: 允许各种 remount、bind 选项
  • 合并拉取请求 #2758 来自 Blub/2018-12-17/stable-3.0/apparmor-bind-remount
  • cgfsng: 错误时不要释放 container_full_path
  • 合并拉取请求 #2772 来自 brauner/2018-01-09/fix_cgroup_deletion_stable-3.0
  • caps: 检查 uid 和 euid
  • 合并拉取请求 #2830 来自 brauner/2019-02-08/capabilities_stable-3.0
  • CVE-2019-5736 (runC): 将 rexec 调用者作为 memfd
  • include: 为 Android 的 Bionic 添加 fexecve()
  • rexec: 处理旧内核
  • lxc-usernsexec: 修复默认映射功能
  • 修复使用 --disable-commands 选项时的安装错误
  • 将 template-options 添加到帮助输出
  • stringutils: 包含 stdarg 用于 va_list
  • configure.ac: 修复没有 stack-protector 的构建
  • storage: 删除未使用的函数
  • 修复 lxc-cgroup 不会给出输出
  • tools: 将换行符添加到 lxc-cgroup 输出
  • terminal: 删除 sigwinch 命令
  • 在释放后将 c 设置为 NULL
  • conf: 在 lxc_write_to_file 错误上使用 SYSERROR
  • 还原“在释放后将 c 设置为 NULL”
  • lxccontainer: 修复容器复制
  • 修复:无特权 veth 设备(例如 vethFWABHX)永远不会在随机生成的设备名称部分中包含 'Z' 字符,因为对于模 1,不需要从 strlen() 中减去 1。
  • 修复为 android 编译时的编译错误
  • start: 处理缺少 CLONE_NEWCGROUP
  • network: 使用 uid 信息为 veth 接口名称添加前缀
  • 还原“conf: 删除带有 sysfs:mixed 的额外 MS_BIND”
  • conf.c: 修复内存泄漏和挂载错误
  • 修复 cgroup_exit 中的内存泄漏
  • 修复 Android 上的 hooks 功能,其中 'sh' 位于 /system/bin 下
  • 处理 Android 上的备用循环设备位置
  • 避免“过远内存读取”的风险
  • 为 udhcpc 安装 default.script
  • conf: 检查挂载条目解析是否成功
  • 在 configure_busybox() 中使用 BUSYBOX_EXE 变量
  • 创建 /var/run
  • /etc/resolv.conf 不断增长
  • compiler: 删除已弃用且不必要的消息头
  • prlimit: 删除已弃用且不必要的消息头
  • 更准确的模板文件错误消息
  • 修复 bash 完成目录的 rpm 打包。
  • compiler: -Wlogical-op 硬化
  • compiler: -Wmissing-include-dirs 硬化
  • compiler: -Wold-style-definition 硬化
  • compiler: -Winit-self 硬化
  • compiler: -Wfloat-equal 硬化
  • compiler: -Wsuggest-attribute=noreturn 硬化
  • compiler: -Werror=return-type 硬化
  • compiler: -Werror=incompatible-pointer-types
  • compiler: -Wformat=2 硬化
  • compiler: 将 -Wimplicit-fallthrough 设置为 5
  • compiler: -Wshadow 硬化
  • compiler: -Wendif-labels 硬化
  • compiler: -Werror=overflow 硬化
  • compiler: -fdiagnostics-show-option
  • compiler: 修复 -fstack-protector-strong
  • compiler: -Werror=shift-count-overflow 硬化
  • compiler: -Werror=shift-overflow=2 硬化
  • compiler: -Wdate-time 硬化
  • compiler: -Wnested-externs 硬化
  • lxcmntent: 删除堆栈分配
  • cgroups: 删除堆栈分配
  • lxc_user_nic: 删除堆栈分配
  • commands: 删除堆栈分配
  • commands_utils: 删除堆栈分配
  • conf: 删除堆栈分配
  • confile: 删除堆栈分配
  • lxccontainer: 删除堆栈分配
  • monitor: 删除堆栈分配
  • namespace: 删除堆栈分配
  • network: 删除堆栈分配
  • pam_cgfs: 删除堆栈分配
  • start: 删除堆栈分配
  • storage: 删除堆栈分配
  • string_utils: 删除堆栈分配
  • terminal: 删除堆栈分配
  • loop: 删除堆栈分配
  • lvm: 删除堆栈分配
  • nbd: 删除堆栈分配
  • rbd: 删除堆栈分配
  • overlay: 删除堆栈分配
  • lxc-unshare: 删除堆栈分配
  • README: 添加 LGTM
  • commands: 删除不必要的检查
  • cgfsng: 删除不必要的检查
  • start: 阻止签名问题
  • lxc-init: 在等待失败时退出并显示错误
  • coccinelle: 添加 coccinelle 支持
  • coccinelle: s/while({1,true})/for(;;)/
  • coccinelle: 使用标准退出标识符
  • parse: 处理 \r
  • compiler: 修复错误的许可
  • ringbuf.h: 修复错误的许可
  • syscall_wrappers: 修复错误的许可
  • string_utils.h: 修复错误的许可
  • apparmor: 捕获配置文件打开错误
  • apparmor: 改进对 apparmor python 脚本的测试
  • conf: 不要记录 devpts umount2() 失败
  • network: 不要记录虚假好友
  • start: 将变量移至更紧密的范围
  • af_unix: 使用 __do_free
  • attach: 使用 __do_free
  • cgroup_utils: 使用 __do_free
  • lxc-init: 使用清理宏
  • lxc-user-nic: 使用清理宏
  • lxc-usernsexec: 使用清理宏
  • commands: 将声明移至更紧密的范围
  • commands: 在 lxc_cmd_console() 中清理宏
  • macro: 引入 steal_fd()
  • commands: 使用 __do_close_prot_errno
  • commands: 清理宏 lxc_cmd()
  • commands: 清理宏 lxc_cmd_add_state_client
  • commands: 清理宏 lxc_cmd_accept()
  • commands: 清理宏 lxc_cmd_init
  • commands: 清理宏 lxc_cmd_init()
  • tree-wide: s/steal_fd/move_fd/g
  • cve-2019-5736: 添加测试
  • commands_utils: 自动关闭 lxc_cmd_sock_get_state
  • commands_utils: 自动释放 lxc_add_state_client
  • conf: 自动释放 run_buffer
  • conf: 清理宏 run_script_argv
  • conf: 清理宏 pin_rootfs
  • conf: 清理宏 lxc_mount_auto_mounts
  • conf: 清理宏 lxc_chroot
  • conf: 清理宏 parse_mntopts
  • conf: 清理宏 parse_propagationopts
  • conf: 清理宏 mount_entry_create_dir_file
  • conf: 清理宏 mount_entry_on_generic
  • conf: 清理宏 setup_sysctl_parameters
  • conf: 清理宏 setup_proc_filesystem
  • conf: 清理宏 idmaptool_on_path_[...]
  • conf: 清理宏 remount_all_slave
  • conf: 清理宏 lxc_execute_bind_init
  • conf: 清理宏 get_minimal_idmap
  • conf: 清理宏 get{g,u}name
  • conf: 清理宏 suggest_default_idmap
  • travis: 运行 coccinelle
  • travis: 运行 coccinelle
  • attach: 清理宏 lxc_proc_close_ns_fd
  • attach: 清理宏 in_same_namespace
  • attach: 清理宏 lxc_put_attach_clone_[...]
  • attach: 清理宏 lxc_attach_terminal_[...]
  • .travis: 再尝试一次 coverity
  • .travis: 删除 coverity
  • lxc-attach: 切换到 attach_run_wait
  • conf: 简化 idmaptool_on_path_and_privileged
  • conf: 清理宏 remount_all_slave
  • conf: 清理宏 lxc_chroot
  • conf: 清理宏 lxc_pivot_root
  • conf: 清理宏 lxc_fill_autodev
  • conf: 清理宏 make_anonymous_mount_file
  • conf: 清理宏 setup_mount_entries
  • conf: 清理宏 write_id_mapping
  • conf: 清理宏 suggest_default_idmap
  • attach: 在 lxc_proc_close_ns_fd 中使用 move_fd
  • gpg: 如果设置了 http_proxy,则使用代理
  • conf: 从 run_buffer() 中删除 fgets()
  • conf: 从 lxc_chroot() 中删除 fgets()
  • initutils: 从 lxc_global_con[...] 中删除 fgets()
  • initutils: 从 setproctitle() 中删除 fgets()
  • conf: 删除未使用的变量
  • confile: 使 gcc 闭嘴
  • CODING_STYLE: 更新
  • 修复 Android 编译
  • commands_utils.c: 修复错误的许可
  • commands_utils.h: 修复错误的许可
  • file_utils.c: 修复错误的许可
  • string_utils.c: 修复错误的许可
  • attach: 删除未使用的变量
  • attacg: 使 gcc 闭嘴
  • lxccontainer: 使 gcc 闭嘴并删除未使用的变量。
  • network: 使 gcc 闭嘴。
  • monitor: 使 gcc 闭嘴。
  • start: 使 gcc 闭嘴。
  • storage: 使 gcc 闭嘴并删除未使用的变量。
  • cmd: 使 gcc 闭嘴。
  • confile_utils: lxc_config_net_is_hwaddr()
  • confile_utils: 使 update_hwaddr() 静态
  • confile: 使 parse_limit_value() 静态
  • conf: 修复未初始化的变量。
  • 恢复“conf: 修复未初始化的变量。”
  • conf: 避免编译器警告
  • 修复 lxc.cgroup2。在仅 cgroup2 的系统上
  • hooks: 在 post-stop 之前删除命名空间引用
  • btrfs: 确保结尾处有 \0 字节
  • compiler: -fasynchronous-unwind-tables 加固
  • compiler: -pipe
  • compiler: -fexceptions 加固
  • utils: 修复 lxc_set_death_signal 中对 PID 命名空间的处理
  • start: 修复传递给 lxc_set_death_signal 的父 PID
  • hardening: 启用地址清理器构建
  • start: 反向移植 monitor_pid 处理
  • cgfsng: 修复 cgroup2 处理
  • cgroups: 修复潜在的空指针引用
  • cgfsng: 反向移植新的 cgroup 处理逻辑
  • 合并拉取请求 #2944 来自 brauner/lxc/stable-3.0
  • raw_syscalls: lxc_raw_clone()
  • hooks/nvidia: 处理 NVIDIA_REQUIRE 变量中的空格
  • Travis: 在自动构建中添加 -Wall 和 -Werror gcc 标记。
  • travis: 尝试修复 src/lxc/cmd/lxc_init.c:251: 对 `pthread_sigmask 的未定义引用
  • lvm: 更新 lvcreate 以在支持的情况下擦除签名,如果不支持,则回退到旧命令。
  • network: 修复网络设备移除
  • 修复用户命名空间 pdeathsig 处理
  • lxc-user-nic: 小调整
  • doc: 更新 lxc-user-nic 手册页
  • lxc-user-nic: 验证请求
  • doc: 更新日语 lxc-user-nic 手册页
  • fix: #2927 api 文档生成在源代码外部构建下失败。
  • storage: 防止未初始化的变量警告
  • storage: 更新 zfs
  • conf: 在 lxc.mount.fstab 之后立即执行 lxc.mount.entry 挂载
  • netns_getifaddrs: 适应内核更改
  • lxc-start: 删除错误的文档
  • 修复“zfs get”命令顺序
  • commands: 部分反向移植 seccomp 通知
  • af_unix: 反向移植辅助函数
  • start: 使 clang 闭嘴
  • network: 修复错误消息中的一点小错误
  • network: 添加对 vlan 网络类型的 upscript 处理
  • network: 修复 vlan 挂钩脚本
  • tests: 更新 .gitignore 以忽略测试构建工件
  • network: 修复 macvlan 模式选择中的错误
  • seccomp: 通知程序修复
  • namespaces: 允许指向要共享命名空间的 nsfd 的路径名
  • tree-wide: 使套接字 SOCK_CLOEXEC
  • compiler: 添加 __returns_twice 属性
  • raw_syscalls: 添加对 pidfd_send_signal() 的初始支持
  • 在 rootfs 而不是 rootfs/dev 中创建设备
  • utils: 改进 switch_to_ns()
  • raw_syscalls: 简化汇编
  • clone: 添加 CLONE_PIDFD 的基础设施
  • network: 添加对 phys 和 macvlan 类型的 mtu 支持
  • namespace: 使用 lxc_clone() 支持 CLONE_PIDFD
  • network: 在容器关闭时恢复 phys 设备 MTU
  • start: 使用 CLONE_PIDFD
  • 将错误消息重定向到 stderr
  • coding style: 更新
  • 新的 --bbpath 选项和不必要的 --rootfs 检查
  • lxccontainer: 如果缺少权限,则不要显示
  • 选项 --busybox-path 而不是 --bbpath
  • criu: 使用 -v4 而不是 -vvvvvv
  • criu: 删除 _exit() 之后不必要的返回
  • lvm: 如果 lvm_create_clone 失败,则修复返回值
  • zfs: 在 zfs_snapshot 错误上修复返回值
  • initutils: 在 realloc 失败时修复内存泄漏
  • Config: 检查 %m 的可用性
  • 在可用时使用 %m 而不是 strerror()
  • 容易出错的分号
  • configure: 处理交叉编译时的检查
  • network: 将 phys 网络设备移回监视器的网络 ns 而不是 pid 1 的网络 ns
  • network: 修复阻止 phys 网络设备运行向下挂钩的错误
  • attach: 不要重新加载容器
  • lxccontainer: 清理附加函数
  • lxccontainer: 删除未使用的函数
  • start: 删除未使用的标签
  • configure: 删除额外的逗号
  • lxc_clone: 将非堆栈分配的堆栈传递给克隆
  • doc: 添加关于共享 ns + LSM 的一小段说明
  • lxc_clone: 摆脱一些间接性
  • cgroups: 在 v1 层次结构中处理脱机 cpu
  • 修复问题 2765
  • lxc_clone: 将堆栈大小增加到 8MB
  • lxc_clone: 添加关于堆栈大小的注释
  • 如果缓冲区太小,getgrgid_r 会失败并返回 ERANGE。使用更大的缓冲区重试。
  • lxc_usernsexec: 在 unshare 失败后继续会导致令人困惑和误导性的错误消息
  • start: 修复 lxc_init 失败时的处理程序内存泄漏
  • cgroups: 防止段错误
  • 使任何用户都可以访问 /tmp
  • 针对 #2892 的建议修复 - 修复 lxc/lxccontainer.c 中的 lxcbasename
  • start: 在容器启动时生成新的引导 ID
  • 集中挂钩名称
  • doc: 将关于共享 ns + LSM 的说明添加到日语文档中
  • 从 gnutls 切换到 openssl 用于 sha1
  • network: 修复 lxc_netdev_rename_by_index()
  • 修复了网络命名空间的文件描述符泄漏
  • lxc.pc.in: 添加 libs.private 用于静态链接
  • parse.c: 修复来自 memfd_create 的 fd 泄漏
  • cgfsng: 写入正确祖先的 cpuset.mems

Bugfixes (LXC templates)

  • 为 lxc-slackware 模板添加新的 wget 依赖项
  • plamo: 在当前 7.x 上构建 32 位 6.x 容器的变通方法
  • plamo: 支持 https 作为下载方案,并默认使用 https

Bugfixes (python3 binding)

  • 此版本中没有更改,仅版本号提升

支持和升级

LXC 3.0.4 受到支持,直到 2023 年 6 月,是我们当前的 LTS 版本,鼓励用户更新到最新的错误修复版本(如果可用)。

下载