前言

第一次进行漏洞复现,在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可以找到这样的内容:

image-20240403162518021.png

mount_device是我自己命名的,进入继续查看,发现代码有点多,于是取个巧,我们已经知道漏洞产生的原因是blkid了,那就搜索它,找到引用:

image-20240403163312063.png

这里的off_2801C[0]就是/system/bin/blkid,看上去这段代码就是拼接了blkid命令的参数,然后利用popen进行调用,调用结果输出到v14并且进行分离分析,然后返回。中间还有一些函数,点进去看应该是android的广播机制,是给app通信的,所以可以暂时不管。但是中间sub_F764函数中可以看到:

image-20240403163931406.png

这里把值复制到了a1中,这点后面肯定有用。回到上层函数,继续查引用:

image-20240403164354072.png

这里的下一层函数就用到了刚刚那个a1,进去看看:

image-20240403164520205.png

具体代码有点长,但是从里面可以看到mkdir函数和mount函数,很明显这里就是挂载了。

所以整体的自动挂载过程就是:vold->blkid->mkdir->mount,可以看到,mkdir函数是没有过滤的,而它创建的名字规律是对引号里面的内容进行正则匹配出来的。于是就有了blkid文件的问题:

image-20240403170700846.png

没有进行任何的过滤的问题,导致了mkdir会产生目录穿越的现象。

复现

因为没有对应的车机系统,所以我考虑使用虚拟环境进行复现。

利用qemu起了一个ARM的linux-5的系统,但是使用blkid会产生报错,是链接库的问题。即使是linker调用了它给的libc库,也会调用本地libc导致不兼容产生报错。

看到作者给出的复现环境是树莓派,暂时没有对应设备,故该漏洞实际复现环节暂时搁置。上述分析已经在作者的漏洞解释中进行了进一步研究,大体能说明漏洞成因及利用方式,故可以对类似设备进行探测,若遇类似漏洞再更新本章博客。