Android 安全之旅 (Vol1)

admin 2024年4月22日18:55:43评论5 views字数 9335阅读31分7秒阅读模式

Android 安全之旅 (Vol1)

如果您不关心移动应用程序的安全性,那么您可能举着霓虹灯“Hack Me”标志。

随着 Android 作为全球领先的移动操作系统在全球占据主导地位,安全责任也随之而来。Android 是黑客、恶意软件和间谍软件的主要目标,这些黑客、恶意软件和间谍软件试图利用系统和应用程序的漏洞并损害用户隐私和数据。

把它想象成一部针对你的应用程序的恐怖电影,漏洞隐藏在每个角落后面,不良做法潜伏在阴影中,随时准备扑上来。

所以,拿起你的隐喻手电筒,把我们的编码盔甲牢牢地固定好,让我们冒险进入这个令人振奋的奥德赛。

  • Android 安全之旅 (Vol1)

  • Android 安全之旅 (Vol1)

  • windows

  • Android 安全之旅 (Vol1)

  • windows()

  • Android 安全之旅 (Vol1)

  • USB()

  • Android 安全之旅 (Vol1)

  • ()

  • Android 安全之旅 (Vol1)

  • ios

  • Android 安全之旅 (Vol1)

  • windbg

  • Android 安全之旅 (Vol1)

  • ()

  • Android 安全之旅 (Vol1)Android 安全之旅 (Vol1)Android 安全之旅 (Vol1)

  • Android 安全之旅 (Vol1)

  • Android 安全之旅 (Vol1)

  • Android 安全之旅 (Vol1)

  • Android 安全之旅 (Vol1)

但首先,我们为什么要关心?

Android 安全之旅 (Vol1)

将您的应用程序视为您的数字婴儿。你不会把他们留在黑暗的小巷里无人看管,对吧?

如今,移动设备存储了大量个人和敏感信息,包括我们的联系人、照片、财务信息等。如果这些信息被盗,它可能被用于各种犯罪活动,例如身份盗窃、欺诈和敲诈勒索。因此,我们不要让您的应用程序成为下一个安全恐怖故事!

移动攻击面是巨大的,并且变得比以往任何时候都更加危险。根据 2023 年第二季度卡巴斯基 IT 威胁演变 — 移动统计数据:

  • 总共阻止了 5,704,599 次移动恶意软件、广告软件和风险感知攻击。

  • 移动设备最常见的威胁是潜在有害软件 (RiskTool):占检测到的所有威胁的 30.8%。

  • 共检测到 370,327 个恶意安装包,其中:

Android 安全之旅 (Vol1)

但好消息是:移动安全不是火箭科学。就像您不会将贵重物品留在黑暗的小巷中无人看管一样,也不要让您的应用程序容易受到网络世界的危险。通过了解威胁并实施适当的安全实践,您可以将您的应用程序变成堡垒。

Android 安全之旅 (Vol1)

可交付成果与安全性:移动应用开发中的风险权衡

啊,最后期限和安全之间的古老斗争。这是一场在董事会和编码战壕中上演的戏剧,项目经理争先恐后地赶上发布日期,开发人员则用头撞墙。

Android 安全之旅 (Vol1)

确定可交付成果的优先级

有几个因素推动了移动应用程序开发中可交付成果的优先级。

  • 快节奏的市场:快速发布新功能并在竞争中保持领先地位的需求使得全面的安全测试时间有限。

  • 利益相关者压力:公司优先考虑在紧迫的时间表上交付工作功能,以满足利益相关者的期望。

  • 被误解的威胁:存在一种误解,即移动应用程序比其他软件更不容易受到攻击,导致开发人员低估了强大的安全措施的重要性。

忽视安全性

