更多资讯和分析文章请关注启明星辰ADLab微信公众号及官方网站(adlab.venustech.com.cn)

漏洞背景

近日,Linux git中发布一个commit补丁,该补丁对应的漏洞是一个本地提权漏洞CVE-2019-8912,漏洞影响范围较广。根据git中的commit信息可知,该漏洞出现在内核'crypto/af_alg.c'中的af_alg_release函数中,可以通过sockfs_setattr函数触发,漏洞类型是use after free,可以导致本地代码执行进行权限提升。

漏洞影响版本

  • Linux 2 .6 ~ Linux 4.20.11

  • Red Hat Enterprise Linux 7,Package: kernel-alt

  • Debian,Release:Jessie,Version:3.16.56-1+deb8u1

  • Debian,Release:Jessie (security),Version:3.16.56-1

  • Debian,Release:stretch,Version:4.9.144-3

  • Debian,Release:stretch (security),Version:4.9.110-3+deb9u6

  • Debian,Release:buster,Version:4.19.16-1

  • Debian,Release:sid,Version:4.19.20-1

Linux Crypto模块简介

Linux内核从版本2.5开始引入了加密机制,为内核提供加密功能,应用包括:硬件加密设备驱动、内核代码签名、硬件随机数生成器、文件系统加密等。从版本2.6.6之后,内核源码提供了丰富的密码学算法支持,并可以通过配置编译选项将加密算法作为模块编入内核。内核编译配置如下图所示:

但是该加密功能提供的API接口只能在内核层进行使用,用户层无法调用。2010年,有位维护者向Linux Crypto维护组提交了一份Crypato API 用户接口,类似于netlink,基于socket进行通信,便于用户层访问内核加密子系统。功能实现代码在文件crypto/af_alg.c中。

漏洞原理及溯源

漏洞存在于crypto 模块中的af_alg_release()函数中。af_alg_release()函数在进行对象释放时,未将对象置空。对应commit:9060cb719e61b685ec0102574e10337fa5f445ea补丁代码如下,补丁添加了一行代码:sock->sk = NULL; 。

在未添加补丁之前,如果该sock->sk引用计数是1,当调用sock_put()进行释放后没有置空,就直接返回,会产生一个sock->sk悬挂指针。

为了分析这个漏洞的前因后果,先分析下相关的socket代码。对每个新创建的socket,Linux内核都将在sockfs中创建一个新的inode。Sockfs_*系列函数就是用来操作sockfs文件系统的。Sockfs_setattr()函数就是设置socket文件属性的。在net/socket.c文件中sockfs_setattr()函数将会使用sock->sk对象。

根据提交的commit:9060cb719e61b685ec0102574e10337fa5f445ea细节可知,在该漏洞披露之前,Linux已经修复了sock_close()和sockfs_setattr()之间的条件竞争漏洞,对应commit为6d8c50dcb029872b298eea68cc6209c866fd3e14,具体先看下sockfs_setattr()函数中的补丁。补丁代码如下:

行544,首先判断sock->sk是否为空,如果不为空,行545再将用户层传进来的iattr->ia_uid赋值为sock->sk->sk_uid。然后看sock_close ()函数中的补丁。补丁代码如下:

行1186,替换成了新函数__sock_release(),该函数多了一个参数inode。__sock_release()函数实现如下:

行601,对inode进行判断,如果不为空,然后调用inode_lock()函数对其进行上锁。其实该inode本身和要进行释放的socket对象是对应的。行603,调用ops中release()函数进行释放操作。这个ops中release()函数只是一个函数指针,最终会根据用户注册哪种套接字类型决定。行604,再次判断inode是否为空,如果不为空,再进行解锁。通过对inode加锁,防止在对socket对象释放时进行其他操作。

从commit:6d8c50dcb029872b298eea68cc6209c866fd3e14提供的细节可知, sock_close()函数和sockfs_setattr()函数之间的条件竞争可以通过用户层fchownat()函数引发。根据man手册可知,该函数是用于设置文件属性的,例如uid和gid,在内核中对应的sockfs_setattr()函数,如下图所示:

细节中描述,该函数不会保持文件fd的引用计数,这也是导致存在条件竞争的原因。根据前文可知,sockfs_setattr()函数其实就是设置UID才操作sock->sk对象的。

如果再继续向前追溯的话,从commit:86741ec25462e4c8cdce6df2f41ead05568c7d5e提供的细节可知UID的来龙去脉。该补丁提交于2016年。由于socket 协议中的结构体struct sock在大多时候都是和用户层的sockets一一映射的,sockets对应的内核结构体为struct socket。考虑到方便操作,便通过向struct sock添加一个sk_uid字段来简化对struct socket中的UID的匹配,也因此添加了一个关键函数。如下图所示:

由此可知,本来存在于sock_close()和sockfs_setattr之间的条件竞争已经被修复,由于crypto/af_alg.c中af_alg_release()函数没有将释放后的sock->sk及时置空,导致前面所做的安全补丁全部失效。

安全建议

该漏洞补丁已经给出,请及时升级到最新版本。https://github.com/torvalds/linux/commit/9060cb719e61b685ec0102574e10337fa5f445ea

启明星辰积极防御实验室(ADLab)

ADLab成立于1999年,是中国安全行业最早成立的攻防技术研究实验室之一,微软MAPP计划核心成员,“黑雀攻击”概念首推者。截止目前,ADLab已通过CVE累计发布安全漏洞近1000个,通过 CNVD/CNNVD累计发布安全漏洞近500个,持续保持国际网络安全领域一流水准。实验室研究方向涵盖操作系统与应用系统安全研究、移动智能终端安全研究、物联网智能设备安全研究、Web安全研究、工控系统安全研究、云安全研究。研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。

