文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

从逆向角度看证书覆盖安装漏洞

2024-12-03 16:56

关注

首先我们来了解下证书覆盖安装漏洞,此漏洞是2020年Google官方公布的漏洞之一,其编号为CVE-2020-0015,这个漏洞主要形成原因是由于本地安装证书被覆盖所造成的特权提升漏洞,在文中我会从逆向的角度去分析证书的安装流程,分析漏洞存在的位置以及形成的原因。在分析过程中会把代码进行截图,尽可能覆盖其中的所有关键代码,避免本文阅读者在阅读过程中再去反编译查看代码。

[[353026]]

漏洞介绍

证书覆盖安装漏洞主要体现在统导入证书的时候,而导入证书这部分功能是由系统中的CertInstaller.apk进行完成。而在用中并未做安全性校验,导致导入证书界面可以被覆盖,由于证书安装是由系统应用完成的,所以当安装界面被覆盖后,就变向的达到了特权提升的目的。根据官方说明该漏洞是存在全系统版本中的,而官方只修复了Android-8.0、Android-8.1、Android-9、 Android-10系统版本,下面通过代码分析此漏洞形成的原因。

分析流程

首先我们通过ADB命令从手机中将CertInstaller.apk文件提取到本地,CertInstaller.apk在系统中的/system/app/CertInstaller/目录下。拿到APK文件后我们再使用jadx、jeb等工具反编译APK文件。那么我们就通过ADB命令将/system/app/CertInstaller/CertInstaller.apk拷贝到本地,使用jadx、jeb等反编译工具将apk反编译。

首先我们先看下反编译后的AndroidManifest.xml文件。


从AndroidManifest.xml文件可以看出来主要入口在CertInstallerMain中,因为是activity,所以我们从onCreate函数开始分析:

代码位置:com/android/certinstaller/CertInstallerMain.java


从上面代码中可以看到,首先获取intent对象并对其中携带的数据进行判断,主要有三种情况:

intent未携带任何数据,或者从sdcard上选择证书文件进行安装,也就是在系统设置中选择从存储设备安装证书,如下图:


Intent携带了证书内容,就直接创建Intent 启动CertInstaller进行证书安装,例如:

通过action 列举出已安装的证书列表

从上面三部分来看,无论分析第一种情况还是第二种,都可以到达证书安装的位置,那我们主要分析的是第二种情况, 创建一个intent用于启动CertInstaller activity,并将携带又证书内容得Intent以参数得形式传递过去。

下面继续看:

代码位置:com/android/certinstaller/CertInstaller.java

 

从代码可以看出来证书安装过程基本都是依赖于CredentialHelper 类完成的,首先掉用createCredentialHelper函数创建了一个CredentialHelper 实例,

从上面代码可以看出来,在创建CredentialHelper 实例的同时,还做了证书解析操作,这里主要看parseCert(byte[] bytes)函数,其中根据证书的不同会将证书缓存到mCaCerts或mUserCert列表中。然后继续分析CertInstaller的OnCreate函数,继续往下看对当前的环境进行校验,其中keyguardManager.createConfirmDeviceCredentialIntent(null, null); 是检查是否设置信任凭证。然后会调用到extractPkcs12OrInstall函数。

PKCS12文件一般由密码保护,所以需要弹出一个密码输入框,用于输入密码。而正常抓包设置代理证书或者安装CA证书的时候就会走到 else里面。继续分析代码。


在这里可以看到InstallOthersAction中的run方法实际就是调用的CertInstaller.installOther函数;


这可以看到是安装证书之前先做了一个校验,坚查是否有CA证书,或者私有与用户证书,然后会调用nameCredential()函数,会调用showDialog()弹窗安装证书。这也就是漏洞产生的位置。而漏洞形成的原因就是在弹窗的位置因为没有对系统的dialog弹窗进行安全防护,导致dialog可以被劫持覆盖,这也是该漏洞的主要成因。

漏洞利用

由于设备环境原因,只在低版本测试,未在修复后的高版本手机进行测试。

下面看下代码:

这里为了方便直接创建了一个线程进行监听,也可以在service中实现。

为线程创建runnabl任务,判断当前运行的应用包名,如果为com.android.certinstaller,则启动一个伪装好的activity界面进行覆盖,这个activity界面设置为dialog显示。


代码中getTopPackage()是检测当前运行的应用程序是哪一个,然后在线程中判断如果是certInstaller应用的进程,就进行弹窗覆盖掉系统的dialog,伪造个假的证书安装界面,导致本地特权提升。


漏洞修复

下面是Google官方的修复方式。


从上图可以看到在CertInstaller.java代码的onCreate方法中添加了一个系统属性” SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS”,添加此属性的目的就是屏蔽掉其他APP的悬浮窗,避免系统界面恶意程序进行覆盖,这样就修复了该漏洞存在的风险,目前官方只在Android8-Android10系统修复了此漏洞。

总结

这个漏洞本质上就是劫持的漏洞,只是与常规的劫持有区别,常规的劫持是针对非系统应用,而证书覆盖安装漏洞是针对系统应用的漏洞。在修复后的系统上,如果恶意程序伪装成系统应用,依然可以对证书安装进行覆盖,漏洞仍然存在。

 

来源:FreeBuf内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