安卓应用安全指南 4.1.2 创建/使用活动 规则书

简介: 4.1.2 创建/使用活动 规则书 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0创建或向活动发送意图时,请务必遵循以下规则。

4.1.2 创建/使用活动 规则书

原书:Android Application Secure Design/Secure Coding Guidebook

译者:飞龙

协议:CC BY-NC-SA 4.0

创建或向活动发送意图时,请务必遵循以下规则。

4.1.2.1 仅在应用内部使用的活动必须设置为私有(必需)

仅在单个应用中使用的活动,不需要能够从其他应用接收任何意图。 开发人员经常假设,应该是私有的活动不会受到攻击,但有必要将这些活动显式设置为私有,以阻止恶意内容被收到。

AndroidManifest.xml

<!-- Private activity -->
<!-- *** POINT 3 *** Explicitly set the exported attribute to false. -->
<activity
    android:name=".PrivateActivity"
    android:label="@string/app_name"
    android:exported="false" />

意图过滤器不应该设置在仅用于单个应用的活动中。 由于意图过滤器的特性,以及工作原理,即使您打算向内部的私有活动发送意图,但如果通过意图过滤器发送,则可能会无意中启动另一个活动。 更多详细信息,请参阅高级主题“4.1.3.1 结合导出属性和意图过滤器设置(用于活动)”。

AndroidManifest.xml(不推荐)

<!-- Private activity -->
<!-- *** POINT 3 *** Explicitly set the exported attribute to false. -->
<activity
    android:name=".PictureActivity"
    android:label="@string/picture_name"
    android:exported="false" >
    <intent-filter>
        <action android:name="org.jssec.android.activity.OPEN />
    </intent-filter>
</activity>

4.1.2.2 不要指定taskAffinity(必需)

在 Android OS 中,活动由任务管理。 任务名称由根活动所具有的 Affinity 决定。 另一方面,对于根活动以外的活动,活动所属的任务不仅仅取决于 Affinity,还取决于活动的启动模式。 更多详细信息,请参阅“4.1.3.4 根活动”。

在默认设置中,每个活动使用其包名称作为其 Affinity。 因此,任务根据应用分配,因此单个应用中的所有活动都属于同一个任务。 要更改任务分配,您可以在AndroidManifest.xml文件中显式声明 Affinity,或者您可以在发送给活动的意图中,设置一个标志。 但是,如果更改任务分配,则存在风险,即其他应用可能读取一些意图,它发送给属于其他任务的活动。

请务必不要在AndroidManifest.xml文件中指定android:taskAffinity,并使用默认设置,将 affinity 作为包名,以防止其他应用读取发送或接收的意图中的敏感信息。

以下是用于创建和使用私有活动的AndroidManifest.xml示例文件。

AndroidManifest.xml

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <!-- Private activity -->
    <!-- *** POINT 1 *** Do not specify taskAffinity -->
    <activity
        android:name=".PrivateActivity"
        android:label="@string/app_name"
        android:exported="false" />
</application>

任务和 Affinity 的更多信息,请参阅“Google Android 编程指南” [2],Google 开发者 API 指南“任务和返回栈” [3],“4.1.3.3 读取发送到活动的意图”和“4.1.3.4 根活动”

[2] Author Egawa, Fujii, Asano, Fujita, Yamada, Yamaoka, Sano, Takebata, “Google Android Programming
Guide”, ASCII Media Works, July 2009

[3] http://developer.android.com/guide/components/tasks-and-back-stack.html

4.1.2.3 不要指定launchMode(必需)

活动的启动模式,用于控制启动活动时的设置,它用于创建新任务和活动实例。 默认情况下,它被设置为"standard"。 在"standard"设置中,新实例总是在启动活动时创建,任务遵循属于调用活动的任务,并且不可能创建新任务。 创建新任务时,其他应用可能会读取调用意图的内容,因此当敏感信息包含在意图中时,需要使用"standard"活动启动模式设置。 活动的启动模式可以在AndroidManifest.xml文件的android:launchMode属性中显式设置,但由于上面解释的原因,这不应该在活动的声明中设置,并且该值应该保留为默认的"standard"

AndroidManifest.xml

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <!-- Private activity -->
    <!-- *** POINT 2 *** Do not specify launchMode -->
    <activity
        android:name=".PrivateActivity"
        android:label="@string/app_name"
        android:exported="false" />
</application>

请参阅“4.1.3.3 读取发送到活动的意图”和“4.1.3.4 根活动”。

4.1.2.4 不要为启动活动的意图设置FLAG_ACTIVITY_NEW_TASK标志(必需)

执行startActivity()startActivityForResult()时,可以更改Activity的启动模式,并且在某些情况下可能会生成新任务。 因此有必要在执行期间不更改Activity的启动模式。