sqlite字段是否存在_【漏洞预警】Linux内核存在本地提权漏洞(CVE20198912)相关推荐

  1. win10注入漏洞跳出计算机,win10操作系统本地提权漏洞

    2018年8月27日,安全研究人员在github上公布了最新的win10x64版的本地提权漏洞,并且在推特上对其提权的demo进行了演示.在github上的SandboxEscaper上有着完整的漏洞 ...

  2. CVE-2017-7494紧急预警:Samba蠕虫级提权漏洞,攻击代码已在网上扩散

    本文讲的是 CVE-2017-7494紧急预警:Samba蠕虫级提权漏洞,攻击代码已在网上扩散, 昨天晚上,开源软件Samba官方发布 安全公告 ,称刚刚修复了软件内一个已有七年之久的严重漏洞(CVE ...

  3. Linux 系统安全 - 近期发现的 polkit pkexec 本地提权漏洞(CVE-2021-4034)修复方案

    时间: 20220-1-25 事件: qualys 安全研究人员披露 CVE-2021-4034 polkit pkexec 本地提权漏洞细节. 漏洞描述: polkit pkexec 中对命令行参数 ...

  4. linux自动更新漏洞,Linux爆本地提权漏洞 请立即更新udev程序

    Linux的udev程序再爆本地提权漏洞,本地用户可以轻易获得root权限,请立即更新udev程序.(2.4内核系统不受影响) 修复方法(修复前请备份重要数据): debian用户请执行apt-get ...

  5. Linux爆本地提权漏洞 请立即更新udev程序

    Linux的udev程序再爆本地提权漏洞,本地用户可以轻易获得root权限,请立即更新udev程序.(2.4内核系统不受影响) 修复方法(修复前请备份重要数据): debian用户请执行apt-get ...

  6. 【CVE-2021-4043】Linux本地提权漏洞复现

    实验步骤 文章目录 实验步骤 CVE-2021-4043 Linux本地提权漏洞 实验背景 实验环境 漏洞复现 构造payload 用gcc编译后上传到阿里云 执行payload 漏洞修复 CVE-2 ...

  7. Dirty Pipe – Linux 内核本地提权漏洞

    一.漏洞简介 CVE-2022-0847 是存在于 Linux内核 5.8 及之后版本中的本地提权漏洞.攻击者通过利用此漏洞,可覆盖重写任意可读文件中的数据,从而可将普通权限的用户提升到特权 root ...

  8. 绿盟科技 linux漏洞,绿盟科技发布LINUX内核本地提权漏洞技术分析与防护方案

    Linux内核的内存子系统在处理写时拷贝(Copy-on-Write,缩写为COW)时存在条件竞争漏洞,导致可以破坏私有只读内存映射.一个低权限的本地用户能够利用此漏洞获取其他只读内存映射的写权限,进 ...

  9. 反编译exe软件_挖洞经验 | Panda反病毒软件本地提权漏洞分析

    写在前面的话 在这篇文章中,我将跟大家讨论一个我在Panda反病毒产品中发现的一个安全漏洞(CVE-2019-12042),这是一个本地提权漏洞,该漏洞将允许攻击者在目标设备上将非特权账户提权至SYS ...

最新文章

  1. C#中获取程序当前路径的集中方法
  2. 2015计算机硕士考研非统考的学校,2015考研计算机专业统考非统考学校统计
  3. iBATIS之父:iBATIS框架的成功蜕变
  4. 皮一皮:打完疫苗千万别睡太死...
  5. PAT甲级1045 Favorite Color Stripe (30 分):[C++题解]最佳彩色带、DP、公共子序列变形
  6. Java程序员从笨鸟到菜鸟之(八十四)深入浅出Ajax
  7. kylin框架中使用postcss-px2rem
  8. Win XP2实用的修复工具
  9. mongorepository查询条件_MongoRepository实现增删改查和复杂查询【支持的查询类型】...
  10. linux 查看显卡信号_Linux下如何查看NVIDIA显卡信息
  11. Shell编程入门(第二版)(中)
  12. 1.Jenkins 权威指南 --- 在Jenkins 中构建第一个项目
  13. 基于 Windows7 + VMware-CentOS7虚拟机 搭建开发模式
  14. DCGAN训练人脸照片,pytorch
  15. linux基本防护 /病毒检测
  16. 3dfier:GIS数据转3D城市模型
  17. AppEmit是应用程序(尤其是浏览器)与本地程序间互相通信的易扩展的轻量级中间件
  18. mirna富集分析_miRNA芯片数据挖掘文章套路
  19. mybatis plus 格式话_MyBatisPlus学习整理(二)
  20. javax和java的区别

热门文章

  1. 保护 .NET Core 项目的敏感信息
  2. 在Docker中配置ASP.NETCore的HTTPS模式
  3. 【追加功能】OFFICE插件管理工具重整后再上路,更好用易用。
  4. Nuget多项目批量打包上传服务器的简明教程
  5. 编写优雅代码,从挖掉恶心的if/else 开始
  6. 软件设计的第一性原理:结构化抽象
  7. Hyper-V + CentOS7 网络设置(视频教程)
  8. Identity Server 4 - Hybrid Flow - 使用ABAC保护MVC客户端和API资源
  9. 推荐一份基于Docker的DevOps实战培训教程
  10. .NET Core项目部署到linux(Centos7)