对可交付成果的关注往往以牺牲强大的移动安全性为代价。这种疏忽可以采取多种形式,例如:

  • 安全测试不足:公司可能会进行有限或肤浅的安全测试,而未检测到关键漏洞。

  • 缺乏安全编码实践:开发人员可能没有接受过培训或鼓励遵循安全编码实践,从而导致代码中存在漏洞。

  • 忽视安全最佳实践:公司可能无法实施基本的安全措施。

Android 安全之旅 (Vol1)

照片由 克林特·帕特森 on Unsplash

潜在风险

忽视移动安全可能会对公司和用户造成严重后果。一些潜在风险包括:

  • 数据泄露:黑客可以利用漏洞窃取敏感的用户数据,例如财务信息、联系方式和个人信息。

  • 恶意软件感染:用户可以下载窃取数据、监视用户活动或在其设备上安装其他恶意软件的恶意应用程序。

  • 声誉损害:遭受安全漏洞的公司可能面临重大的声誉损害、用户信任的丧失和潜在的法律后果。

“建立声誉需要数年时间,而网络事件需要几分钟才能毁掉它”

- Stephane Nappo,“2018 年度全球 Cheif 信息办公室”

但不要害怕,声誉建设者!就像你不会直接在海洋的路径上建造你的沙堡一样,你可以通过采取措施防止网络事件来保护你的声誉。️

平衡优先事项:

虽然快速交付功能很重要,但忽视安全性可能会产生毁灭性的后果。公司需要在这些相互竞争的优先事项之间找到平衡。以下是他们可以采取的一些步骤:

  • 将安全性嵌入开发过程:安全性不应是事后才考虑的。公司需要在整个开发生命周期(从设计到部署)中集成安全实践。

  • 投资于安全培训和工具:开发人员应接受安全编码实践方面的培训,并配备必要的工具来识别和解决潜在漏洞。

  • 定期进行安全测试:公司需要在整个开发过程中执行全面的安全测试,以识别和缓解漏洞,以免漏洞被利用。

  • 采用安全第一的文化:在组织内建立安全文化至关重要。这包括鼓励员工优先考虑安全并报告潜在风险。

下一步是什么,从哪里开始?

如果您渴望深入了解 Android 安全领域,但发现传统资源有点乏味,我们为您提供了独特的方法。虽然像 Android 官方文档这样的资源和其他花哨的博客,如 App Defence Alliance 博客和 Google 安全博客是很好的起点,但它们可能不是最激动人心的读物。相反,我们建议探索 OWASP 十大移动风险,它全面概述了影响移动应用程序的最普遍安全漏洞。通过了解和解决这些风险,我们可以显著增强 Android 设备的安全态势。

所以,系好安全带,安全冒险家们,准备好狂野骑行吧!

等一下,什么是OWASP?

Android 安全之旅 (Vol1)

OWASP 代表 Open Web Application Security Project,是一个专注于提高软件安全性的非营利组织。他们最出名的是他们的 OWASP Top 10,这是最关键的应用程序安全风险列表。OWASP Top 10 每年更新一次,是开发人员和安全专业人员的宝贵资源。

2023 年 OWASP 移动威胁 10 大

  1. 凭据使用不当

  2. 供应链安全不足

  3. 不安全的身份验证/授权

  4. 输入/输出验证不足

  5. 不安全的通信

  6. 隐私控制不足

  7. 二进制保护不足

  8. 安全配置错误

  9. 不安全的数据存储

  10. 加密不足

在深入研究具体风险之前,让我们先解决一个关键因素:在“2016 年十大移动风险 - 最终名单”中名列前茅的不当平台使用。我将用本集的其余部分来解读其关键含义。

我们将在即将到来的剧集中详细探讨 2023 年 OWASP 十大移动威胁的更多信息。

平台使用不当

当应用以不安全或意外的方式与 Android 平台交互时,就会发生平台使用不当,这可能会导致漏洞并泄露用户数据。降低此风险对于保持用户信任和设备完整性至关重要。

