Android静态安全检查(一):组件暴露

Android四大组件简介

Android应用有四大组件Activity、Service服务、Content Provider内容提供者和Broadcast Receiver广播接收器。

  • Activity:在应用程序中,每个Activity通常就是一个单独的屏幕,显示控件并处理用户的响应事件,每一个看到的应用界面都是一个Activity。
  • Service:一个Service是以长生命周期的,没有用户界面的程序,可以用来开发后台服务或者监控类的程序。例如,当音乐播放器退出用户界面之后,还需要继续播放,通常会使用Context.startService()来启动一个后台服务,来保持音乐的持续播放。
  • Content Provider:每个应用程序都会有些数据存储,存储方式一般有5种(Android应用五种数据存储方式),Content Provider使一个应用程序的指定数据集提供给其他应用程序,例如通讯录、信息和通话记录等。
  • Broadcast Receiver:应用可以使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice 来响应它们收到的信息,或者用NotificationManager 来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。

组件暴露漏洞原理

应用程私有组件只能被当前应用启动,不能被其他应用启动相对是安全的。

当一个应用程序的组件暴露,就可以被第三方的应用任意调用,可能导致敏感信息泄露、拒绝服务、权限提升绕过,界面劫持、远程代码执行等安全漏洞。

简单举个例子, 查看如下代码,假设暴露的activity通过Bundle传输数据,如果第三方的应用启动这个暴露的组件,传入一个错误的数值,这个类就会抛出异常。

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        int key = savedInstanceState.getInt("key");
    }

组件暴露漏洞检测规则

每一个组件在Manifest.xml定义,都有一个android:exported属性,满足以下两种情况都认为是有组件暴露漏洞

  • 显式设置exported属性为true
  • 没有显式设定exported值,但组件下面有intent filter,这样组件exported默认值也为true

漏洞修复建议

  1. 显式设置设置exported属性为false,不提供暴露的组件。
  2. 如果实在需要提供暴露的组件,不在暴露的组件中操作敏感信息。
  3. 不管是private组件还是public组件,不返回敏感信息,谨慎处理接收的intent。

猜你喜欢

转载自blog.csdn.net/u010889616/article/details/80946925