前情描述
最近在工作中,应用部署的服务器被扫描出 runc 文件描述符泄漏漏洞(CVE-2024-21626),由于漏洞报文较新,便去搜索了相关修复方法,可采用runc升级的方法去修复该漏洞。
具体描述如下:
在runc 1.1.11 及之前的版本中,由于内部文件描述符泄露的问题,攻击者可以让新生成的容器进程在宿主文件系统命名空间中拥有工作目录,从而允许通过访问宿主文件系统实现容器逃逸等用需要具体的环境,例如允许攻击者提供自定义镜像等。官方已于2024年2月1日发布安全更新,建议相关受影响用户升级。
阿里云ACK runc版本影响范围:
1.1.0 <= runc <= 1.1.11
社区版本影响范围:
1.0.0-rc93<= runc <= 1.1.11
社区在下列版本中修复了该问题:
runc 1.1.12
!!重点注意的是 在修复前,runc升级对以下情况会有影响,在升级前需做好相应的备份工作。
1. Docker 和其他容器运行时:因为 runc 是 Docker、containerd 以及其他遵循 OCI(开放容器倡议)标准的容器引擎使用的默认执行器,升级 runc 可能需要相应的 Docker 或 containerd 版本支持。不兼容的版本组合可能导致容器无法正常运行或管理。
2. 正在运行的容器:升级过程中如果存在活跃的容器,理论上不会直接影响它们的运行(除非存在严重的bug需要热修复),但在升级后重启容器时,新版本的 runc 将接管容器的执行,可能应用新的安全策略或性能优化。
3. 安全性更新:runc 的升级通常伴随着安全漏洞的修复。因此,升级可能关闭了旧版本中存在的安全风险,提升了容器环境的安全性。
4. 兼容性和稳定性:尽管升级是为了改进和修复问题,但新版本也可能引入新的bug或不兼容的变化,影响到依赖特定 runc 行为的应用程序。
5. 系统服务和依赖:如果有系统服务或应用程序直接或间接依赖于特定版本的 runc,升级可能需要对这些服务进行相应的调整或测试以确保兼容性。
综合考虑过以上前提后,具体更新过程如下:
一.服务器上无docker进程及相关容器,直接升级
解决方案
要升级 Linux 系统中的 runc 版本,可以按照以下步骤操作。下面的步骤适用于大多数 Linux 发行版。
升级 runc 的步骤
卸载现有的 runc 版本(可选,根据具体情况):
sudo apt-get remove runc
下载最新版本的 runc:
从 runc的GitHub releases页面 获取最新版本的下载链接,并使用 wget 或 curl 下载最新版本的二进制文件。例如:
wget https://github.com/opencontainers/runc/releases/download/v1.1.0/runc.amd64 -O runc
##请根据实际最新版本替换上面的URL和文件名。
安装新版本:
给下载的文件添加可执行权限,并将其移动到系统的适当位置:
chmod +x runc
sudo mv runc /usr/local/sbin/runc
如果你的 runc 安装在 /usr/bin 目录中,使用以下命令:
sudo mv runc /usr/bin/runc
验证安装:
确认 runc 已成功更新:
runc --version
##你应该会看到新的版本信息。
原文链接:https://blog.csdn.net/weixin_47610533/article/details/140302731
二.有docker在运行,重装runc后docker消失
但是由于我需修复的服务器上还存在docker支撑的进程,后面检查时候发现上述方法在卸载runc时直接卸载掉了整个docker。需要重装。
具体重装步骤如下
2.1 下载docker tar包
下载地址:
Index of linux/
https://download.docker.com/linux/
2.2 新建自己的软件目录,然后将tar移过去,并解压
mv docker-24.0.6.tgz /gdc/app/docker24.0.6/
tar xzvf docker-24.0.6.tgz
2.3将解压文件中docker下的所有文件移动到/usr/bin/下
sudo cp docker/* /usr/bin/
2.4修改/etc/systemd/system/docker.service内容(没有的话vi命令会自动创建该文件)
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
2.5 添加启动权限
chmod +x /etc/systemd/system/docker.service
2.6创建docker配置文件,并添加daemon.json的配置内容(docker下载的存储地址)
mkdir -p /etc/docker
touch /etc/docker/daemon.json
vi /etc/docker/daemon.json
下面 data-root 位置比较重要放的位置上不对可能导致磁盘空间不够,尽量不要放到/HOME
下
{
"data-root": "/gdc/app/docker24.0.6/docker-data",
"registry-mirrors": [
"https://rnv4c7zq.mirror.aliyuncs.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
2.7启动
systemctl daemon-reload --配置重载
systemctl start docker --启动
systemctl enable docker --开机启动
systemctl status docker --查看状态
docker info --概要
docker images --已经下载的镜像
docker pull 镜像名字[:TAG] --镜像名字:版本号 不写TAG就是最新版
docker system df 查看镜像/容器/数据卷所占的空间
docker rmi -f 镜像ID 删除某个镜像ID
docker exec -it elasticsearch /bin/bash --打开 es的容器空间(这是我本机的容器名称)
sudo groupadd docker 创建docker分组
sudo usermod -aG docker $USER 将当前用户加入分组
newgrp docker # 更新用户组docker
docker info | grep "Docker Root Dir" 显示docker数据文件位置,docker迁移位置完成后检测迁移
————————————————
原文链接:https://blog.csdn.net/gaoduicai/article/details/134694909