网页客服,欢迎咨询

Android应用安全开发之组件安全浅谈

2025-01-06 10:55:01 100
  • 收藏
  • 管理
    总篇134篇 2022年第9篇前言本文主要讲述在android开发过程中如何更安全地使用组件,了解组件使用过程中需要关注的风险点,提高源码的可靠性和应用系统自身的安全防护能力。01背景Android开发的四大组件包含Activity(活动)、Service(服务)、BroadcastReceive(广播)、ContentProvider(内容提供),每个组件都可以在AndroidManifest中通过android:exported属性设置为公有或私有。Activity、Service、BroadcastReceiver在默认没有设置exported属性的情况下,组件在制定Intent过滤器(intent-filter)后默认也是公有组件。ContentProvider 组件在api level 17以下的所有应用中android:exported属性默认值为true(公有),17及以上默认值为false(私有)。所有公有组件都可以被外部程序调用,这就意味着容易被外部恶意程序攻击。02组件安全开发1、删除AndroidManifest中未实现若开发人员在manifest 文件中定义了公有组件,但组件没有代码实现,则攻击者可通过调用未实现的组件进行攻击导致APP崩溃。2、非必要导出组件不导出不需要被外部程序调用的组件应该添加android:exported=”false”属性,这个属性说明它是私有的,只有同一个应用程序的组件或带有相同用户ID的应用程序才能调用。3、设置特定组件的访问权限对于希望能够被特定的外部程序访问的组件,可以为其设置访问权限。首先需要自定义permission,并设置protectionLevel。 android:protectionLevel参数说明属性描述normal默认值, 低风险权限, 在安装的时候, 系统会自动授予权限dangerous高风险权限, 如发短信, 打电话, 读写通讯录。使用此 protectionLevel 来标识用户可能关注的一些权限。Android 将会在安装程序时, 警示用户关于这些权限的需求signature签名权限, 当应用程序所用签名与声明引权限的应用程序所用签名相同时, 才能将权限授给它signatureOrSystem除了具有相同签名的 APP可以访问外, Android系统中的程序也有权限访问组件添加权限:这样声明的Activity在被调用时,Android就会检查调用者是否具有com.autohome.permission_test权限,如果没有就会触发SecurityException异常。 ... 若想调用该activity的权限,则需要在app的Mainifest文件中使用自定义的权限。4、安全启动私有组件正常情况下一个私有组件是安全的,但是当私有组件能够被一个公有组件启动的话,此时该私有组件将不再安全。私有组件A,和一个公有组件B。如果B能够根据从外传入的Intent中的内容打开私有组件A,同时私有组件A的Intent的内容来自启动导出组件B的Intent的内容,那么攻击者就可以通过对外导出组件B,去控制私有导出组件A。这就可能会造成严重的安全风险。5、使用LocalBroadcastManager来实现BroadcastReceiver动态注册BroadcastReceiver组件的注册方式可分为两种,一种是静态注册,即提前在AndroidManifest.xml文件中声明组件;另外一种是动态注册,即在代码中使用registerReceiver()方法注册BroadcastReceiver,只有当registerReceiver()的代码执行到了才进行注册,取消时则调用unregisterReceiver()方法。而容易被忽略的是registerReceiver()方法注册的是全局BroadcastReceiver,在其生命周期里是默认可导出的,如果没有指定权限访问控制,可以被任意外部应用访问,向其传递Intent来执行特定的功能。开发者可使用LocalBroadcastManager来实现BroadcastReceiver动态注册,保证数据传递仅限于应用内。public static void sendLocalBroadcast(Intent intent) { LocalBroadcastManager.getInstance(getInstance()).sendBroadcastSync(intent);}public static void registerLocalReceiver(BroadcastReceiver receiver, IntentFilter filter) { LocalBroadcastManager.getInstance(getInstance()).registerReceiver(receiver, filter);}public static void unregisterLocalReceiver(BroadcastReceiver receiver) { LocalBroadcastManager.getInstance(getInstance()).unregisterReceiver(receiver);}6、防止ContentProvider 文件目录遍历对外暴露的Content Provider实现了openFile()接口,因此其他有相应调用该Content Provider权限的应用即可调用Content Provider的openFile()接口进行文件数据访问。但是如果没有进行Content Provider访问权限控制和对访问的目标文件的Uri进行有效判断,攻击者利用文件目录遍历可访问任意可读文件,更有甚者可以往手机设备可写目录中写入任意数据。如果应用的Content Provider组件没有必要实现openFile()接口,去除没有必要的openFile()接口。如果必要实现openFile()接口,对提交的参数进行“../”目录跳转符或其他安全校验。7、intent参数校验Intent通常用于Activity、Service、Broadcast Receiver等组件之间进行信息传递。收到intent传递的数据,组件应该验证并谨慎处理,避免执行恶意命令,或因数据格式错误,导致APP崩溃。03总结1、对不必要导出的组件设置android:exported属性为false。2、需要导出的组件,进行权限控制。3、公有组件启动私有组件时,需严格校验intent传入的参数。4、使用LocalBroadcastManager来发送本地广播。作者简介汽车之家李丽云平台部2018年9月入汽车之家智能数据中心云平台部,主要负责信息安全运营平台的开发、移动APP安全检测、敏感数据治理等相关工作。阅读更多之家性能压测平台PTS之家云多种数据库统一管理实践汽车之家AutoKH混部技术实践 Android应用安全开发之组件安全浅谈
    上一页:Android页面渲染效率优化实践 下一页:AI防挡弹幕设计与实践(云端服务)
    全部评论(0)