遵循安全编码实践并遵守 Android 的安全准则,我们可以最大限度地降低平台使用不当的风险。其中包括:

  • 开发者滥用 Android 功能

  • 进程间通信(意向 — 服务等)

  • TapJacking(插顶)

1- android:可调试

android:debuggable 属性设置应用是否可调试。它是为整个应用程序设置的,不能被单个组件覆盖。默认情况下,该属性设置为 false。

允许应用程序本身可调试并不是一个漏洞,但它确实会通过对管理功能的意外和未经授权的访问使应用程序面临更大的风险。这可能允许攻击者比预期更多地访问应用程序和应用程序使用的资源。

冲击

虽然允许调试在开发过程中可能会有所帮助,但它在生产版本中会带来安全风险。有权访问可调试应用的恶意参与者可以:

  • 读取敏感数据:调试器可以访问应用的内存,从而可能泄露敏感信息,如密码、令牌和其他凭据。

  • 修改应用行为:调试器可以在运行时更改应用的代码,从而允许恶意操作其功能。

  • 获取 root 访问权限:在某些情况下,利用可调试应用可为攻击者提供对整个设备的 root 访问权限。

缓解措施

  • 在生产版本中,始终将 android:debuggable 设置为 false。这是确保应用不容易受到与调试相关的攻击的最重要步骤。

  • 使用 ProGuard 或类似工具:这些工具可以混淆应用的代码,使攻击者更难理解和利用漏洞。

  • 监控应用是否存在可疑活动:定期监控应用的日志和性能,以发现潜在攻击的迹象。

2-安卓:导出

android:exported 属性设置组件(活动、服务、广播接收器等)是否可以由其他应用程序的组件启动:

  • 如果为 true,则任何应用都可以访问该活动并按其确切的类名启动该活动。

  • 如果为 false,则只有同一应用程序的组件、具有相同用户 ID 的应用程序或特权系统组件才能启动该活动。

从历史上看,android:exported 的默认值因组件类型和 Android 版本而异。例如,在 Android 4.1.1(API 级别 16)之前,<provider> 元素默认设置为 true。如果未显式设置属性,则此不一致会产生意外公开内部应用组件的潜在风险。

冲击

将 android:exported 保留为未定义可能会产生重大的安全隐患:

  • 拒绝服务攻击:恶意应用可能会利用暴露的组件来破坏应用的功能,从而可能导致崩溃或性能问题。

  • 意外访问:其他应用可能会在未经授权的情况下访问您应用的内部组件和数据,从而可能导致数据泄露或纵。

  • 代码执行:在极端情况下,攻击者可以利用暴露的组件以应用的权限运行任意代码,从而完全控制其功能。

缓解措施

始终显式设置 android:exported 属性。这将不留任何解释的余地,并清楚地表明您对组件可见性的意图。

您可以使用“Drozer”等工具扫描易受攻击的活动、广播接收器和内容提供商

3-明文/明文HTTP

在 Android 应用中允许明文网络通信意味着监控网络流量的任何人都可以查看和操作正在传输的数据。如果传输的数据包含密码、信用卡号或其他个人信息等敏感信息,则存在漏洞。

无论您是否发送敏感信息,使用明文仍然可能是一个漏洞,因为明文/明文 HTTP 流量也可以通过网络中毒攻击(如 ARP 或 DNS 中毒)进行操纵,从而可能使攻击者能够影响应用程序的行为。

冲击

  • 数据拦截:任何监控网络流量的人都可以拦截和读取以明文形式传输的数据,包括用户名、密码、财务信息和私人消息。

  • 数据操纵:攻击者可以利用网络协议中的漏洞来操纵传输中的明文数据,从而可能导致未经授权的访问、帐户劫持或欺诈易。

  • 应用行为操纵:恶意行为者可以操纵明文通信以注入恶意代码或改变应用的行为,从而造成损害并损害用户安全。

缓解措施

