FCIS 2023白帽论坛议题:国产操作系统漏洞研究(阮奂斌)
国产操作系统的漏洞研究
国产操作系统总线服务与应用安全的研究
By 阮奂斌
自我介绍
About Me
id:doudoudedi
IoT漏洞挖掘
CTF 业余爱好者
二进制安全研究者
01 研究动机
02 目标选择
03 系统初探
04 提权与RCE
研究动机
好奇与机遇
• 大概是在2022年的某一个月,我同事参加了虎符CTF,并且进入了线下赛赛制是
• PKS (针对麒麟操作系统安全机制绕过)有一些挑战需要权限提升
• AWDP (CTFer 应该比较熟悉 )
• 针对国产操作系统的安全性研究的师傅好像不多,但是它同样有研究的价值
• 我想在这次研究中提高自身能力
• 提高自己的代码审计能力
• 检验逆向能力能否支撑起我的代码审计
• 发现漏洞,后续利用的能力
目标选择
国产操作系统(我主要研究了前两者)
银河麒麟(KylinOS)原是在“863计划”和国家核高基科技重大专项支持下,国防科技大学研发的操作系统。
UOS 由深度操作系统为基础,经过定制而来的产品。考虑到后者是基于 Linux 的国产操作系统的一员。
华为鸿蒙系统(HUAWEI Harmony OS),是华为公司在2019年8月9日于东莞举行的华为开发者大会(HDC.2019)上正式发布的操作系统。
系统初探
银河麒麟操作系统
• 目标系统镜像:Kylin-Desktop-V10-Release-2203-x86_64
• 操作环境:Vmware Workstation(有条件的同学可以用真机)
一路安装我成功启动了麒麟操作系统
安装与系统
经过系列操作系统我发现,这款桌面级的操作系统底层是linux,类似于debian,可以执行apt等命令(PWN手狂喜)
相较与正常的开源ubuntu,多了很多麒麟生态的软件。
内核: Linux
文件系统:ext4
查阅漏洞报告
• 研究第一步永远都是查资料,于是我开始查阅此款操作系统的历史漏洞与漏洞报告,不知是不是国产的原因,网上的信息寥寥无几
https://www.kylinos.cn/support/loophole/patch.html
https://www.ubuntukylin.com/patch/
官方网站上基本都是只公开漏洞,没有详细情报,但是找到一篇博客关于hfctf的PKS绕过,阐述的十分详细,可以作为研究借鉴
• https://xuanxuanblingbling.github.io/ctf/pwn/2021/04/29/pk/
作者最终是依靠root进程中命令注入导致权限提升,成功执行恶意程序,尝试去复现失败,由于打码以及文章日期的关系,最后猜测漏洞已经被官方修复。
低版本CVE成功提权
换一种思路,既然系统基于linux,我用linux的提权洞打kylinOS会成功么?经过尝试在低版本的kylinOS上提权了
使用CVE-2021-4034尝试对麒麟操作系统(kylinOS-2021版本)提权,发现是可以的 但是我需要攻破的是最新版本,它修复了此CVE,但是它给了我信心,依然相信还有其它方法可以导致提权
于是同事与我们把关注点放到了麒麟系统的Dbus
系统研究
Dbus简介
D-Bus 分为两个主要的总线:
系统总线(System Bus):用于系统级的服务,比如硬件状态改变或者系统守护进程。
会话总线(Session Bus):用于用户会话内的进程通信,通常是一个用户登录会话中运行的应用程序间的通信。
D-Bus 的设计遵循最小的原则,只提供必要的功能,以降低开销并保持接口简洁。它在Linux系统中被广泛应用,是现代Linux桌面环境和系统服务的核心组件之一。
KylinOS特有的Dbus服务
如果服务被注册进Dbus系统总线那么在 /etc/dbus-1/system.d/会存在对应的文件,我尝试列出kylinOS的此目录进行查看发现了一些有趣的服务,麒麟系统的开发者似乎自己开发一些服务注册到了Dbus总线上
安装测试工具d-feet列出所有的会话总线与系统总线,相对于会话总线我们应该对系统总线更加感兴趣,因为那意味这进程的权限更高,然后尝试过滤kylinOS特有的总线服务
Dbus服务的Interface与Method
在测试Dbus总线中的服务时,我们要关注的是对象路径、interface、method。
Interface(接口)接口定义了一组可以调用的方法(以及发出的信号和可
以访问的属性)。
Method(方法)方法是在接口中定义的操作,它可以被调用来执行特定
的任务
简单来讲Method就是功能的实现
Dbus通信数据
由于Dbus是为应用程序与服务间通信服务的,所以底层并不是使用的传统的TCP/IP流量,而是本地的进程通信的协议(IPC)。
它使用的通信方式不依赖于网络协议,而是依赖于本地系统上的消息总线。它允许不同进程之间通过消息来交换数据,而不需要
经过网络堆栈。最终我们使用bustle将通信的数据捕获并放入了wireshark进行分析
Dbus协议的结构
endianness 机器的大小端信息
Methcall 指明D-Bus消息的类型。在这个例子中,是“Method call”(方法调用),表示客户端正在请求服务执行一个操作。
Message Flags 提供消息的详细信息,如是否期望回复。
Protocol Version 正在使用的D-Bus协议的版本。
Message Body Length 消息体的字节长度。
Message Serial 消息的唯一标识符。
Header Field Array 消息的详细信息
Body 消息的正文
Dbus通信协议结构
Dbus通信协议的结构中比较重要的两个地方是,消息的详细信息与消息的正文(这段流量是麒麟系统的软件商店中安装“华宇拼音”产生的)
Dbus通信协议的Header Field Array
Path(路径):方法调用的目的地路径。
Destination(目的地):消息发送到的服务的唯一名称。
Interface(接口):方法调用所属的接口。
Member(成员):正在被调用的特定方法。
Signature(签名):方法参数的数据类型签名。
Sender(发送者):消息发送者的唯一名称。
Dbus通信协议的Body,消息中发送的实际数据。包含方法调用的参数。客户端发送的数据
KylinOS特有的Dbus服务
再举个列子:
当我们打开麒麟的安全中心开启或者关闭一些保护,那么软件就会向Dbus系统总线中已经注册服务的接口的对应Method发送信息
监听安全中心应用与Dbus总线的传递的数据
KylinOS特有的Dbus服务
通过系统应用向Dbus的系统总线服务中发送消息是正常流程,但如果需要测试系统总线中的服务,那么最好是使用过三方工具或者代码的方式进行发送消息。
使用python脚本的形式
使用d-feet工具
关于Dbus的历史漏洞
一番寻找与搜索,找到一些Dbus相关的漏洞
CVE-2021-3560漏洞存在于系统服务Polkit中,同时因为Polkit被Systemd所调用,因此所有默认安装了Systemd的Linux发行版都会使用Polkit。该漏洞的成因是执行dbus-send命令后在认证完成前强制终止引发错误,而Polkit未正确处理错误而导致允许无特权的用户添加一个sudo用户进行权限提升。)
USBCreator D-Bus漏洞(攻击者利用该漏洞可以绕过sudo的密码安全策略以sudoer组用户权限访问。漏洞允许攻击者以root权限用任意内容覆写任意文件。)
读完详细文章后大概对dbus相关漏洞可能出现的攻击面点有了一定的了解,尝试对麒麟系统特有的Dbus总线服务进行漏洞挖掘
系统研究
未授权访问? 提权 我们将注册进Dbus系统总线的服务对应的二进制文件与python源文件列出 与取出,然后进行代码审计
于是我们发现在银河麒麟操作系统中存在一些服务,比如kysec,应用中心, 系统更新等系统级的服务被注册到系统总线上,但是其功能实现并没有做完 整的鉴权,导致普通用户可以去调用系统级的服务,这将导致权限提升等系 列影响。
比如:在控制中心相关的Dbus系统总线服务它的接口中的设置默认登入功 能方法没有做鉴权,普通用户可以将root用户设置为默认登入且不需要密码
未授权访问?命令注入?提权!
在银河麒麟2203的操作系统中的更新管理服务以python-dbus方式注册到了
Dbus系统总线中,但是安装本地snap包的方法没有鉴权,且存在命令注入,这将导致权限提升。于是通过此漏洞完成了比赛的挑战。
这里最终提权使用的是用命令篡改/etc/sudoer,来使用sudo提权接口替换为存在漏洞的接口,然后执行存在漏洞的method即可触发
关于漏洞的思考与总结
在发现漏洞与漏洞完成利用之后,我们发现总的来说kylinOS与UOS自研Dbus总线服务大
致分有三种开发框架
python-dbus
QtDbus
go(https://github.com/linuxdeepin/go-dbus-factory/)
kylin_OS中python-dbus kylin_OS中的QtDbus
通过d-feet向服务发送消息
提权
关于漏洞的思考与总结
使用Qt注册Dbus服务流程分析
使用QtDbus处理客户端请求的流程
就只有这一些接口存在漏洞么?
系统的Dbus总线服务的之后的测试过程中,发现手动测试过于繁琐,而底层Dbus又是支持python调用的所以开始编写工具对国产操作系统的Dbus总线进行fuzz,测试了如下系统:
UbuntuKylin
银河麒麟V10-2107
银河麒麟V10-2203
UOS
通过手动与fuzz配合我们发现了更多的漏洞关于kylinOS与UOS
kylinOS_2107的Dbus总线中kysec服务提权
统信桌面操作系统专业版、教育版、家庭版、社区版存在Dbus接口问题普通用户可以安装恶意deb导致权限提升
寻找可RCE的服务
既然能够提权,必然随之而来的就是去挖掘远程命令执行漏洞,我首先关注的是kylinOS的默认启动服务kyseclogd。很快就fuzz出了崩溃,人工审计开始介入,经过人工审计发现是由于内存越界导致的,是bss段数组越界,发现可以将内存泄露到log文件中,但是无法控制PC寄存器。
麒麟传书RCE
于是将目标放到麒麟生态的程序上,我将目标确定到“麒麟传书”,我开起了两台银河麒麟系统,然后2个用户互相发送者信息。经过一番测试发现了一处命令执行漏洞
麒麟传书RCE
人工审计再次介入,我发现了程序是基于Qt开发的,底层走的是TCP与UDP发送数据,通过gdb等调试工具我定位到了漏洞触发的地方, 对其抓包,使用wireshark捕获了TCP流量,然后使用socket或者pwn等模块脚本构造恶意TCP流量达到了远程命令执行(由于可以匿名发送消息所以漏洞是无需认证的)
麒麟传书(漏洞二)
“麒麟传书”在发送文件以及消息后再查找历史记录的功能中,一旦记录中有存在带有恶意命令的恶意文件,便可能主动触发命令的执行。
如果用户接收到了恶意文件并点击历史记录就会主动触发命令执行
以上便可以形成一条利用链从RCE到提权,同时上面提及的漏洞官方大部分都已经修补(未修复的漏洞请不要进行非法利用)
漏洞公开信息
综上所诉,我们在对国产桌面级的操作系统的Dbus总线服务与应用程序进行了安全测试,总结如下两点:
国产操作系统的自研的Dbus系统总线服务存在安全隐患
国产操作系统的生态软件可能被用于攻击利用
国产操作系统总线服务与应用安全的研究
By 阮奂斌
自我介绍
About Me
id:doudoudedi
IoT漏洞挖掘
CTF 业余爱好者
二进制安全研究者
01 研究动机
02 目标选择
03 系统初探
04 提权与RCE
研究动机
好奇与机遇
• 大概是在2022年的某一个月,我同事参加了虎符CTF,并且进入了线下赛赛制是
• PKS (针对麒麟操作系统安全机制绕过)有一些挑战需要权限提升
• AWDP (CTFer 应该比较熟悉 )
• 针对国产操作系统的安全性研究的师傅好像不多,但是它同样有研究的价值
• 我想在这次研究中提高自身能力
• 提高自己的代码审计能力
• 检验逆向能力能否支撑起我的代码审计
• 发现漏洞,后续利用的能力
目标选择
国产操作系统(我主要研究了前两者)
银河麒麟(KylinOS)原是在“863计划”和国家核高基科技重大专项支持下,国防科技大学研发的操作系统。
UOS 由深度操作系统为基础,经过定制而来的产品。考虑到后者是基于 Linux 的国产操作系统的一员。
华为鸿蒙系统(HUAWEI Harmony OS),是华为公司在2019年8月9日于东莞举行的华为开发者大会(HDC.2019)上正式发布的操作系统。
系统初探
银河麒麟操作系统
• 目标系统镜像:Kylin-Desktop-V10-Release-2203-x86_64
• 操作环境:Vmware Workstation(有条件的同学可以用真机)
一路安装我成功启动了麒麟操作系统
安装与系统
经过系列操作系统我发现,这款桌面级的操作系统底层是linux,类似于debian,可以执行apt等命令(PWN手狂喜)
相较与正常的开源ubuntu,多了很多麒麟生态的软件。
内核: Linux
文件系统:ext4
查阅漏洞报告
• 研究第一步永远都是查资料,于是我开始查阅此款操作系统的历史漏洞与漏洞报告,不知是不是国产的原因,网上的信息寥寥无几
https://www.kylinos.cn/support/loophole/patch.html
https://www.ubuntukylin.com/patch/
官方网站上基本都是只公开漏洞,没有详细情报,但是找到一篇博客关于hfctf的PKS绕过,阐述的十分详细,可以作为研究借鉴
• https://xuanxuanblingbling.github.io/ctf/pwn/2021/04/29/pk/
作者最终是依靠root进程中命令注入导致权限提升,成功执行恶意程序,尝试去复现失败,由于打码以及文章日期的关系,最后猜测漏洞已经被官方修复。
低版本CVE成功提权
换一种思路,既然系统基于linux,我用linux的提权洞打kylinOS会成功么?经过尝试在低版本的kylinOS上提权了
使用CVE-2021-4034尝试对麒麟操作系统(kylinOS-2021版本)提权,发现是可以的 但是我需要攻破的是最新版本,它修复了此CVE,但是它给了我信心,依然相信还有其它方法可以导致提权
于是同事与我们把关注点放到了麒麟系统的Dbus
系统研究
Dbus简介
D-Bus 分为两个主要的总线:
系统总线(System Bus):用于系统级的服务,比如硬件状态改变或者系统守护进程。
会话总线(Session Bus):用于用户会话内的进程通信,通常是一个用户登录会话中运行的应用程序间的通信。
D-Bus 的设计遵循最小的原则,只提供必要的功能,以降低开销并保持接口简洁。它在Linux系统中被广泛应用,是现代Linux桌面环境和系统服务的核心组件之一。
KylinOS特有的Dbus服务
如果服务被注册进Dbus系统总线那么在 /etc/dbus-1/system.d/会存在对应的文件,我尝试列出kylinOS的此目录进行查看发现了一些有趣的服务,麒麟系统的开发者似乎自己开发一些服务注册到了Dbus总线上
安装测试工具d-feet列出所有的会话总线与系统总线,相对于会话总线我们应该对系统总线更加感兴趣,因为那意味这进程的权限更高,然后尝试过滤kylinOS特有的总线服务
Dbus服务的Interface与Method
在测试Dbus总线中的服务时,我们要关注的是对象路径、interface、method。
Interface(接口)接口定义了一组可以调用的方法(以及发出的信号和可
以访问的属性)。
Method(方法)方法是在接口中定义的操作,它可以被调用来执行特定
的任务
简单来讲Method就是功能的实现
Dbus通信数据
由于Dbus是为应用程序与服务间通信服务的,所以底层并不是使用的传统的TCP/IP流量,而是本地的进程通信的协议(IPC)。
它使用的通信方式不依赖于网络协议,而是依赖于本地系统上的消息总线。它允许不同进程之间通过消息来交换数据,而不需要
经过网络堆栈。最终我们使用bustle将通信的数据捕获并放入了wireshark进行分析
Dbus协议的结构
endianness 机器的大小端信息
Methcall 指明D-Bus消息的类型。在这个例子中,是“Method call”(方法调用),表示客户端正在请求服务执行一个操作。
Message Flags 提供消息的详细信息,如是否期望回复。
Protocol Version 正在使用的D-Bus协议的版本。
Message Body Length 消息体的字节长度。
Message Serial 消息的唯一标识符。
Header Field Array 消息的详细信息
Body 消息的正文
Dbus通信协议结构
Dbus通信协议的结构中比较重要的两个地方是,消息的详细信息与消息的正文(这段流量是麒麟系统的软件商店中安装“华宇拼音”产生的)
Dbus通信协议的Header Field Array
Path(路径):方法调用的目的地路径。
Destination(目的地):消息发送到的服务的唯一名称。
Interface(接口):方法调用所属的接口。
Member(成员):正在被调用的特定方法。
Signature(签名):方法参数的数据类型签名。
Sender(发送者):消息发送者的唯一名称。
Dbus通信协议的Body,消息中发送的实际数据。包含方法调用的参数。客户端发送的数据
KylinOS特有的Dbus服务
再举个列子:
当我们打开麒麟的安全中心开启或者关闭一些保护,那么软件就会向Dbus系统总线中已经注册服务的接口的对应Method发送信息
监听安全中心应用与Dbus总线的传递的数据
KylinOS特有的Dbus服务
通过系统应用向Dbus的系统总线服务中发送消息是正常流程,但如果需要测试系统总线中的服务,那么最好是使用过三方工具或者代码的方式进行发送消息。
使用python脚本的形式
使用d-feet工具
关于Dbus的历史漏洞
一番寻找与搜索,找到一些Dbus相关的漏洞
CVE-2021-3560漏洞存在于系统服务Polkit中,同时因为Polkit被Systemd所调用,因此所有默认安装了Systemd的Linux发行版都会使用Polkit。该漏洞的成因是执行dbus-send命令后在认证完成前强制终止引发错误,而Polkit未正确处理错误而导致允许无特权的用户添加一个sudo用户进行权限提升。)
USBCreator D-Bus漏洞(攻击者利用该漏洞可以绕过sudo的密码安全策略以sudoer组用户权限访问。漏洞允许攻击者以root权限用任意内容覆写任意文件。)
读完详细文章后大概对dbus相关漏洞可能出现的攻击面点有了一定的了解,尝试对麒麟系统特有的Dbus总线服务进行漏洞挖掘
系统研究
未授权访问? 提权 我们将注册进Dbus系统总线的服务对应的二进制文件与python源文件列出 与取出,然后进行代码审计
于是我们发现在银河麒麟操作系统中存在一些服务,比如kysec,应用中心, 系统更新等系统级的服务被注册到系统总线上,但是其功能实现并没有做完 整的鉴权,导致普通用户可以去调用系统级的服务,这将导致权限提升等系 列影响。
比如:在控制中心相关的Dbus系统总线服务它的接口中的设置默认登入功 能方法没有做鉴权,普通用户可以将root用户设置为默认登入且不需要密码
未授权访问?命令注入?提权!
在银河麒麟2203的操作系统中的更新管理服务以python-dbus方式注册到了
Dbus系统总线中,但是安装本地snap包的方法没有鉴权,且存在命令注入,这将导致权限提升。于是通过此漏洞完成了比赛的挑战。
这里最终提权使用的是用命令篡改/etc/sudoer,来使用sudo提权接口替换为存在漏洞的接口,然后执行存在漏洞的method即可触发
关于漏洞的思考与总结
在发现漏洞与漏洞完成利用之后,我们发现总的来说kylinOS与UOS自研Dbus总线服务大
致分有三种开发框架
python-dbus
QtDbus
go(https://github.com/linuxdeepin/go-dbus-factory/)
kylin_OS中python-dbus kylin_OS中的QtDbus
通过d-feet向服务发送消息
提权
关于漏洞的思考与总结
使用Qt注册Dbus服务流程分析
使用QtDbus处理客户端请求的流程
就只有这一些接口存在漏洞么?
系统的Dbus总线服务的之后的测试过程中,发现手动测试过于繁琐,而底层Dbus又是支持python调用的所以开始编写工具对国产操作系统的Dbus总线进行fuzz,测试了如下系统:
UbuntuKylin
银河麒麟V10-2107
银河麒麟V10-2203
UOS
通过手动与fuzz配合我们发现了更多的漏洞关于kylinOS与UOS
kylinOS_2107的Dbus总线中kysec服务提权
统信桌面操作系统专业版、教育版、家庭版、社区版存在Dbus接口问题普通用户可以安装恶意deb导致权限提升
寻找可RCE的服务
既然能够提权,必然随之而来的就是去挖掘远程命令执行漏洞,我首先关注的是kylinOS的默认启动服务kyseclogd。很快就fuzz出了崩溃,人工审计开始介入,经过人工审计发现是由于内存越界导致的,是bss段数组越界,发现可以将内存泄露到log文件中,但是无法控制PC寄存器。
麒麟传书RCE
于是将目标放到麒麟生态的程序上,我将目标确定到“麒麟传书”,我开起了两台银河麒麟系统,然后2个用户互相发送者信息。经过一番测试发现了一处命令执行漏洞
麒麟传书RCE
人工审计再次介入,我发现了程序是基于Qt开发的,底层走的是TCP与UDP发送数据,通过gdb等调试工具我定位到了漏洞触发的地方, 对其抓包,使用wireshark捕获了TCP流量,然后使用socket或者pwn等模块脚本构造恶意TCP流量达到了远程命令执行(由于可以匿名发送消息所以漏洞是无需认证的)
麒麟传书(漏洞二)
“麒麟传书”在发送文件以及消息后再查找历史记录的功能中,一旦记录中有存在带有恶意命令的恶意文件,便可能主动触发命令的执行。
如果用户接收到了恶意文件并点击历史记录就会主动触发命令执行
以上便可以形成一条利用链从RCE到提权,同时上面提及的漏洞官方大部分都已经修补(未修复的漏洞请不要进行非法利用)
漏洞公开信息
综上所诉,我们在对国产桌面级的操作系统的Dbus总线服务与应用程序进行了安全测试,总结如下两点:
国产操作系统的自研的Dbus系统总线服务存在安全隐患
国产操作系统的生态软件可能被用于攻击利用
评论0次