内容纲要

PITracker: Detecting Android PendingIntent Vulnerabilities through Intent Flow Analysis

漏洞原理

概述

PendingIntent:一个应用程序A可以构造一个PendingIntent并传递给另一个应用程序B。当一个特定的动作被触发时,B可以触发这个PendingIntent来启动A的组件。通过给另一个应用程序一个PendingIntent,就授予了它执行你指定操作的权利,同时具有了相同的权限和身份。因此,恶意软件能够通过PendingIntent授予的权限来执行恶意行为。

原理

image-20220811135933955

  1. 通过PendingIntent.getactivity(), PendingIntent.getbroadcast(), PendingIntent.getservice(), PendingIntent.getforegroundservice() 获取一个PendingIntent对象。AMS会在记录表中查找这个PendingIntent。如果这个PendingIntent已经存在,AMS将把它的代理对象给发起方。如果AMS找不到这个PendingIntent,它将创建一个新的PendingIntent。在工作表中记录这个新的PendingIntent后,它的代理对象将被传递给发起端。
  2. 然后PendingIntent对象将被传递给另一个组件,即处理端。
  3. 当一个特定的动作(点击,等待几秒等行为)被触发时,处理端可以使用PendingIntent.send()来触发这个PendingIntent。AMS会在工作表中找到这个PendingIntent并触发它。
send(Context context, int code, Intent intent, PendingIntent. OnFinished onFinished, Handler handler, String requiredPermission, Bundle options)

之后,调用的intent将会被Intent类的fillIn()方法解析。

public int fillIn(NonNull Intent other, FillInFlags int flags) {
    ...
    // 当原有的action为空或者flag设置为FULL_IN_ACTION,原有的action将会被修改为传入intent的action
    if (other.mAction != null && (mAction == null || (flags & FILL_IN_ACTION) != 0)){
        mAction = other.mAction;
        changes |= FILL_IN_ACTION;
    }
    //package, category, data, flag, clipdata and extra同理

    ...

    // component组件只能在flag设置为FILL_IN_COMPONENT时改变(无论原有的component是否为空)
    if ( other.mComponent != null && (flags & FILL_IN_COMPONENT) != 0) {
        mComponent = other.mComponent;
        changes |= FILL_IN_COMPONENT;
    }
}

因此,当intent的action等字段没有被设置时,即可以被恶意软件随意被修改。

API 23后加入了FLAG_IMMUTABLE标志,在创建PendingIntent时设置后,intent的原有属性则不能进行更改。

总结

匹配漏洞点的三个特征:

  1. 能够被修改的字段没有被设置;
  2. PendingIntent的对象能够被其他app获取;
  3. 标志位FLAG_IMMUTABLE没有被设置。

工具

image-20220811144002287

主要流程:

  1. dex文件字节码转为smali
  2. 关键信息查找

​ 查看PendingIntent的intent是否有字段设置方法(setAction(), setPackage(), setData()......)

​ 查看FLAG_IMMUTABLE是否被设置

​ 查看该Intent是否可以被其他APP调用

​ 常见的两种情况:

​ ① Implicit Intent;

​ ② 包含在notification的pendingintent,则能够被继承自notificationlistenerServiceaccessibilityService

​ service组件获取。