要更改Activity启动模式,使用setFlags()addFlags()设置Intent标志,并将该Intent用作startActivity()startActivityForResult()的参数。 FLAG_ACTIVITY_NEW_TASK是用于创建新任务的标志。 当设置FLAG_ACTIVITY_NEW_TASK时,如果被调用的Activity不存在于后台或前台,则会创建一个新任务。 FLAG_ACTIVITY_MULTIPLE_TASK标志可以与FLAG_ACTIVITY_NEW_TASK同时设置。 在这种情况下,总会创建一个新的任务。 新任务可以通过任一设置创建,因此不应使用处理敏感信息的意图来设置这些东西。

// *** POINT 6 *** Do not set the FLAG_ACTIVITY_NEW_TASK flag for the intent to start an activity.
Intent intent = new Intent(this, PrivateActivity.class);
intent.putExtra("PARAM", "Sensitive Info");
startActivityForResult(intent, REQUEST_CODE);

另外,即使通过明确设置FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS标志创建了新任务,您也可能认为有一种方法可以防止读取Intent的内容。 但是,即使使用此方法,内容也可以由第三方读取,因此您应该避免使用FLAG_ACTIVITY_NEW_TASK

请参阅“4.1.3.1 结合导出属性和意图过滤设置(针对活动)”,“4.1.3.3 读取发送到活动的意图”和“4.1.3.4 根活动”。

4.1.2.5 小心和安全地处理收到的意图

风险因Activity的类型而异,但在处理收到的Intent数据时,您应该做的第一件事是输入验证。

由于公共活动可以从不受信任的来源接收意图,它们可能会受到恶意软件的攻击。 另一方面,私有活动永远不会直接从其他应用收到任何意图,但目标应用中的公共活动可能会将恶意Intent转发给私有活动,因此您不应该认为私有活动不会收到任何恶意输入。 由于伙伴活动和内部活动也有恶意意图转发给他们的风险,因此有必要对这些意图进行输入验证。

请参阅“3.2 仔细和安全地处理输入数据”

4.1.2.6 在验证签名权限由内部应用定义之后,使用内部定义的签名权限(必需)

确保在创建活动时,通过定义内部签名权限来保护您的内部活动。 由于在AndroidManifest.xml文件中定义权限或声明权限请求不能提供足够的安全性,请务必参考“5.2.1.2 如何使用内部定义的签名权限,在内部应用之间进行通信”。

4.1.2.7 返回结果时,请注意目标应用产生的可能的信息泄露(必需)

当您使用setResult()返回数据时,目标应用的可靠性将取决于Activity类型。 当公共活动用于返回数据时,目标可能会成为恶意软件,在这种情况下,可能会以恶意方式使用该信息。 对于私有和内部活动,不需要过多担心返回的数据被恶意使用,因为它们被返回到您控制的应用。 伙伴活动中间有些东西。

如上所述,当从活动中返回数据时,您需要注意来自目标应用的信息泄漏。

public void onReturnResultClick(View view) {
    // *** POINT 6 *** Information that is granted to be disclosed to a partner application can be returned.
    Intent intent = new Intent();
    intent.putExtra("RESULT", "Sensitive Info");
    setResult(RESULT_OK, intent);
    finish();
}

4.1.2.8 如果目标活动是预先确定的,则使用显式意图(必需)

当通过隐式意图使用Activity时,Intent发送到的Activity由 Android OS 确定。 如果意图被错误地发送到恶意软件,则可能发生信息泄漏。 另一方面,当通过显式意图使用Activity时,只有预期的Activity会收到Intent,所以这样更安全。 除非用户需要确定意图应该发送到哪个应用活动,否则应该使用显式意图并提前指定目标。

Intent intent = new Intent(this, PictureActivity.class);
intent.putExtra("BARCODE", barcode);
startActivity(intent);
Intent intent = new Intent();
intent.setClassName(
    "org.jssec.android.activity.publicactivity",
    "org.jssec.android.activity.publicactivity.PublicActivity");
startActivity(intent);

但是,即使通过显式意图使用其他应用的公共活动,目标活动也可能是恶意软件。 这是因为,即使通过软件包名称限制目标,恶意应用仍可能伪造与真实应用相同的软件包名称。 为了消除这种风险,有必要考虑使用伙伴或内部活动。

请参阅“4.1.3.1 组合导出属性和意图过滤器设置(对于活动)”

4.1.2.9 小心并安全地处理来自被请求活动的返回数据(必需)

根据您访问的活动类型,风险略有不同,但在处理作为返回值的收到的Intent数据,您始终需要对接收到的数据执行输入验证。 公共活动必须接受来自不受信任来源的返回意图,因此在访问公共活动时,返回的意图实际上可能是由恶意软件发送的。 人们往往错误地认为,私有活动返回的所有内容都是安全的,因为它们来源于同一个应用。 但是,由于从不可信来源收到的意图可能会间接转发,因此您不应盲目信任该意图的内容。 伙伴和内部活动在私有和公共活动中间有一定风险。 一定也要对这些活动输入验证。 更多信息,请参阅“3.2 仔细和安全地处理输入数据”。

4.1.2.10 如果与其他公司的应用链接,请验证目标活动(必需)

