Android静态安全检测 -> Activity组件暴露

Activity组件暴露 - exported属性


一、android:exported


该属性用来标示,当前Activity是否可以被另一个Application的组件启动


1. true

表示允许被启动


2. false


【1】表示不允许被启动,这个Activity只会被当前Application或者拥有同样user ID的Application的组件调用


【2】关于user ID的参考链接


http://yelinsen.iteye.com/blog/977683


3. 默认值


【1】根据Activity中是否有intent filter标签来定

  -  没有intent filter - 默认值为false

     没有任何的filter意味着这个Activity只有在详细的描述了它的class name后才能被唤醒,这意味着这个Activity只能在应用内部使用,因为其它应用程序并不知道这个class的存在,所以在这种情况下,它的默认值是false


  -  有intent filter - 默认值为true

     如果Activity里面至少有一个filter的话,意味着这个Activity可以被其它应用从外部唤起,这个时候它的默认值是true


4. 权限控制


【1】不只有exported这个属性可以指定Activity是否暴露给其它应用,也可以使用permission来限制外部实体唤醒当前Activity


【2】android:permission  指定启动该Activity所需要的权限名称


5. 参考链接


http://blog.csdn.net/watermusicyes/article/details/46460347


二、触发条件


1. 定位AndroidManifest.xml文件中的Activity组件


【1】对应的特征:<activity


2. exported属性的判断


【1】android:permission 如果设置权限控制,就认为不存在安全风险


【2】exported属性设置为true

  显示设置android:exported="true"

  默认值为true,也就是具有intent filter标签,对应的特征:<intent-filter


3.主Activity(MainActivity)


【1】应用程序需要包含至少一个Activity组件来支持MAIN操作和LAUNCHER种类,即为主Activity

  对应的特征


【2】暴露的Activity组件不包括主Activity


三、漏洞原理


【1】导出的Activity组件可以被第三方APP任意调用,导致敏感信息泄露,并可能受到绕过认证、恶意代码注入等攻击风险


【2】详细的原理&POC



http://drops.wooyun.org/tips/3936


四、修复建议


【1】如果应用的Activity组件不必要导出,或者组件配置了intent filter标签,建议显示设置组件的“android:exported”属性为false


【2】如果组件必须要提供给外部应用使用,建议对组件进行权限控制

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是Test.java文件的代码: ``` public class Test { public static void main(String[] args) { Leaf leaf1 = new Leaf(); Leaf leaf2 = new Leaf(); } } class Root { static { System.out.println("Root的静态代码块"); } { System.out.println("Root的实例代码块"); } public Root() { System.out.println("Root的构造函数"); } } class Mid extends Root { static { System.out.println("Mid的静态代码块"); } { System.out.println("Mid的实例代码块"); } public Mid() { this("调用重载的构造器"); System.out.println("Mid的无参构造函数"); } public Mid(String s) { System.out.println("Mid的带参构造函数:" + s); } } class Leaf extends Mid { static { System.out.println("Leaf的静态代码块"); } { System.out.println("Leaf的实例代码块"); } public Leaf() { super("调用父类指定的构造器"); System.out.println("Leaf的无参构造函数"); } } ``` 输出结果为: ``` Root的静态代码块 Mid的静态代码块 Leaf的静态代码块 Root的实例代码块 Root的构造函数 Mid的实例代码块 Mid的带参构造函数:调用重载的构造器 Mid的无参构造函数 Leaf的实例代码块 Leaf的带参构造函数:调用父类指定的构造器 Leaf的无参构造函数 Root的实例代码块 Root的构造函数 Mid的实例代码块 Mid的带参构造函数:调用重载的构造器 Mid的无参构造函数 Leaf的实例代码块 Leaf的带参构造函数:调用父类指定的构造器 Leaf的无参构造函数 ``` 可以看到,初始化代码块和构造函数的执行顺序符合题目中所给的加载顺序。同时,Leaf类使用super显示调用其父类指定的构造器,而Mid类使用this调用重载的构造器,验证了题目中的要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值