首页
社区
课程
招聘
[原创]CVE-2018-14424 use-after-free of disposed transient displays 分析
发表于: 2018-8-20 15:31 4030

[原创]CVE-2018-14424 use-after-free of disposed transient displays 分析

2018-8-20 15:31
4030

6f9K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2U0L8X3u0D9L8$3N6K6i4K6u0W2j5$3!0E0i4K6u0r3M7U0q4F1k6K6m8Q4x3V1k6H3i4K6u0r3z5e0f1H3x3K6M7J5z5q4)9J5k6h3S2@1L8h3H3`.

GDM守护进程不能正确的取消导出在D-Bus 接口上已经被销毁的display对象,这造成本地用户可以触发UAF,从而使系统崩溃或造成任意代码执行。

gdm版本: 3.14.2(通过git下载3.14版本的gdm)

Linux发型版本: Debain 9.5

内核版本: 4.9.0-7

体系结构: x86_64

工具: d-feet

安装前需要将已经安装的登陆管理器卸载(我环境中的是gdm3)

需要装的库:

build-essential dh-autoreconf intltool libcurl4-openssl-dev pkg-config libgtk-3-dev libmutter-dev libwnck-3-dev libgnome-menu-3-dev libupower-glib-dev gobject-introspection libglib3.0-cil-dev libgtk3.0-cil-dev libaccountsservice-dev libcanberra-gtk3-0 libcanberra-gtk3-dev libpam0g-dev

gdm 安装

更换/etc/X11/default-display-manager中为刚刚安装好的gdm二进制文件路径

之后运行

使gdm守护进程开机启动

重启发现根本无法显示登陆管理器界面,可以使用Ctrl+Alt+F3的方式 切换到字符终端,然后登陆输入startx。其gdm守护进程也是启动的不影响调试。

使gdm守护进程崩溃的命令如下:

其中D-Bus是针对桌面环境优化的IPC机制,用于进程间的通信或进程与内核的通信。(更加详细的D-Bus介绍可参考资料4、5、6)

第一条命令:调用显示登录管理器下面的LocalDisplayFactory对象的CreateTransientDisplay方法,并将回复的消息正文保存到display_path变量中

第二条命令 : 等待5秒

第三条命令:调用显示登录管理器下面的名称为第一条命令返回的字符串(保存在display_path变量中,类似于字符串“/org/gnome/DisplayManager/Displays/94425659672144”)的GetId方法

阅读资料7可以发现,第一条命令会调用daemon/gdm-local-display-factory.c:handle_create_transient_display函数

其主要调用的函数为gdm_local_display_factory_create_transient_display.

其主要完成的任务是:

分配一个数字,然后分配一个与刚刚分配数字相关联的display对象。将display保存到GdmDisplayStore中的hash表中,将数字保存到GdmLocalDisplayFactory中priv的hash表中。

如果继续跟踪的store_display(静态+动态),会发现其调用了on_display_added函数

该函数完成的功能是:将刚刚创建的对象导出,并且将display对象的状态变换与on_display_status_changed(gdm-local-display-factory.c)函数相关联,如果我们用d-feet工具查看的话,可以看到已经导出。

我们分析刚刚创建的display对象的状态变换函数:

其会将display对象从hash表中删除(并没有将该内存销毁,销毁是在另一个函数中完成的)

我们查看gdm-display.c中的queue_finish函数,其会调用g_idle_add添加一个让程序在空闲时执行的函数,让其在空闲的时候销毁display对象。跟踪(动态加静态)发现其调用

其在这里完成了display对象的内存销毁,在销毁对象之前,该函数会调用on_display_removed函数

分析可知该函数是将该对象取消导出。

所以可以知道第二条命令完成的是:等待display对象状态变为GDM_DISPLAY_FINISHED,然后将其从hash表中移除。等待空闲时调用stored_display_free函数,其调用on_display_removed,在该函数中因为该display对象已经被移除,gdm_display_store_lookup会返回空,所以取消该对象的导出失败,然后返回stored_display_free函数,将display对象销毁。但是通过d-feet工具查看,该对象仍然存在。

然后我们分析第三条命令(要调用的对象是/org/gnome/DisplayManager/Displays/94425659672144的GetId,其中只有数字部分是随机的其他不变)

根据介绍的方法可以定位到调用GetId方法的代码.

其对已经释放的display对象操作,造成UAF。

1.CVE-2018-14424 use-after-free of disposed transient displays

8d9K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8D9j5h3u0Q4x3X3g2Y4L8X3!0E0k6g2)9J5k6h3!0J5k6#2)9J5c8V1N6z5e0@1#2q4i4K6u0r3k6$3c8E0i4K6u0r3K9i4y4K6N6h3g2K6i4K6u0r3y4o6l9I4

2.GDM源代码

da8K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6s2e0V1!0y4c8g2)9J5c8X3N6V1L8b7`.`.

3.GDM安装

05cK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3I4A6L8Y4g2^5k6Y4u0G2L8i4y4U0M7X3q4@1j5$3S2Q4x3X3g2G2M7X3N6Q4x3V1k6T1L8r3k6K6i4K6u0r3N6X3W2W2N6#2)9J5c8Y4y4&6M7%4c8W2L8h3c8Q4x3V1k6Y4L8X3!0E0k6g2)9J5c8X3N6V1L8g2)9J5k6h3S2@1L8h3H3`.

4.dbus实例讲解(一):初次见面

cf0K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3k6E0k6r3c8D9L8i4W2&6i4K6u0W2j5$3&6Q4x3V1k6@1k6i4S2@1y4o6W2Q4x3X3g2Z5N6r3#2D9

5.dbus实例讲解(二)

1f6K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3k6E0k6r3c8D9L8i4W2&6i4K6u0W2j5$3&6Q4x3V1k6@1k6i4S2@1y4e0q4Q4x3X3g2Z5N6r3#2D9

6.dbus实例讲解(二上):消息和消息总线

b61K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3k6E0k6r3c8D9L8i4W2&6i4K6u0W2j5$3&6Q4x3V1k6@1k6i4S2@1y4e0u0Q4x3X3g2Z5N6r3#2D9


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (1)
雪    币: 1327
活跃值: (64)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
great!
2018-8-22 22:56
0
游客
登录 | 注册 方可回帖
返回