Android 8.1(API 级别 27)及更低版本:

  • 使用网络安全配置:使用 NetworkSecurityConfig.xml 文件实现网络安全配置。这允许您选择退出明文流量并强制执行 HTTPS 等安全通信协议。

  • 利用安全库:使用 Retrofit 和 Volley 等库,自动处理 HTTPS 通信,简化安全数据传输。

  • 验证用户输入:实施可靠的输入验证,以确保用户不会在明文字段中输入敏感信息。

  • 使用 NetworkSecurityConfig.xml 功能选择退出明文流量:

<network-security-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">secure.example.com</domain>
</domain-config>
</network-security-config>

此选项有助于防止由于外部源(如后端服务器)提供的 URL 更改而导致应用意外回归。

Android 9(API 级别 28)及更高版本:

  • 默认情况下,明文支持处于禁用状态:无需额外配置即可享受安全通信的好处。

  • 专注于安全编码实践:继续遵循输入验证和安全数据存储等最佳实践,以保持强大的安全态势。

4-隐式意图劫持

隐式意向是 Android 开发中的一个强大工具,它允许应用程序相互交互,而无需具体了解彼此的实现细节。但是,使用不当可能会导致称为隐式意图劫持的安全漏洞。

隐式意图定义要执行的操作,而不是负责处理该操作的特定组件(活动、服务等)。当应用调用隐式意图时,Android 系统会搜索与意图操作和其他关联数据匹配的已注册意图过滤器。如果应用程序在调用 intent 时未指定完全限定的组件类名称或包,则具有匹配 intent 筛选器的任何恶意应用程序都可以拦截它。

冲击

劫持隐式意图允许攻击者读取或修改意图的内容,并拦截意图以执行操作。这可能会产生诸如泄露敏感信息/数据或启动攻击者控制的组件等后果。

缓解措施

通过调用 setPackage() 使 intent 显式化,如以下代码片段所示:

 val intent = Intent("android.intent.action.CREATE_DOCUMENT").apply {
addCategory("android.intent.category.OPENABLE")
setPackage("com.some.packagename")
setType("*/*")
putExtra("android.intent.extra.LOCAL_ONLY", true)
putExtra("android.intent.extra.TITLE", "Some Title")
}

startActiviy(intent)

如果需要使用隐式意图,请省略不想公开的任何敏感信息或可变对象。当应用不确切知道哪个应用将解决操作(例如撰写电子邮件、拍照等)时,可能需要使用隐式意图。

5- 待定意图

PendingIntent 是对系统维护的令牌的引用。应用程序 A 可以将 PendingIntent 传递给应用程序 B,以允许应用程序 B 代表应用程序 A 执行预定义的操作;无论应用程序 A 是否仍然有效。

冲击

PendingIntent 可以是可变的,这意味着应用程序 B 可以按照 fillIn() 文档中描述的逻辑更新指定操作的内部意图。

换句话说,恶意应用可以修改 PendingIntent 的未填充字段,并允许访问易受攻击的应用程序的其他未导出组件。

缓解措施

  • 确保设置了 action、component 和 package 以避免最严重的漏洞:

  • 指定可变性:如果应用面向 API 级别 23+,则指定可变性

 val intent = Intent(intentAction)
// Or other component setting APIs e.g. setComponent, setClass
intent.setClassName(packageName, className)
PendingIntent pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
intent,
/* flags = */ PendingIntent.FLAG_IMMUTABLE
)

在 Android 11(API 级别 30)及更高版本上,您必须指定要使哪些字段可变,从而缓解此类意外漏洞。

6-意图重定向

当攻击者可以部分或完全控制用于在易受攻击的应用上下文中启动新组件的意图的内容时,就会发生意图重定向。

用于启动新组件的 intent 可以通过多种方式提供,最常见的是作为 extras 字段中的序列化 insign,或者封送到字符串并进行分析。对参数的部分控制也可能导致相同的结果。

冲击

影响可能会有所不同。攻击者可能会在易受攻击的应用中执行内部功能,或者它可能会访问私有组件,例如未导出的 ContentProvider 对象。

