第八篇安全
Android内建的安全机制可以显著地减少了应用程序的安全问题。通过在默认的系统设置和文件权限设置的环境下建立应用,可避免为一系列的安全问题寻找解决方案。
一些帮助建立应用的核心安全的特性如下:
l Android应用程序沙盒,将应用数据和代码的执行与其他程序隔离。
l 具有鲁棒性的常见安全功能的应用框架,例如加密,权限控制,安全IPC
l 使用改进的虚拟机等技术,减少了常见内存管理错误。
l 加密文件系统可以保护丢失或被盗走的设备数据。
l 用户权限控制限制访问系统关键信息和用户数据。
l 应用程序权限以单个应用为基础控制其数据。
尽管如此,熟悉Android安全特性仍然很重要;特别是,当使用外部存储、插件化等非Android推荐特性时,开发者将直面各种安全问题。遵守这些规范并将其作为优秀的代码风格,能够减少无意间给用户带来的安全问题。
8.1 拒绝服务
针对序列化对象而出现的拒绝服务主要是由于应用中使用了getSerializableExtra() 的API,由于应用开发者没有对传入的数据做异常判断,恶意应用可以通过传入畸形数据,导致应用本地拒绝服务。
已知的拒绝异常类型包括:ClassCaseException、NoClassDefFoundError
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,只要是