Android高性能编码 - 第八篇 移动端安全规范

第八篇安全

Android内建的安全机制可以显著地减少了应用程序的安全问题。通过在默认的系统设置和文件权限设置的环境下建立应用,可避免为一系列的安全问题寻找解决方案。

一些帮助建立应用的核心安全的特性如下:

l  Android应用程序沙盒,将应用数据和代码的执行与其他程序隔离。

l  具有鲁棒性的常见安全功能的应用框架,例如加密,权限控制,安全IPC

l  使用改进的虚拟机等技术,减少了常见内存管理错误。

l  加密文件系统可以保护丢失或被盗走的设备数据。

l  用户权限控制限制访问系统关键信息和用户数据。

l  应用程序权限以单个应用为基础控制其数据。

尽管如此,熟悉Android安全特性仍然很重要;特别是,当使用外部存储、插件化等非Android推荐特性时,开发者将直面各种安全问题。遵守这些规范并将其作为优秀的代码风格,能够减少无意间给用户带来的安全问题。

8.1 拒绝服务

针对序列化对象而出现的拒绝服务主要是由于应用中使用了getSerializableExtra() API,由于应用开发者没有对传入的数据做异常判断,恶意应用可以通过传入畸形数据,导致应用本地拒绝服务。

已知的拒绝异常类型包括:ClassCaseExceptionNoClassDefFoundError

8.1.1 ClassCastException示例

Intent i = getIntent();
if(i.getAction().equals("serializable_action")){
    i.getSerializableExtra("serializable_key"); //未做异常判断
}


攻击应用代码如下:

Intent i = new Intent();
i.setAction("serializable_action");
i.setClassName("com.exp.serializable", "com.exp.serializable.MainActivity");
i.putExtra("serializable_key",XXX); //此处是传入畸形数据
startActivity(i);

比如XXX处传入BigInteger.valueOf(1)则发生转型异常错误java.lang.ClassCastException。

解决方式,使用Intent.getXXExtra时,主动加try-catch。

8.1.2NoClassDefFoundError示例

当传入一个本应用未定义的Serializable或Parcelable序列化对象时,接收Intent的目标组件在getSerializableExtra()、getParcelable()等会抛出类未定义的异常java.lang.NoClassDefFoundError。

这是因为当你给漏洞应用传入一个应用本身并没有的序列化类对象,在应用上下文中肯定是找不到这个类的。

示例:构建自定义的序列化类很简单:

public class DataSchema implements Serializable {
    private static final long serialVersionUID = -3601187837704976264L;
    public DataSchema() {
        super();
    }
}

对应的攻击代码中XXX处传入new DataSchema(),并且传入的key不管是否与漏洞应用相同,getXXXExtra都会抛出类未定义的异常。此问题,官方SDK至今没有处理。

因此,规范要求,不管是get什么extra,只要是

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值