漏洞研究CVE-2023-40930
前言
第一次进行漏洞复现,在DASCTF的题解中看到了一个cve,所以想进行一些尝试。在比赛中的题目是模拟U盘挂载的过程的,但是我想尝试一下实际复现。
漏洞介绍:https://gist.github.com/NSnidie/2af70d58426c4563b2f11171379fdd8c
漏洞复现环境:https://github.com/NSnidie/CVE-2023-40930
漏洞来源于Nameless师傅,博客地址:https://nameless.top,未和师傅交流过,侵删!
程序逆向分析
虽然说作者给出了一些程序分析,定位到挂载漏洞是在/system/bin/blkid
中出现的,但是整体的运行逻辑不完全是这样的,毕竟blkid
命令其实根本不会进行挂载。
为了弄清类似skyworth这一类系统的挂载步骤,我在网上找到了一个skyworth的固件:8S41_E3500_V016.012.190_9,并且进行了分析。
一般的linux系统的usb自动挂载是通过vold实现的,在vold.fstab中编辑类似:
dev_mount usbdisk /mnt/usbdisk auto /devices/platform/s5p-ehci/usb1/1-1
这样的内容,然后由守护进程vold
在检测到有usb插入之后进行挂载。而刚好这个固件里有一个vold
程序,遂ida逆向之~
明确逆向的目的:找到挂载的过程。问题在于:为啥挂载会和blkid有关?
搜索mount可以找到这样的内容:
mount_device
是我自己命名的,进入继续查看,发现代码有点多,于是取个巧,我们已经知道漏洞产生的原因是blkid
了,那就搜索它,找到引用:
这里的off_2801C[0]
就是/system/bin/blkid
,看上去这段代码就是拼接了blkid
命令的参数,然后利用popen
进行调用,调用结果输出到v14
并且进行分离分析,然后返回。中间还有一些函数,点进去看应该是android的广播机制,是给app通信的,所以可以暂时不管。但是中间sub_F764
函数中可以看到:
这里把值复制到了a1中,这点后面肯定有用。回到上层函数,继续查引用:
这里的下一层函数就用到了刚刚那个a1,进去看看:
具体代码有点长,但是从里面可以看到mkdir
函数和mount
函数,很明显这里就是挂载了。
所以整体的自动挂载过程就是:vold->blkid->mkdir->mount
,可以看到,mkdir
函数是没有过滤的,而它创建的名字规律是对引号里面的内容进行正则匹配出来的。于是就有了blkid
文件的问题:
没有进行任何的过滤的问题,导致了mkdir会产生目录穿越的现象。
复现
因为没有对应的车机系统,所以我考虑使用虚拟环境进行复现。
利用qemu起了一个ARM的linux-5的系统,但是使用blkid会产生报错,是链接库的问题。即使是linker调用了它给的libc库,也会调用本地libc导致不兼容产生报错。
看到作者给出的复现环境是树莓派,暂时没有对应设备,故该漏洞实际复现环节暂时搁置。上述分析已经在作者的漏洞解释中进行了进一步研究,大体能说明漏洞成因及利用方式,故可以对类似设备进行探测,若遇类似漏洞再更新本章博客。