与其他公司的应用链接时,确保确定了白名单。 您可以通过在应用内保存公司的证书散列副本,并使用目标应用的证书散列来检查它。 这将防止恶意应用欺骗意图。 具体实现方法请参考示例代码“4.1.1.3 创建/使用伙伴活动”部分。 技术细节请参阅“4.1.3.2 验证请求应用”。

4.2.11 提供二手素材时,素材应受到同等保护(必需)

当受到权限保护的信息或功能素材被另一个应用提供时,您需要确保它具有访问素材所需的相同权限。 在 Android OS 权限安全模型中,只有已获得适当权限的应用才可以直接访问受保护的素材。 但是,存在一个漏洞,因为具有素材权限的应用可以充当代理,并允许非特权应用程序访问它。 基本上这与重新授权相同,因此它被称为“重新授权”问题。 请参阅“5.2.3.4 重新授权问题”。

4.2.12 敏感信息的发送应该尽可能限制(推荐)

您不应将敏感信息发送给不受信任的各方。 即使您正在连接特定的应用程序,仍有可能无意中将Intent发送给其他应用程序,或者恶意第三方可能会窃取您的意图。 请参阅“4.1.3.5 使用活动时的日志输出”。

将敏感信息发送到活动时,您需要考虑信息泄露的风险。 您必须假设,发送到公共活动的Intent中的所有数据都可以由恶意第三方获取。 此外,根据实现,向伙伴或内部活动发送意图时,也存在各种信息泄漏的风险。 即使将数据发送到私有活动,也存在风险,意图中的数据可能通过LogCat泄漏。 意图附加部分中的信息不会输出到LogCat`,因此最好在那里存储敏感信息。

但是,不首先发送敏感数据,是防止信息泄露的唯一完美解决方案,因此您应该尽可能限制发送的敏感信息的数量。 当有必要发送敏感信息时,最好的做法是只发送给受信任的活动,并确保信息不能通过LogCat泄露。

另外,敏感信息不应该发送到根活动。 根活动是创建任务时首先调用的活动。 例如,从启动器启动的活动始终是根活动。

根活动的更多详细信息,请参阅“4.1.3.3 发送到活动的意图”和“4.1.3.4 根活动”。

相关文章
|
7月前
|
安全 Linux Android开发
Android 安全功能
Android 安全功能
83 0
|
7月前
|
安全 Linux Android开发
Android安全启动学习(一):AVB校验是什么?
Android安全启动学习(一):AVB校验是什么?
442 0
|
7月前
|
存储 安全 Linux
Android安全启动学习(四):device-mapper-verity (dm-verity)和哈希树
Android安全启动学习(四):device-mapper-verity (dm-verity)和哈希树
350 0
|
14天前
|
存储 安全 Android开发
探索Android系统的最新安全特性
在数字时代,智能手机已成为我们生活中不可或缺的一部分。随着技术的不断进步,手机操作系统的安全性也越来越受到重视。本文将深入探讨Android系统最新的安全特性,包括其设计理念、实施方式以及对用户的影响。通过分析这些安全措施如何保护用户免受恶意软件和网络攻击的威胁,我们希望为读者提供对Android安全性的全面了解。
|
2月前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
362 0
|
5月前
|
存储 安全 数据安全/隐私保护
🔎Android安全攻防实战!守护你的应用数据安全,让用户放心使用!🛡️
【7月更文挑战第28天】在移动应用盛行的时代,确保Android应用安全性至关重要。本文以问答形式探讨了主要安全威胁(如逆向工程、数据窃取)及其对策。建议使用代码混淆、签名验证、数据加密等技术来增强应用保护。此外,还推荐了加密API、HTTPS通信、代码审计等措施来进一步加强安全性。综上所述,全面的安全策略对于构建安全可靠的应用环境必不可少。#Android #应用安全 #代码混淆 #数据加密
88 3
|
5月前
|
存储 安全 Android开发
安卓应用开发的安全之道
【7月更文挑战第4天】在数字时代,移动应用的安全性至关重要。本文将深入探讨在安卓平台上开发安全应用的最佳实践,包括代码混淆、数据存储加密、网络通信安全、权限管理以及定期的安全审计和更新策略。通过这些措施,开发者可以显著提高他们的应用抵御恶意攻击的能力,保护用户数据免受侵害。
|
6月前
|
安全 网络协议 网络安全
程序与技术分享:Android应用安全之数据传输安全
程序与技术分享:Android应用安全之数据传输安全
|
存储 安全 Java
Android DataStore:安全存储和轻松管理数据
Android DataStore:安全存储和轻松管理数据
|
7月前
|
安全 算法 Android开发
安卓逆向工程与安全分析:保护您的应用知识产权
【4月更文挑战第14天】在数字时代,安卓应用开发者面临知识产权保护的挑战,主要源于安卓系统的开放性和逆向工程。逆向工程能揭示应用源代码,增加被盗用和安全风险。为应对挑战,开发者可采取代码混淆、加密、NDK开发、服务器端验证、定期更新和安全审计等策略。关注安全动态,利用第三方服务也是提升应用安全的重要途径。保护知识产权,确保应用安全,是开发者持续关注和努力的方向。
83 1