Linux 内核权限提升漏洞CVE-2024-1086三种修复方法

打印 上一主题 下一主题

主题 644|帖子 644|积分 1932

  1. 作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG数据库运维(如安装迁移,性能优化、故障应急处理等)
  2. 公众号:老苏畅谈运维
  3. 欢迎关注本人公众号,更多精彩与您分享。
复制代码
一、漏洞概述


漏洞成因:
Netfilter是Linux内核中的一个数据包处置惩罚模块,它可以提供数据包的过滤、转发、地点转换NAT功能。
2024年3月28日,监测到 Linux kernel权限提升漏洞(CVE-2024-1086)的PoC/EXP在互联网上公开,该漏洞的CVSS评分为7.8,目前漏洞细节已经公开披露。
Linux内核版本v5.14 – v6.6的netfilter 子体系nf_tables组件中存在开释后使用漏洞,由于在nft_verdict_init()函数中,允许正值作为hook判决中的抛弃错误,因此当NF_DROP发出类似于NF_ACCEPT的抛弃错误时,nf_hook_slow()函数可能会导致双重开释漏洞,当地低权限威胁者可利用该漏洞将权限提升为root。
二、漏洞影响范围

3.15<= Linux kernel < 6.1.76
5.2<= Linux kernel < 6.6.15
6.7<= Linux kernel < 6.7.3
6.8:rc1 = Linux kernel
该漏洞影响了使用Linux内核版本v5.14 – v6.6 版本(不包括分支修补版本 v5.15.149、v6.1.76和v6.6.15)的大多数Linux体系/内核,包括CentOS、Debian、Ubuntu和KernelCTF等,部门测试内核版本及结果如下:

留意事项:
(1)该漏洞不适用于带有 kconfig 的 v6.4> 内核CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y(包括 Ubuntu v6.5)
(2)该漏洞利用必要用户命名空间 (kconfig CONFIG_USER_NS=y),这些用户命名空间没有特权 (sh command sysctl kernel.unprivileged_userns_clone= 1),而且 nf_tables 已启用 (kconfig CONFIG_NF_TABLES=y)。默认情况下,这些在 Debian、Ubuntu 和 KernelCTF 上均已启用。其他发行版尚未经过测试,但可能也可以工作。别的,该漏洞仅在 x64/amd64 上进行了测试。
(3)在具有大量网络活动的体系上, 该漏洞可能非常不稳定
带有 WiFi 适配器的体系,当被高使用率 WiFi 网络包围时,会非常不稳定。
在测试设备上,请通过 BIOS 关闭 WiFi 适配器。
(4)运行漏洞后的内核恐慌(体系崩溃)是一种副作用,没有故意修复以防止恶意使用漏洞(即,漏洞利用尝试现在应该更引人注目,而且在现实操作中不切现实)。尽管如此,它仍旧允许在实验室环境中进行有效的概念验证,由于根 shell 可以正常工作,而且可以通过磁盘进行持久化。
三、修复方法

紧张有以下三种修复方法:


  • 升级Linux内核版本修复漏洞。
  • 若相干用户临时无法进行更新,假如业务不必要,可以通过制止加载受影响的 netfilter (nf_tables) 内核模块来缓解。
  • 假如无法禁用该模块,可在非容器化部署中,对用户命名空间进行限制。
方法1:在线升级Linux内核版本
  1. ####以下是在centos7.9环境进行测试:
  2. 1、更新yum源,具体版本可以去https://elrepo.org/linux/kernel/el7/x86_64/RPMS/ 这里找
  3. yum -y update
  4. rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
  5. rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm  
  6. 2、使用最新的内核
  7. 查询kernet版本
  8. yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
  9. yum --enablerepo=elrepo-kernel install kernel-ml -y
  10. --enablerepo 选项开启 CentOS 系统上的指定仓库。默认开启的是 elrepo,这里用 elrepo-kernel 替换
  11. 3、设置 grub2 重启生效
  12. awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
  13. 0 : CentOS Linux (5.10.7-1.el7.elrepo.x86_64) 7 (Core)
  14. 1 : CentOS Linux (3.10.0-1160.11.1.el7.x86_64) 7 (Core)
  15. 2 : CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core)
  16. 3 : CentOS Linux (0-rescue-df90baaeef85440fac1251df1c0e0371) 7 (Core)
  17. grub2-set-default 0
  18. vi /etc/default/grub
  19. GRUB_TIMEOUT=5
  20. GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
  21. GRUB_DEFAULT=0 #改为0
  22. GRUB_DISABLE_SUBMENU=true
  23. GRUB_TERMINAL_OUTPUT="console"
  24. GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rhgb quiet"
  25. GRUB_DISABLE_RECOVERY="true"
  26. 5、生成grub 配置文件
  27. grub2-mkconfig -o /boot/grub2/grub.cfg
  28. 6、重启reboot
  29. 7、验证
  30. # uname -r
  31. 5.10.7-1.el7.elrepo.x86_64
  32. # rpm -qa | grep kernel
  33. kernel-3.10.0-693.el7.x86_64
  34. kernel-ml-5.10.7-1.el7.elrepo.x86_64
  35. kernel-tools-libs-3.10.0-1160.11.1.el7.x86_64
  36. kernel-3.10.0-1160.11.1.el7.x86_64
  37. kernel-headers-3.10.0-1160.11.1.el7.x86_64
  38. kernel-tools-3.10.0-1160.11.1.el7.x86_64
  39. 8、删除多余的内核
  40. yum remove kernel-3.10.0-514.el7.x86_64 \
  41. kernel-tools-libs-3.10.0-862.11.6.el7.x86_64 \
  42. kernel-tools-3.10.0-862.11.6.el7.x86_64 \
  43. kernel-3.10.0-862.11.6.el7.x86_64
复制代码
方法二:制止加载受影响的 netfilter (nf_tables) 内核模块
  1. 1、查询是否被加载:lsmod | grep nf_tables
  2. 2、修改 /etc/modprobe.d/blacklist.conf或在/etc/modprobe.d/目录下创建<模块名>.conf文件
  3. 我这里创建了一个名为nf_tables-blacklist.conf
  4. vi /etc/modprobe.d/nf_tables-blacklist.conf
  5. 内容是:
  6. blacklist nf_tables
  7. 3、重启服务器reboot
  8. 4、查询netfilter (nf_tables)内核模块位置
  9. find / name | grep nf_tables
  10. 5、测试加载模块
  11. 加载该模块:insmod nf_tables.ko.xz 报错,发现无法加载,修复完成。
  12. # insmod nf_tables.ko.xz
复制代码
方法三:容器内体系禁用方法
假如无法禁用 nf_tables 内核模块,在体系上没有运行任何容器的情况下,可以通过禁用用户命名空间来缓解漏洞。在禁用之前,必要仔细评估并确认禁用所带来的影响,
例如:很多容器实现必要使用 user_namespaces 来增强安全性和隔离性。
  1. RedHat/CentOS:
  2. # echo "user.max_user_namespaces=0" > /etc/sysctl.d/userns.conf
  3. # sysctl -p /etc/sysctl.d/userns.conf
  4. Debian/Ubuntu:
  5. 如果不需要,可禁用非特权用户创建命名空间的能力。临时禁用执行以下命令:
  6. # sudo sysctl -w kernel.unprivileged_userns_clone=0
  7. 重启后仍然禁用:
  8. # echo kernel.unprivileged_userns_clone=0 | sudo tee /etc/sysctl.d/99-disable-unpriv-userns.conf
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表