缓解措施

通常,不要公开与重定向嵌套意向相关的功能。在不可避免的情况下,请应用以下缓解方法:

  • 正确清理捆绑的信息。请务必记住检查或清除标志 (GRANT_URI_PERMISSIONS),并检查意图的重定向位置。 IntentSanitizer 可以帮助完成此过程。

  • 使用 PendingIntent 对象。这样可以防止导出组件,并使目标操作意图不可变。

应用可以使用 ResolveActivity 等方法检查意图的重定向位置:

val intent = getIntent()
// Get the component name of the nested intent.
val forward = intent.getParcelableExtra<Parcelable>("key") as Intent
val name: ComponentName = forward.resolveActivity(packageManager)
// Check that the package name and class name contain the expected values.
if (name.packagename == "safe_package" && name.className == "safe_class") {
// Redirect the nested intent.
startActivity(forward)
}

应用可以使用类似于以下内容的逻辑来使用 IntentSanitizer:

 val intent = IntentSanitizer.Builder()
.allowComponent("com.example.ActivityA")
.allowData("com.example")
.allowType("text/plain")
.build()
.sanitizeByThrowing(intent)
  • 检查 getCallingActivity() 是否返回非 null 值。恶意应用可以为此函数提供 null 值。

  • 假设 checkCallingPermission() 在所有上下文中都有效,或者该方法在实际返回整数时抛出异常。

对于以 Android 12(API 级别 31)或更高版本为目标平台的应用,您可以启用调试功能,在某些情况下,该功能可帮助您检测应用是否正在执行不安全的 intent 启动。

如果您的应用同时执行以下两项操作,系统将检测到不安全的 intent 启动,并发生 StrictMode 冲突:

  • 您的应用将嵌套的 intent 从已交付的 intent 的附加内容中解压缩。

  • 您的应用会立即使用该嵌套 intent 启动应用组件,例如将 intent 传递到 startActivity()、startService() 或 bindService() 中。

7-应用基于签名的权限

最大程度地减少应用请求的权限数。限制对敏感权限的访问可以降低无意中滥用这些权限的风险,提高用户采用率,并使应用不易受到攻击者的攻击。通常,如果应用运行不需要权限,请不要请求权限。请参阅评估应用是否需要声明权限的指南。

冲击

不要泄露受权限保护的数据。当您的应用通过 IPC 公开数据时,就会发生这种情况,而这些数据仅因您的应用有权访问该数据而可用。应用的 IPC 接口的客户端可能没有相同的数据访问权限。有关此问题的频率和潜在影响的更多详细信息,请参阅USENIX上发表的研究论文Permission Re-Delegation: Attacks and Defenses。

如果创建具有危险保护级别的权限,则需要考虑许多复杂性:

  • 权限必须具有一个字符串,该字符串简明扼要地向用户表达他们需要做出的安全决策。

  • 权限字符串必须本地化为多种不同的语言。

  • 用户可能会选择不安装应用程序,因为权限令人困惑或被视为有风险。

  • 当尚未安装权限的创建者时,应用程序可能会请求权限。

缓解措施

定义满足安全要求的最小权限集。对于大多数应用程序来说,创建新权限相对不常见,因为系统定义的权限涵盖了许多情况。在适当的情况下,使用现有权限执行访问检查。

如果需要新权限,请考虑是否可以使用签名保护级别完成任务。签名权限对用户是透明的,并且仅允许由与执行权限检查的应用程序相同的开发人员签名的应用程序进行访问。

如果仍需要创建新权限,请使用 <permission> 元素在应用清单中声明该权限。使用新权限的应用可以通过在其清单文件中添加 <uses-permission> 元素来引用它。您还可以使用 addPermission() 方法动态添加权限。

  • 在你控制或拥有的两个应用之间共享数据时

  • 这些权限不需要用户确认,而是检查访问数据的应用是否使用相同的签名密钥进行签名

