精华内容
下载资源
问答
  • 四大组件安全

    千次阅读 2016-11-30 17:27:15
    仅仅拥有失活状态组件在其他进程需要内存时随时会被杀掉,因此,我们让onReceive()启动一个新服务,并用其完成任务,于是系统就知道进程仍然在处理工作,就可以避免被判定为失活状态。 权限 Intent setPackage...
    本文为学习记录,将一些重点记录下。参考droidsec网站。推荐大家关注一下。
    每个Application由Activity、Service、content Provider和Broadcast Receiver等基本组件组成。

    Activtity

    包括显示启动和隐式启动,activity都必须在配置文件中注册组件。私有activity推荐显示启动,隐式启动需要在配置文件中添加intent-filter的action属性。

    Activity的四种加载模式launch mode

    standard:默认的启动模式,每次启动都会创建该活动的一个新的实例放入栈顶。
    singleTop:启动活动时如果发现返回栈的栈顶已经是该活动,则直接使用,不再创建新实例。
    singleTask:启动活动时如果发现返回栈中存在该活动,则直接使用,并把其上面的活动出栈。
    singleInstance:该模式下会有单独的栈来管理该活动,解决不同程序访问的共享活动实例问题。
    可在activity元素中配置android:launchMode属性。
    taskAffinity:android中task管理activity,task的命令取决于affinity。默认情况下一个app下所有activity属于同一task,可以在配置文件中设置affinity的值来改变task的分配。
    FLAG_ACTIVITY_NEW_TASK:启动activity时通过setFlags()或addFlags()方法设置intent的flags属性也能够改变launch mode。
    FLAG_ACTIVITY_NEW_TASK标记代表创建新的task,判断其taskAffinity值。(被启动的Activity既不在前台也不在后台)。
    FLAG_ACTIVITY_MULTIPLE_TASK标记能和FLAG_ACTIVITY_NEW_TASK同时设置。这种情况下必会创建的task,所以intent中不应携带敏感数据。

    外部应用启动

    android:exported:该属性为true时可被外部应用启动。false只能被自身app或者同user id或root启动。
    android:protectionLevel:exported属性只是用于限制Activity是否暴露给其他app,通过配置文件中的权限申明也可以限制外部启动activity。
    normal:默认值,低风险,无需用户确认。
    dangerous:会警示用户。
    signature:仅授予那些和本程序应用了相同密钥来签名的程序。
    signatureOrSystem:类似signature,同时系统程序也有资格访问。

    安全建议

    • app内使用的私有Activity不应配置intent-filter,如果配置了intent-filter需设置exported属性为false。
    • 使用默认taskAffinity
    • 使用默认launchMode
    • 启动Activity时不设置intent的FLAG_ACTIVITY_NEW_TASK标签
    • 谨慎处理接收的intent以及其携带的信息
    • 签名验证内部(in-house)app
    • 当Activity返回数据时候需注意目标Activity是否有泄露信息的风险
    • 目的Activity十分明确时使用显示启动
    • 谨慎处理Activity返回的数据,目的Activity返回的数据有可能是恶意应用伪造的
    • 验证目标Activity是否恶意app,以免受到intent欺骗,可用hash签名验证
    • When Providing an Asset Secondhand, the Asset should be Protected with the Same Level of Protection
    • 尽可能的不发送敏感信息,应考虑到启动public Activity中intent的信息均有可能被恶意应用窃取的风险

    Broadcast Recevier

    Broadcast Recevier 广播接收器继承自BroadcastReceiver基类,可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户。
    广播接收器既可以在manifest文件中声明,也可以在代码中进行动态的创建,并以调用Context.registerReceiver()的方式注册至系统。
    广播接收器仅在执行onReceive()方法时处于活跃状态,当onReceive()返回后,它为失活状态。仅仅拥有失活状态组件在其他进程需要内存时随时会被杀掉,因此,我们让onReceive()启动一个新服务,并用其完成任务,于是系统就知道进程仍然在处理工作,就可以避免被判定为失活状态。

    权限

    Intent setPackage:设置接收app
    abstract void sendBroadcast(Intent intent, String reveiverPermission):设置接收权限
    protectionLevel属性类似于activity

    广播类型

    系统广播
    自定义广播

    Ordered Broadcast

    有序广播和无序广播

    sticky broadcast

    粘性广播,发送给对应的reveiver后保存在AMS中,当有新的动态注册的reveiver请求AMS注册时,如果有接收该广播的权限,那么这个广播会被发送到该reveiver。
    sendStickBroadcast()是发送粘性广播的api,需要权限android.Manifest.permission.BROADCAST_STICKY

    变动

    android3.1以及之后版本广播接收器不能在启动应用前注册。可以通过设置intent的flag为Intent.FLAG_INCLUDE_STOPPED_PACKAGES将广播发送给未启动应用的广播接收器。

    分类

    1. 私有广播接收器:只接收app自身发出的广播
    2. 公共广播接收器:能接收所有app发出的广播
    3. 内部广播接收器:只接收内部app发出的广播

    建议:

    私有广播接收器设置exported=false,不配置intent-filter。(私有广播接收器依然能接收到同UID的广播)
    内部app之间的广播使用protectionLevel=’signature’验证其是否真是内部app
    sticky broadcast粘性广播中不应包含敏感信息
    Ordered Broadcast建议设置接收权限receiverPermission,避免恶意应用设置高优先级抢收此广播后并执行abortBroadcast()方法。

    Content Provider

    Content URIs

    Content URI中包含了整个provider的以符号表示的名字(它的authority) 和指向一个表的名字(一个路径)。
    content://com.example.app.provider/table1/1
    A. 标准前缀表明这个数据被一个内容提供器所控制。
    B. URI的权限部分;它标识这个内容提供器。对于第三方应用程序,这应该是一个全称类名(小写)以确保唯一性。权限 元素的权限属性中进行声明:
    1. <provider  
    2. android:name="com.example.databasetest.DatabaseProvider"  
    3. android:authorities="com.example.databasetest.provider" >  
    4. </provider>
    使用的时候输入对应的URL权限即可。
    C. 用来判断请求数据类型的路径。这可以是0或多个段长。如果内容提供器只暴露了一种数据类型(比如,只有火车),这个分段可以没有。如果提供器暴露若干类型,包括子类型,那它可以是多个分段长-例如,提供”land/bus”, “land/train”, “sea/ship”, 和”sea/submarine”这4个可能的值。
    D. 被请求的特定记录的ID,如果有的话。这是被请求记录的_ID数值。如果这个请求不局限于单个记录, 这个分段和尾部的斜线会被忽略。

    权限

    申请读取短信的权限
    <uses-permission android:name="android.permission.READ_SMS"></uses-permission>
    自定义权限


    变动

    Contentprovider组件在API-17(android4.2)及以上版本由以前的exported属性默认ture改为默认false。
    Contentprovider无法在android2.2(API-8)申明为私有。

    安全建议

    1. minSdkVersion不低于9
    2. 不向外部app提供的数据的私有content provider设置exported=“false”避免组件暴露(编译api小于17时更应注意此点)
    3. 使用参数化查询避免注入
    4. 内部app通过content provid交换数据设置protectionLevel=“signature”验证签名
    5. 公开的content provider确保不存储敏感数据
    6. Uri.decode() before use ContentProvider.openFile()
    7. 提供asset文件时注意权限保护
    解决方法Uri.decode()

    Android Service Security

    常见方法

    调用stopService则会造成Activity结束了而Service还运行着。bindService启动的Service可以由unbindService来结束,也可以在Activity结束之后(onDestroy)自动结束。
    OnCreate() 系统在service第一次创建时执行
    OnDestroy() 系统在service不再被使用并要销毁时调用此方法,这是service收到的最后一个调用.
    bindService来绑定服务.
    onHandleIntent调用工作线程处理请求.
    IntentService这是一个Service的子类,使用一个工作线程来处理所有的启动请求,一次处理一个.这是你不需你的service同时处理多个请求时的最好选择.你所有要做的就是实现onHandleIntent(),这个方法接收每次启动请求发来的intent.

    注意

    如果你打算只在本应用内使用自己的service,那么你不需指定任何intent过滤器.不使用intent过滤器,你必须使用一个明确指定service的类名的intent来启动你的service.
    另外,你也可以通过包含android:exported属性,并指定其值为“false”来保证你的service是私有的.即使你的service使用了intent过滤器,也会起作用。

    安全建议

    • exported属性明确定义
    • 私有service不定义intent-filter并且设置exported为false
    • 公开的service设置exported为true,intent-filter可以定义或者不定义
    • 内部/合作service设置exported为true,intent-filter不定义
    • 只被应用本身使用的service应设置为私有
    • service接收到的数据需需谨慎处理
    • 内部service需使用签名级别的protectionLevel来判断是否未内部应用调用
    • 不应在service创建(onCreate方法被调用)的时候决定是否提供服务,应在onStartCommand/onBind/onHandleIntent等方法被调用的时候做判断.
    • 当service又返回数据的时候,因判断数据接收app是否又信息泄露的风险
    • 有明确的服务需调用时使用显示意图
    • 尽量不发送敏感信息
    • 合作service需对合作公司的app签名做效验

    案例

    隐式启动services,当存在同名services,先安装应用的services优先级高
    展开全文
  • Android四大组件安全问题

    千次阅读 2017-06-26 15:22:02
    Activity AndroidMainfest 配置 android:exported="false" , 其它应用不可以调用 ... 来忽略该证书错误, 则会受到中间人攻击的威胁, 可能导致隐私泄露。...参考链接:Android安全开发之Provider组件安全

    Activity

    • AndroidMainfest 配置 android:exported="false", 其它应用不可以调用
    • 检测栈顶 Activity, 防止页面被劫持
    • WebView 加载网页发生证书认证错误时, 会调用 WebViewClient 类的 onReceivedSslError 方法, 如果该方法实现调用了 handler.proceed() 来忽略该证书错误, 则会受到中间人攻击的威胁, 可能导致隐私泄露。当发生证书认证错误时, 采用默认的处理方法 handler.cancel(), 停止加载页面
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.addJavascriptInterface(new JsBridge(mContext), JS_OBJECT);
        mWebView.loadUrl("http://www.xxxx.com/");
        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                handler.proceed(); // 忽略SSL证书错误(错误做法)
                handler.cancel();  // 停止加载页面(正确做法)
            }
        });
    • WebView 检查是否明文保存密码, 使用 WebView.getSettings().setSavePassword(false) 来禁止保存密码
    • WebView 检测是否使用 addJavascriptInterface 接口, 如果使用了需要将 minSdkVersion 提升至 17 (Android 4.2), 或者使用一些第三方的库来解决注入漏洞

    BroadcastReceiver

    • 使用 LocalBroadcastManager 处理应用内部的广播
    • 应用间使用广播, 通过自定义权限和设置 android:protectionLevel, 同时要避免敏感数据的传递
    • 不要使用 sendStickyBroadcastsendStickyXXXAndroid SDK 文档中明确说明了存在安全问题的 API

    Service

    • AndroidMainfest 配置 android:exported="false", 其它应用不可以调用
    • 通过 Intent.getXXXExtra() 获取数据时进行以下判断, 以及用 try catch 捕获所有异常, 以防止应用出现拒绝服务漏洞
      1) 空指针异常
      2) 类型转换异常
      3) 数组越界访问异常
      4) 类未定义异常
      5) 其他异常

    ContentProvider

    • 定义了私有权限, 但是没有定义私有权限的级别, 或者定义的权限级别不够, 导致恶意应用只要声明这个权限就能够访问到相应的 Content Provider 提供的数据, 造成数据泄露
    • Content Provider 的数据源是 SQLite 数据库时, 如果实现不当, 而 Provider 又是暴露的话, 则可能会引发本地 SQL 注入漏洞
    • 防止目录遍历漏洞, 去除 Content Provider 中没有必要的 openFile() 接口, 过滤限制跨域访问, 对访问的目标文件的路径进行有效判断
    • 正确的定义私有权限
    <permission android:description="string resource"
                android:icon="drawable resource"
                android:label="string resource"
                android:name="string"
                android:permissionGroup="string"
                android:protectionLevel=["normal" | "dangerous" | "signature" | "signatureOrSystem"] />

    android:protectionLevel 参数说明

    属性 描述
    normal 默认值, 低风险权限, 在安装的时候, 系统会自动授予权限
    dangerous 高风险权限, 如发短信, 打电话, 读写通讯录。使用此 protectionLevel 来标识用户可能关注的一些权限。Android 将会在安装程序时, 警示用户关于这些权限的需求
    signature 签名权限, 当应用程序所用签名与声明引权限的应用程序所用签名相同时, 才能将权限授给它
    signatureOrSystem 除了具有相同签名的 APP 可以访问外, Android 系统中的程序也有权限访问

    参考链接:Android安全开发之Provider组件安全

    展开全文
  • Android安全机制--四大组件安全

    千次阅读 2015-04-15 14:30:41
    组件有Public和Private的概念,是否能被其他方调用。通过android:exported字段来确定,android:exported="true"表示能,反之不行。 默认情况下,组件在AndroidMainfest声明中没有 interfliter 那么exported为false,...

    组件有Public和Private的概念,是否能被其他方调用。通过android:exported字段来确定,android:exported="true"表示能,反之不行。

    默认情况下,组件在AndroidMainfest声明中没有 interfliter  那么exported为false,有了interfliter为true.当然我们可以直接输入android:exported来自己控制。以下就设置为false

    1. <activity  
    2.           android:name=".LoginActivity"  
    3.           android:label="@string/app_name"  
    4.           android:screenOrientation="portrait"   
    5.           android:exported="false">  

    我们可以通过自定义permission来限制四大组件的安全

    Activity中


    在service


    在contentprovider中分为写与读的两个权限


    在broastreceiver中发送时


    接收时


    怎么自定义?在androidmainfest中

    1. <permission android:description="test"    
    2.         android:label="test"    
    3.         android:name="com.test.custempermission"    
    4.         android:protectionLevel="normal">    
    5.     </permission>  

    下面通过指定一个BroadcastReceiver的权限来实验 
    首先创建了两个app,app A ,app B ; 
    app A中注册了一个BroadcastReceiver ,app B 发送消息 
    app A的menifest文件: 

    Xml代码  收藏代码
    1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    2.     package="com.example.testbutton"  
    3.     android:versionCode="1"  
    4.     android:versionName="1.0" >  
    5.   
    6.     <uses-sdk  
    7.         android:minSdkVersion="7"  
    8.         android:targetSdkVersion="15" />  
    9.     <!-- 声明权限 -->  
    10.     <permission android:name="com.example.testbutton.RECEIVE" />  
    11.   
    12.     <application  
    13.         android:icon="@drawable/ic_launcher"  
    14.         android:label="@string/app_name"  
    15.         android:theme="@style/AppTheme" >  
    16.         <activity  
    17.             android:name=".MainActivity"  
    18.             launcheMode="singleTask"  
    19.             android:configChanges="locale|orientation|keyboardHidden"  
    20.             android:screenOrientation="portrait"  
    21.             android:theme="@style/android:style/Theme.NoTitleBar.Fullscreen" >  
    22.             <intent-filter>  
    23.                 <action android:name="android.intent.action.MAIN" />  
    24.   
    25.                 <category android:name="android.intent.category.LAUNCHER" />  
    26.             </intent-filter>  
    27.         </activity>  
    28.         <!-- 注册Broadcast Receiver,并指定了给当前Receiver发送消息方需要的权限 -->  
    29.         <receiver  
    30.             android:name="com.example.testbutton.TestButtonReceiver"  
    31.             android:permission="com.example.testbutton.RECEIVE" >  
    32.             <intent-filter>  
    33.                 <action android:name="com.test.action" />  
    34.             </intent-filter>  
    35.         </receiver>  
    36.     </application>  
    37.   
    38. </manifest>  
    app B 的menifest 文件内容 
    Xml代码  收藏代码
    1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    2.     package="com.example.testsender"  
    3.     android:versionCode="1"  
    4.     android:versionName="1.0" >  
    5.   
    6.     <uses-sdk  
    7.         android:minSdkVersion="7"  
    8.         android:targetSdkVersion="15" />  
    9.     <!-- 声明使用指定的权限 -->  
    10.     <uses-permission android:name="com.example.testbutton.RECEIVE" />  
    11.   
    12.     <application  
    13.         android:icon="@drawable/ic_launcher"  
    14.         android:label="@string/app_name"  
    15.         android:theme="@style/AppTheme" >  
    16.         <activity  
    17.             android:name=".MainActivity"  
    18.             android:label="@string/title_activity_main" >  
    19.             <intent-filter>  
    20.                 <action android:name="android.intent.action.MAIN" />  
    21.   
    22.                 <category android:name="android.intent.category.LAUNCHER" />  
    23.             </intent-filter>  
    24.         </activity>  
    25.     </application>  
    26.   
    27. </manifest>  
    这样app B 给app A 发送消息,A就可以收到了,若未在app B的menifest文件中声明使用相应的权限,app B发送的消息,A是收不到的。 


    展开全文
  • 这块是学习瘦老师的文章 写的很详细,直接看吧~~链接

    这块是学习瘦老师的文章
    写的很详细,直接看吧~~链接

    展开全文
  • Android的四大组件及组件间通信如果想对四大组件有深入的了解,那永远不要停留在一些条条干干的SDK API的认识,需要了解他的通讯,他的复用,他的边界问题,这样才会对四大组件有透明的认识.四大组件简洁 Activity没有...
  • Android安全测试:使用drozer检测四大组件 在drozer console中直接使用help查看;然后进一步使用help command可查看各命令更具体的使用方法。 通过输入安装包的部分关键字查找包全称 run app.package.list -f ...
  • 今天项目进行静态安全检测,报了一个"Activity组件暴露风险"的问题,这个问题引起的原因是给其中的一个activity设置了 android:exported="true" ,但是我有多个app,而且之前存在相互调用。 分析: 我们先来看看 ...
  • Android 组件安全

    千次阅读 2015-09-09 11:09:21
    1、Activity、Service、BroadcastReceiver、ContentProvider是Android的四大组件,他们的安全性是非常重要的。四大组件安全漏洞主要集中在是否可以被外部调用,外部调用是否存在风险。 四大组件是否可以被外部...
  • 四大组件之ContentProvider

    千次阅读 2016-08-08 00:09:51
    四大组件之ContentProviderContentProvider简介 ContentProvider的主要作用是实现不同的应用程序之间的数据的共享,而且还保证了数据的安全性。 ContentProvider是android提供的实现程序之间数据共享的一套机制。 ...
  • Activity service ContentProvider BroadcastReceiver 转载于:https://www.cnblogs.com/sjjg/p/4771290.html
  • Activity定义:是一种可以包含用户界面的组件,主要用于和用户进行交互。 Android程序设计讲究逻辑和视图分离,最好每一个活动都能对应一个布局,布局就是用来显示界面内容的。使用一个Activity集中于单个任务并为...
  • Android四大组件之ContentProvider

    千次阅读 2017-07-11 23:14:04
    ContentProvider是android四大组件之一的内容提供者,它主要的作用就是将程序的内部的数据和外部进行共享,为数据提供外部访问接口,被访问的数据主要以数据库的形式存在(可以是任意数据),而且还可以选择共享哪一...
  • Android组件安全

    2017-04-05 17:05:31
    Android组件安全做过Android开发的攻城狮都知道Android四大组件,在开发过程中打交道最多的也是这四大组件,在开发Android应用的过程中我们最基本的要求是要对这四大组件有一个清晰的认识,包括组件的功能特性、生命...
  • 内容提供器,Android 四大组件之一。 作用: 可以操作非本应用程序的数据,实现跨进程数据共享。 优点: 可以在保证数据的安全性的情况下实现数据跨进程共享。因为contentprovider规范了统一的数据访问接口。 对底层...
  • Activity组件和Service组件具有发送广播的能力。广播接收者需要先订阅消息才能接收广播消息,任何监听Broadcast的Receiver都可以接收一个已发送的Broadcast,因此,不要在Broadcast中发送敏感信息。 广播机制是在...
  • 不能被其他的应用程序所使用,所以是安全的Service 1、设置exported属性为false 2、发送接收Intent的时候注意数据的敏感性与来源正确性 3、确保在同一个应用内的Intent才可以防止敏感信息 公共Scevice。 没有...
  • Android四大组件 — ContentProvider contentprovider是android四大组件之一的内容提供器,它主要的作用就是将程序的内部的数据和外部进行共享,为数据提供外部访问接口,被访问的数据主要以数据库的形式存在,而且...
  • Android四大组件分别为:1.活动Activity,2.服务Service,3.广播接收器Broadcast Receiver,4.内容提供器Content Provider 在我之前的博客中写过广播的概念与基础用法,Android基础-四大组件之Broadcast广播(基础). ...
  • ContentProvider是Android的四大组件之一,主要用于给不同应用程序提供接口,实现数据共享,并且可以保证数据的安全性。在手机的联系人、短信等应用都会创建ContentProvider提供接口将应用内数据提供给其他应用使用...
  • 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享功能,其允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性。它可以选择只对哪一部分数据进行共享,从而保证程序中的隐私...
  • 安卓四大组件基础

    2018-01-29 14:18:52
    大家都知道,安卓应用安装到设备后,都运行在自己的安全沙箱内,有一下几个特点: Android操作系统是一种多用户 Linux 系统,其中的每个应用都是一个不同的用户;默认情况下,系统会为每个应用分配一个唯一的 ...
  • 四大组件之Service

    2017-05-27 18:04:14
    一、Android 进程的生命周期 服务是一个没有界面的Activity. 长期在后台运行, 不关乎界面的一些操作.... 使用Thread不安全, 不严谨. Android一个应用程序把所有的界面关闭时, 进程这时还没有被销毁, 现在处
  • 关闭 关闭 资讯 安全 论坛 下载 读书 程序开发 数据库 系统 网络 电子书 微信学院 站长学院 QQ 手机软件 考试 软件开发| web前端| Web开发|...android四大组件--C
  • 文章目录BroadCast什么是广播广播的分类模型描述注册方式静态注册动态注册...广播是一种消息型组件,用于在不同组件甚至不同应用之间传递消息。 广播的分类 标准广播 完全异步的广播,多个广播接收器可
  • 当我们在用360等检测软件扫描应用漏洞时,扫描结果可能归类为安全漏洞,...android:exported 是Android中的四大组件 Activity,Service,Provider,Receiver 四大组件中都会有的一个属性。 总体来说它的主要作用...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 351
精华内容 140
关键字:

四大组件安全