[CVE-2019-16253] [Samsung] [SMT] SamsungTTSService导出存在任意私有组件调用提权漏洞

Date
Version
Description
Author

2019.12.27

1.0

完整的漏洞分析

wnagzihxa1n

0x00 漏洞概述

0x01 触发条件

上线时间
应用名
包名
软件版本
MD5
下载链接

SamsungSMT

com.samsung.SMT

0x02 PoC

0x03 前置知识

0x04 Root Cause

三星的手机系统里有一个叫SamsungSMT的应用

它有一个导出组件com.samsung.SMT.SamsungTTSService,其onCreate()方法里动态注册了一个BroadcastReceiver,我们知道这默认是导出的

public void onCreate() {
    ...
    
    LangPackMgr.get().a(this.getApplicationContext());  // 入口
    
    ...
    
    super.onCreate();
}

public void a(Context context) {
    if(this.context == null) {
        ...
        
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.samsung.SMT.ACTION_INSTALL_FINISHED");
        this.context.registerReceiver(this.LangPackMgr$2, intentFilter);  // 注册一个广播接收器:"com.samsung.SMT.ACTION_INSTALL_FINISHED"
        
        ...
    }
}

注册的LangPackMgr$2会将传入的Intent内两个数据作为参数构造一个LangPackMgr$UpdateEngineInfo对象,然后加到一个队列里,经过一系列判断,开始更新

使用多线程来执行,在线程里我们看到一个reloadEngine()方法

跟入可以看到直接使用System.load()加载了v0_2指向的路径,那么l.a().k()返回的是什么呢?

我们看reloadEngine()上两句代码,这里说的是如果版本号高于本地数据,就进入if逻辑处理,可以看到,最后将Intent内"SMT_ENGINE_PATH"的数据写到本地SP文件的"SMT_INSTALLED_ENGINE_PATH"字段

再来看l.a().k(),可以看到返回值就是"SMT_ENGINE_PATH"指向的数据,这个数据我们可控,修改Intent即可

这时我们来看com.samsung.SMT.SamsungTTSService注册的另一个BroadcastReceiver

广播接收器LangPackMgr$1会判断新安装应用的包名是否是"com.samsung.SMT.lang"开头,如果是,就调用函数a.d()

经过若干次的调用

启动一个线程

对应的实现,通过搜索安装的应用来过滤出指定前缀的包名,然后启动Service

关键代码,意味着我们的Poc需要有一个Service,以包名作为intent-filter

接下来结合flanker_hqd的Exp来解析

  • https://github.com/flankerhqd/vendor-android-cves

我们可以看到上面在监控到有以com.samsung.SMT.lang为包名前缀的应用安装时,会启动安装应用一个Service,指定Action为包名,所以我们需要注册一个Service,Service的Action为包名

在我们的Service里,可以执行发送Intent的操作,这个Intent就会被广播接收器LangPackMgr$2接收到,进而调用System.load(),最后完成提权操作

关于这个漏洞的反思:

  • 如果给我一个三星手机,我能不能发现这个漏洞呢?

  • 结合这个漏洞,能不能发现同类型的,自动化扫描攻击入口?

我觉得是可以的:

  1. 我们先把APK的代码逻辑梳理出来,能通过控制流或合数据流分析,开源工具FlowDroid等都可以做到

  2. 搜索所有的组件入口,指定关键的函数,比如startActivity(),System.load()

  3. 需要处理一些细节问题,比如开启多线程,需要将多线程的实现结合进来,还有异步任务,接口类方法,抽象方法等

  4. 动态注册的广播接收器是默认导出的,也需要单独考虑

0x05 调试与利用

0x06 漏洞研究

0x07 References

附录:调试过程记录

Last updated