<permission android:name="my_custom_permission_name"
android:protectionLevel="signature" />

8-自来水劫持

窃听劫持相当于 Android 应用程序的点击劫持 Web 漏洞:恶意应用通过覆盖层或其他方式遮盖 UI,诱使用户单击与安全相关的控件(确认按钮等)。在此页面上,我们区分了两种攻击变体:完全遮挡和部分遮挡。然而,窃听劫持可能有许多不同的形式和风险,我建议深入了解斗篷和匕首

冲击

窃听劫持攻击用于诱骗用户执行某些操作。影响取决于攻击者所针对的操作。

风险:完全遮挡

Android 安全之旅 (Vol1)

攻击者覆盖触摸区域以劫持触摸事件。

缓解

通过在代码中设置 View.setFilterTouchesWhenObscured(true) 来阻止覆盖层传递的触摸,从而缓解了完全遮挡。

这将阻止通过覆盖层传递的触摸。如果您更喜欢声明式方法,还可以在要保护的 View 对象的布局文件中添加 android:filterTouchesWhenObscured=“true”。或者,在喷气背包的情况下:

 val composeView = LocalView.current
DisposableEffect(key1 = Unit) {
composeView.filterTouchesWhenObscured = true
onDispose {
composeView.filterTouchesWhenObscured = false
}
}

注意:默认情况下,Android S(12,SDK 31)及更高版本会阻止来自其他 UID 的不受信任的重叠层的触摸事件,从而防止完全遮挡攻击。

风险:部分遮挡

Android 安全之旅 (Vol1)

触摸区域保持不被遮挡

缓解

  • 通过手动忽略具有FLAG_WINDOW_IS_PARTIALLY_OBSCURED标志的触摸事件,可以缓解部分遮挡。没有针对此方案的默认保护。

这种缓解措施可能会干扰良性应用。在某些情况下,无法推出此修复程序,因为当部分遮挡是由良性应用程序引起的时,它会对用户体验产生负面影响。

风险:自定义 Toast

攻击者可以使用 Toast.setView() 自定义 Toast 消息的外观。在 Android 10(API 级别 29)及更低版本上,恶意应用可能会从后台启动此类 Toast。

缓解措施

如果应用以 Android 11(API 级别 30)或更高版本为目标平台,系统会阻止后台自定义 Toast。但是,在某些情况下,可以使用 Toast 突发来规避此缓解措施,其中攻击者在前台对多个 Toast 进行排队,即使在应用进入后台后,它们也会继续启动。自 Android 12(API 级别 31)起,后台 Toast 和 Toast 突发攻击已完全缓解。

风险:活动三明治

如果恶意应用设法说服用户打开它,它仍然可以从受害应用启动活动,然后用自己的活动覆盖它,形成活动夹层并创建部分遮挡攻击。

缓解措施

请参阅部分遮挡的一般缓解措施。对于纵深防御,请确保不要导出不需要导出的活动,以防止攻击者夹入它们。

总结和展望

Android 安全之旅 (Vol1)

我们已经介绍了影响 Android 安全性的关键漏洞,重点介绍了平台使用不当。我们探讨了与平台交互的各个方面相关的风险,包括 Android 清单、可调试版本以及滥用 intent 等功能。

这是您成为安全忍者的第一步,相信我,从这里开始,旅程变得更加令人兴奋。在接下来的文章中,我们将一头扎进 OWASP 十大移动威胁,发现既可怕又有点搞笑的漏洞(当然,以书、安全专业的方式)。我们将解决从输入验证出错到不安全的通信的所有问题,甚至连信鸽都会脸红。

让我们去构建一些安全的应用程序,让 Android 世界成为一个更安全的地方,一次一行代码!

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年4月22日18:55:43
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Android 安全之旅 (Vol1)http://cn-sec.com/archives/2679177.html

发表评论

匿名网友 填写信息