App安全测试之Android应用安全测试汇总

执行步骤

1、使用drozer命令扫描run scanner.provider.traversal -a com.mwr.example.sieve

2、扫描结果中存在Vulnerable Providers说明存在文件遍历风险。

预期结果:不存在文件遍历漏洞。

整改建议:系统对在调用文件参数时添加防御。

8、Service组件测试

Service组件越权漏洞

安全风险:攻击者可以发送恶意的消息,控制Service执行恶意动作或者造成信息泄露。

执行步骤

1、使用drozer命令 run app.service.info -a xxxx查看service组件暴露。

2、通过定位的service,找到应用程序定义的在接收到消息时的各项参数以及各种处理逻辑。

3、查看业务逻辑寻找是否能够直接调用Service组件,能否能进行越权操作。如果可以风险存在,停止测试,记录漏洞。

预期结果:系统为Service组件分配了适当权限。

整改建议:

  • AndroidManifest.xml文件的各receiver标签中,设置android:exported="false";
  • 或者在AndroidManifest.xml中,申明一个私有权限,级别为signature;
  • 只被应用本身使用的service应设置为私有;
  • 尽量不发送敏感信息,在service接收到的数据需需谨慎处理,对调用的接口做校验;

空广播造成Service组件拒绝服务

安全风险:攻击者可以发送恶意的消息,控制Receiver执行恶意动作或者造成信息泄露。

执行步骤

1、查看AndroidManifest.xml文件,定位各Receiver,尤其是设置了android:exported="true"的。

2、尝试调用服务组件,run app.service.start --action 服务名 --component 包名 服务名,查看是否能够造成应用程序拒绝服务。

预期结果:系统为Service组件分配了适当权限。

整改建议: AndroidManifest.xml文件的各组件标签中,设置android:exported="false";组件接收消息代码中增加消息异常处理机制。

备注:其他类型的拒绝服务攻击参考SEC_AN_ PLUS_11.1 intent应用本地拒绝服务漏洞。

intent应用本地拒绝服务漏洞

安全风险

Android系统中提供了Intent机制来协助应用间的交互与通讯,例如:应用A发出一个intent信息,系统根据intent的描述,负责找到可以解析该intent消息的应用B。

B应用负责接收intent的组件,在解析intent数据时,会通过Intent的getXXXExtra()函数,如果解析为空数据、异常、或是畸形数据,就可能会导致程序崩溃。

执行步骤

1、攻击者向Intent传入自定义的序列化对象,被攻击者在组件里解析该序列化数据,可能出现出现找不到类出现ClassNotFoundException异常而崩溃。攻击代码如下:

Intent intent = new Intent();
intent.setAction("serializable_action");
intent.setClassName("com.my.test", "com.my.test.MainActivity");  // 指定攻击目标的包名和Activity入口
intent.putExtra("serializable_obj",XXX);    //此处是传入畸形数据
startActivity(intent);

2、数组越界 IndexOutOfBoundsException 异常导致的拒绝服务,如果程序没有对getIntegerArrayListExtra()等获取到的数据数组元素大小的判断,从而导致数组访问越界而导致应用崩溃;攻击应用代码片段:

Intent intent = new Intent();
intent.setClassName("com.alibaba.jaq.pocforrefuseservice", "com.alibaba.jaq.pocforrefuseservice.MainActivity");
ArrayList user_id = new ArrayList(); //定义数组
intent.putExtra("user_id", user_id);
startActivity(intent);
)
预期结果:在使用Intent获取数据时对异常做了充分的处理。

整改建议

建议处理通过Intent.getXXXExtra()获取的数据时进行以下判断,以及用try catch方式进行捕获所有异常,以防止应用出现拒绝服务漏洞:

  1. 空指针异常;
  2. 类型转换异常;
  3. 数组越界访问异常;
  4. 类未定义异常;
  5. 其他异常;

开放网络服务安全测试

安全风险

Android应用通常使用PF_UNIX、PF_INET、PF_NETLINK等不同域名的socket来进行本地进程间通信或者远程网络通信,这些socket暴漏了潜在的本地或远程攻击面,历史上也出现过不少利用socket进行拒绝服务、root提权或者远程命令执行的案例。

特别是PF_INET类型的网络socket,可以通过网络与Android应用通信,其原本用于linux环境下开放网络服务,由于缺乏对网络调用者身份或者本地调用者的安全检查机制,在实现不当的情况下,可以突破Android的沙箱限制,对被攻击的应用执行命令,导致比较严重的漏洞。

执行步骤

1、使用反编译工具打开应用,反编译出应用源码。

2、检测对收到socket数据是否进行处理,代码示例如下:


//定义读取socket命令
public static String readCMDFromSocket(InputStream in) {
        int MAX_BUFFER_BYTES = 2048;
        String msg = "";
        byte[] tempbuffer = new byte[MAX_BUFFER_BYTES];
        try {
            int numReadedBytes = in.read(tempbuffer, 0, tempbuffer.length);
            if( numReadedBytes > -1 )
                msg = new String(tempbuffer, 0, numReadedBytes, "utf-8");
            tempbuffer = null;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return msg;
    }
    ...
    //处理socket信息
    public void handlemsg()
    {
      ...
      msg = readCMDFromSocket(in)
      if ("exec" == msg)
      {
       //没有任何的socket命令校验
        ...
        ...
      }
      ...
    }

3、如果出现类似以上代码,未对接收到的socket和内容做任何校验检查,则风险存在。

预期结果:对socket数据内容进行校验。

整改建议:直接传递命令或者间接处理敏感信息时,避免使用socket实现。

运行其它可执行程序风险

安全风险

APP中使用了有运行其他程序的代码逻辑,如果执行的代码是第三方库中,可能会存在未知的恶意行为,如果是程序自身代码,若调用逻辑有缺陷可能会导致执行其他恶意的第三方程序,攻击者可能会利用该缺陷执行恶意代码。

执行步骤

1、使用反编译工具打开应用,反编译出应用源码。



留言