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 代码库中,以提高安全性并增强可靠性。
基于编译器的资源清理¶
代码库将缓慢切换到使用编译器(如 gcc
和 clang
)支持的清理属性。
从代码库中删除 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 版本,鼓励用户更新到最新的错误修复版本(如果可用)。
下载¶
- 主发布包:lxc-3.0.4.tar.gz (GPG: lxc-3.0.4.tar.gz.asc)
- LXC 模板包:lxc-templates-3.0.4.tar.gz (GPG: lxc-templates-3.0.4.tar.gz.asc)
- LXC python3 绑定包:python3-lxc-3.0.4.tar.gz (GPG: python3-lxc-3.0.4.tar.gz.asc)