Android 应用常见安全问题
背景:OWASP MASVS(Mobile Application Security Verification Standard 移动应用安全验证标准)是移动应用安全的行业标准。
一、MASVS-STORAGE:存储
1.1 不当暴露FileProvider目录
配置不当的 FileProvider
会无意中将文件和目录暴露给攻击者。根据配置,攻击者可以读写这些暴露的文件,进而导致敏感信息泄露,甚至在最坏的情况下导致任意代码执行。例如,如果应用的配置中设置了 <root-path>
,攻击者就可以访问数据库中存储的敏感信息或覆盖应用的原生库,从而导致任意代码执行。
1.2 日志信息泄露
应用将敏感数据打印到设备日志中。如果这些敏感信息暴露给恶意行为者,这些信息本身可能很有价值(例如用户的凭据或个人身份信息 (PII)),或者可能促成进一步的攻击。
1.3 路径遍历
当攻击者可以控制路径的一部分,而该路径在未经验证的情况下被传递给文件系统 API 时,就会发生路径遍历漏洞。这可能导致未经授权的文件系统操作。例如,攻击者可能会使用特殊字符,例如 ../
,通过遍历到目标目录之外,意外地更改资源目标。通常会导致文件覆盖(写入文件时)、数据泄露(读取文件时)或权限更改(更改文件或目录权限时)。
1.4 敏感数据存储在外部存储中
如果敏感数据存储在外部存储上,则设备上任何具有 READ_EXTERNAL_STORAGE 权限的应用都可以访问它。这使得恶意应用能够静默访问永久或临时存储在外部存储上的敏感文件。此外,由于外部存储上的内容可以被系统上的任何应用访问,任何声明了 WRITE_EXTERNAL_EXTERNAL_STORAGE 权限的恶意应用都可以篡改外部存储上的文件,例如包含恶意数据。如果将此恶意数据加载到应用中,则可能用于欺骗用户甚至实现代码执行。
在需要从外部存储加载数据或代码到应用中的情况下,建议执行完整性检查,以验证其他应用是否篡改了这些数据或代码。文件的哈希值应以安全的方式存储,最好是加密后存储在内部存储中。
1.5 WebViews - 不安全的文件包含
文件包含的影响取决于在 WebView 中配置的 WebSettings。过于宽泛的文件权限可能允许攻击者访问本地文件并窃取敏感数据、PII(个人身份信息)或应用私有数据。启用 JavaScript 执行可能允许攻击者在 WebView 内或在用户的设备上运行 JavaScript。onShowFileChooser
方法选择的文件可能会损害用户安全,因为该方法或 WebView 无法确保文件来源是可信的。
1.6 Zip路径遍历
Zip 路径遍历漏洞,也称为 ZipSlip,与处理压缩档案有关。以 ZIP 格式为例,类似的问题也可能出现在处理其他格式(如 TAR、RAR 或 7z)的库中。
此问题的根本原因是,在 ZIP 档案中,每个打包的文件都存储有一个完全限定名称,该名称允许包含斜杠和点等特殊字符。来自 java.util.zip
包的默认库不检查档案条目的名称中是否包含目录遍历字符 (../
),因此在将从档案中提取的名称与目标目录路径连接时必须格外小心。
验证来自外部来源的任何 ZIP 提取代码片段或库非常重要。Zip 路径遍历漏洞可用于实现任意文件覆盖。
二、MASVS-CRYPTO:加密
2.1 已损坏或有风险的加密算法
无意中实现弱或过时的加密算法时,就会产生重大风险。这种漏洞源于这些算法的固有弱点,拥有必要计算能力或知识的恶意攻击者可以利用这些弱点。此类利用的后果可能非常严重,可能导致未经授权的访问、数据泄露以及敏感信息的篡改。
使用弱或已损坏的加密哈希函数(例如 MD5
或 SHA1
)对数据的安全性和完整性构成重大风险。哈希函数旨在为输入数据创建唯一的、固定长度的“指纹”(哈希值),使其可用于多种目的,包括数据完整性验证、密码存储和数字签名。但是,如果使用弱或已遭破解的哈希函数,则可能会出现多种漏洞。
使用弱或已损坏的加密函数(例如 DES
或 RC4
)会对敏感数据的保密性构成严重风险。加密旨在通过将信息转换为不可读格式来保护信息,但如果加密算法存在缺陷,则这些保护措施可能会被绕过。
使用弱或已损坏的加密签名函数(例如 RSA-PKCS#1 v1.5 或基于弱哈希函数的函数)对数据和通信的完整性构成严重风险。数字签名旨在提供身份验证、不可否认性和数据完整性,确保消息或文档源自特定发送者且未经篡改。但是,当底层签名算法存在缺陷时,这些保证可能会受到损害。
2.2 硬编码的加密密钥
密钥存储通常未得到充分利用,并且常见的做法是将它们硬编码到应用程序中,作为代码中的字符串或字节数组,或者作为资产文件(如 strings.xml
)中的一部分。有权访问逆向工程工具的攻击者可以非常容易地检索到硬编码的密钥。
2.3 弱PRNG
伪随机数生成器 (PRNG) 是一种算法,它根据称为种子的起始值生成可预测的数字序列。PRNG 生成的数字序列具有与真随机数序列近似相同的属性,但生成速度更快,计算成本也更低。
弱 PRNG 漏洞发生在开发者将普通 PRNG 用于加密目的时,而不是使用密码学安全伪随机数生成器 (CSPRNG)。CSPRNG 有更严格的要求,当种子未知时,它们必须只给攻击者在区分输出序列与实际随机序列方面带来微不足道的优势。
如果在身份验证等安全上下文中使用非密码学安全的 PRNG,攻击者可能猜出随机生成的数字并获得对特权数据或功能的访问权限。
三、MASVS-NETWORK:网络通信
3.1 明文通信
当 Android 应用通过网络发送或接收明文数据时,任何监控网络的人都可以拦截并读取这些数据。如果这些数据包含密码、信用卡号或个人消息等敏感信息,则可能导致身份盗窃、金融欺诈和其他严重问题。
例如,以明文形式传输密码的应用可能会将这些凭据暴露给拦截流量的恶意攻击者。然后,这些数据可能会被用于未经授权地访问用户的账户。
3.2 不安全的DNS设置
不安全的 DNS 配置可能在开发者自定义应用的 DNS 传输行为、绕过设备默认设置或用户在 Android 9 及更高版本中指定私有 DNS 服务器时发生。偏离已知良好 DNS 配置可能使用户容易受到 DNS 欺骗或 DNS 缓存污染等攻击,从而使攻击者将用户流量重定向到恶意网站。
如果恶意网络攻击者能够欺骗 DNS,他们可以在不引起用户怀疑的情况下,隐秘地将用户重定向到他们控制的网站。例如,这个恶意网站可能会网络钓鱼用户的个人身份信息,对用户造成拒绝服务,或者在用户不知情的情况下将用户重定向到其他网站。
3.3 不安全的下载管理器
DownloadManager 是在 API level 9 中引入的一个系统服务。它处理长时间运行的 HTTP 下载,并允许应用作为后台任务下载文件。其 API 处理 HTTP 交互,并在失败、连接更改或系统重启后重试下载。DownloadManager 存在安全相关漏洞,使其成为在 Android 应用中管理下载的不安全选择。
使用 DownloadManager 可能通过利用外部存储的 WRITE 权限导致漏洞。由于 android.permission.WRITE_EXTERNAL_STORAGE 权限允许对外部存储进行广泛访问,攻击者可能静默修改文件和下载内容,安装潜在恶意应用,拒绝核心服务,或导致应用崩溃。恶意行为者还可以操纵发送给 Uri.parse() 的内容,导致用户下载有害文件。
四、MASVS-PLATFORM:平台交互
4.1 内容解析器
ContentResolver
是一个“为应用提供对内容模型访问权限的类”。ContentResolver 公开用于与【已安装的应用 (content://
URI scheme)、文件系统 (file://
URI scheme)、Android 提供的支持 API (android.resource://
URI scheme)】进行交互、获取或修改的方法。
滥用使用 file://
URI 漏洞的 ContentResolver
利用了 ContentResolver
返回 URI 所描述的文件描述符的功能。此漏洞影响 ContentResolver
API中的函数,例如 openFile()
、openFileDescriptor()
、openInputStream()
、openOutputStream()
或 openAssetFileDescriptor()
。该漏洞可以通过完全或部分由攻击者控制的 file://
URI 进行滥用,强制应用访问本来无权访问的文件,例如内部数据库或共享偏好设置。
一种可能的攻击场景是创建一个恶意的图库或文件选择器,当被有漏洞的应用使用时,会返回一个恶意的 URI。
4.2 隐式Intent劫持
当应用在调用 Intent 时未指定完全限定的组件类名或软件包时,会发生隐式 Intent 劫持漏洞。这会导致恶意应用注册 Intent 过滤器来截获该 Intent,而非由目标应用处理。
根据 Intent 内容,攻击者可以读取或修改敏感信息,或与可变对象(例如可变的PendingIntent 或 Binder)进行交互。
劫持隐式 Intent 还可能让攻击者执行任意操作,例如启动攻击者控制的组件。
4.3 不安全的API使用
许多移动应用使用外部 API 来提供功能。传统上,使用静态令牌或密钥来验证连接到服务的应用。然而,在客户端-服务器设置(或移动应用和 API)的环境中,使用静态密钥通常不被视为访问敏感数据或服务的安全身份验证方法。与内部基础设施不同,任何人只要拥有该密钥,就可以访问外部 API 并滥用该服务。
例如,静态密钥可能通过逆向工程从应用中获取,或者在移动应用与外部 API 通信时被拦截。此外,静态密钥也更有可能被硬编码到应用中。
当未使用足够安全的身份验证和访问控制时,API 数据和服务就会面临风险。
使用静态密钥时,攻击者可以在不受任何时间限制的情况下,通过重放请求或使用(被拦截或逆向工程获取的)密钥构造新请求来利用 API。
4.4 不安全的广播接收器
不当实现的广播接收器可能允许攻击者发送恶意 Intent,使存在漏洞的应用执行原本不打算供外部调用方执行的操作。
该漏洞通常指广播接收器被意外导出,具体方法包括在 AndroidManifest 中设置 android:exported="true",或者以编程方式创建广播接收器(默认情况下会使接收器变为公开)。如果接收器不包含任何 intent 过滤器,默认值为 "false"
;但如果接收器包含至少一个 intent 过滤器,则 android:exported 的默认值为 "true"
。
4.5 Intent重定向
Intent 重定向是指攻击者可以在易受攻击的应用上下文中,部分或完全控制用于启动新组件的 intent 的内容。用于启动新组件的 intent 可以通过多种方式提供,最常见的方式是作为序列化的 intent 放在 extras
字段中,或者 marshaled 成字符串再解析。参数的部分控制也可能导致相同结果。
4.6 基于权限的导出组件访问控制
Android 权限是在应用的清单中声明的字符串标识符,用于请求访问受限数据或操作,并在运行时由 Android 框架强制执行。
与基于权限的访问控制相关的漏洞发生在应用的组件(例如 activity、receiver、content provider 或 service)满足以下所有条件时
- 组件未在
Manifest
中关联任何android:permission
; - 该组件执行一项敏感任务,而执行该任务所需的权限用户已经批准;
- 该组件已导出;
- 该组件未执行任何手动(清单或代码级别)权限检查;
发生这种情况时,恶意应用可以通过滥用易受攻击组件的权限来执行敏感操作,将易受攻击应用的权限代理给恶意应用
4.7 Pending Intent
一个 PendingIntent 是系统维护的令牌引用。应用 A 可以将 PendingIntent 传递给应用 B,以便应用 B 代表应用 A 执行预定义操作,无论应用 A 是否仍然存活。
PendingIntent 可以是可变的,这意味着应用 B 可以按照 fillIn() 文档中描述的逻辑来更新指定操作的内部 Intent。换句话说,恶意应用可以修改 PendingIntent 中未填充的字段,从而访问受漏洞影响应用中原本不可导出的组件。
除非设置了 FLAG_ONE_SHOT 标志,否则 PendingIntent 可以被重放。务必使用 FLAG_ONE_SHOT 来避免重放攻击(执行不应重复的操作)。
4.8 待处理Intent的发送方
使用 PendingIntent.getCreator*() 或 PendingIntent.getTarget*() 来判断是否信任 PendingIntent 的发送方会产生利用风险。
PendingIntent.getCreator*() 或 PendingIntent.getTarget*() 返回 PendingIntent 的创建方,它并不总是与发送方匹配。创建方可能受到信任,但发送方永远不应受到信任,因为发送方可能是恶意应用,它通过各种机制获取了另一个应用的 PendingInten
4.9 粘性广播
Android 应用和 Android 系统可以使用广播作为消息传递系统,以通知其他应用它们可能感兴趣的事件。粘性广播是一种特殊的广播类型,其发送的 Intent 对象在广播完成后仍保留在缓存中。系统可以将粘性 Intent 重新广播给稍后注册的接收器。不幸的是,粘性广播 API 存在许多与安全相关的缺点,因此已在 Android 5.0(API 级别 21)中被弃用。
4.10 StrandHogg攻击/任务亲和力漏洞
StrandHogg 攻击 / 任务亲和力漏洞是由 Android 处理多任务的方式中的设计缺陷导致/促成的,特别是称为“任务重新关联”(task reparenting)的功能。应用任务重新关联是一种允许应用将 Activity 从一个任务移动到另一个任务的功能。
StrandHogg 攻击利用了对如何审查传入的应用任务堆栈 Activity 的不明确之处,并允许恶意应用进行以下操作:
-
将恶意 Activity 移入或移出受害者堆栈
-
在受害者 Activity 完成后,将恶意 Activity 设置为返回堆栈
通过操纵 allowTaskReparenting
和 taskAffinity
设置来利用此漏洞。
4.11 点击劫持
触屏劫持(Tapjacking)是 Android 应用中与 点击劫持(clickjacking)网页漏洞 等效的一种攻击:恶意应用通过使用覆盖层或其他方式模糊 UI,欺骗用户点击安全相关的控件(例如确认按钮)。两种攻击变体:完全遮挡和部分遮挡。在完全遮挡中,攻击者覆盖触摸区域;而在部分遮挡中,触摸区域保持清晰。
4.12 不安全地使用深层链接
与深层链接相关的安全风险源于其核心能力:实现移动应用内的无缝导航和交互。深层链接漏洞是由深层链接实现或处理中的弱点引起的。恶意攻击者可以利用这些缺陷访问特权功能或数据,从而可能导致数据泄露、隐私侵犯和未经授权的操作。攻击者可以通过各种技术利用这些漏洞,例如深层链接劫持和数据验证攻击。
4.13 WebView - 原生桥接
原生桥接(有时也称为 JavaScript 桥接)是一种通过使用 addJavascriptInterface 方法实现 WebView 和原生 Android 代码之间通信的机制。这允许在 WebView 中运行的 JavaScript 代码与 Android 应用的 Java 代码之间进行双向通信。addJavascriptInterface
方法将一个 Java 对象暴露给 WebView 的所有帧,任何帧都可以访问该对象名称并调用其方法。但是,应用无法验证 WebView 内调用帧的来源,这会引发安全问题,因为内容的信任度是不确定的。
原生桥接也可以使用 Android 的 WebViewCompat.postWebMessage 或 WebMessagePort.postMessage 通过 HTML 消息通道实现,与 JavaScript Window.postMessage 进行通信。WebViewCompat.postWebMessage
和 WebMessagePort.postMessage
可以接受通过 Window.postMessage
发送的 JavaScript 消息,这些消息将在 WebView 中执行。
原生桥接存在多种风险
-
基于 JavascriptInterface 的桥接
-
The
addJavascriptInterface
method injects a supplied Java object into every frame of the WebView, including iframes, which means it is susceptible to attack by malicious third parties injecting frames into a legitimate website. Applications targeting API level 16 or earlier are particularly at risk of attack because this method can be used to allow JavaScript to control the host application. -
在启用了原生桥接的 WebView 中反映不受信任的用户提供的内容,可能导致跨站脚本 (XSS) 攻击。
-
-
基于 MessageChannel 的桥接
-
消息通道端点缺少来源检查,这意味着会接受来自任何发送方的消息,包括包含恶意代码的消息。
-
有可能意外地将 Java 暴露给任意 JavaScript。
-
4.14 android:debuggable
android:debuggable
属性用于设置应用是否可调试。此属性作用于整个应用,无法由单个组件覆盖。默认情况下,此属性设置为 false
。
允许应用自身可调试并非漏洞,但这样做会通过意外和未经授权访问管理功能而使应用面临更大的风险。这可能会使攻击者比预期获得更多访问应用和应用所用资源的权限。
4.15 android:exported
android:exported
属性用于设置其他应用的组件(activity、服务、广播接收器等)是否可以启动某个组件
-
如果设置为
true
,则任何应用都可以通过确切的类名访问并启动此 activity。 -
如果设置为
false
,则只有同一应用的组件、具有相同用户 ID 的应用或特权系统组件才能启动此 activity。
该属性默认值背后的逻辑随着时间推移而变化,并且根据组件类型和 Android 版本而有所不同。例如,在 API 级别 16 (Android 4.1.1) 或更低版本中,<provider>
元素的值默认设置为 true
。未显式设置此属性可能会导致某些设备上的默认值不同。
五、MASVS-CODE:代码质量
5.1 跨应用脚本攻击
WebView 是 Android 应用中嵌入的浏览器组件,用于在应用内显示网页内容。它在应用的用户界面中渲染 HTML、CSS 和 JavaScript。当应用接受恶意 JavaScript 到 WebView 中,但没有进行充分的验证或清理时,应用就容易受到应用间脚本攻击。
当攻击者控制的 JavaScript 内容未经验证或清理就被传递给易受攻击应用的 WebView 时,应用间脚本攻击漏洞就会被利用。因此,攻击者提供的 JavaScript 代码会在受害者应用的 WebView 上下文中执行。恶意 JavaScript 代码随后可以使用与受害者应用相同的权限,这可能导致敏感用户数据被盗和账户劫持。
5.2 自定义权限
自定义权限相关的风险出现在自定义权限定义缺失或拼写错误时,或者当相应的 android:protectionLevel
属性在 Manifest 中被误用时。
例如,可以通过恶意应用创建同名但定义了不同保护级别的自定义权限来利用这些风险。
自定义权限旨在实现与其他应用共享资源和功能。自定义权限的合法用途示例如下:
-
控制两个或多个应用之间的进程间通信 (IPC)
-
访问第三方服务
-
限制对应用共享数据的访问
5.3 createPackageContext
当开发者希望在自己的应用中为另一个应用创建上下文时,会使用 createPackageContext 方法。
例如,如果开发者想获取第三方应用的资源或调用其方法,他们会使用 createPackageContext
。
然而,如果应用使用 CONTEXT_IGNORE_SECURITY 和 CONTEXT_INCLUDE_CODE 标志调用 createPackageContext
,然后调用 getClassLoader(),这可能导致应用容易受到恶意应用的代码执行攻击。例如,当攻击者冒充开发者预期会出现在用户设备上的未声明的包名(包名抢占,package squatting)时,就可能发生这种情况。
5.4 动态代码加载
将代码动态加载到应用中会带来需要缓解的风险。攻击者可能会篡改或替换代码,以访问敏感数据或执行恶意操作。
如果攻击者设法访问将加载到应用中的代码,他们可以修改代码以达到其目的。这可能导致数据泄露和代码执行攻击。即使攻击者无法修改代码以执行其选择的任意操作,他们仍然可能损坏或移除代码,从而影响应用的可用性。
5.5 不当信任ContentProvider提供的文件名
FileProvider 是 ContentProvider 的一个子类,旨在为应用(“服务器应用”)与另一应用(“客户端应用”)共享文件提供一种安全的方法。但是,如果客户端应用未能正确处理服务器应用提供的文件名,则受攻击者控制的服务器应用可能会实施其自己的恶意 FileProvider,以覆盖客户端应用的特定于应用的存储空间中的文件。
如果攻击者可以覆盖应用的文件,这可能导致恶意代码执行(通过覆盖应用的代码),或允许修改应用的行为(例如,通过覆盖应用的共享偏好设置或其他配置文件)。
5.6 不安全的API或库
使用不安全的 API 或库会显著降低应用的安全防护能力。这些依赖项中的任何一个发生安全漏洞都可能允许攻击者利用多种途径进行广泛的攻击,例如中间人 (MitM) 攻击和远程代码执行 (RCE)。
当开发者未将安全评估和漏洞测试整合到软件开发生命周期 (SDLC) 中,或者在某些情况下未针对应用依赖项实施自动化更新策略时,就会出现实现不安全依赖项的威胁。
依赖项漏洞利用通常始于分析应用二进制文件 (.apk) 以搜索存在漏洞的库。此时,会执行开源情报 (OSINT) 来挖掘先前发现的、可能被利用的漏洞。攻击者随后可以利用公开披露的漏洞信息(例如常见漏洞和披露 (CVE))来进行进一步攻击。
5.7 不安全的机器到机器通信设置
应用程序实现允许用户通过射频 (RF) 通信或有线连接传输数据或与其他设备交互的功能并不罕见。为此目的,Android 中最常用的技术是经典蓝牙 (Bluetooth BR/EDR)、低功耗蓝牙 (BLE)、Wifi P2P、NFC 和 USB。
这些技术通常用于需要与智能家居配件、健康监测设备、公共交通自助服务终端、支付终端以及其他 Android 设备通信的应用中。
与任何其他通道一样,机器到机器通信容易受到旨在破坏两个或多个设备之间建立的信任边界的攻击。恶意用户可以利用设备伪造等技术对通信通道发动多种攻击。
Android 为开发者提供了配置机器到机器通信的特定 API。
这些 API 应谨慎使用,因为实现通信协议时出错可能导致用户或设备数据泄露给未经授权的第三方。在最糟糕的情况下,攻击者可能能够远程控制一个或多个设备,从而完全访问设备上的内容。
5.8 备份安全最佳实践
应用备份旨在保留用户数据,以便日后将其恢复到新设备或在数据丢失的情况下恢复。关于应用备份的现有安全建议是微妙的,因 Android 版本和设备制造商而异。共同的主题是,这些建议旨在确保不泄露任何敏感数据。
标准 Android 备份系统为应用提供了一种最安全、最可靠且最简单的解决方案,可将数据备份到云端或通过自动备份(此功能默认启用,无需实施工作即可使用,且可进行扩展)和键值对备份将数据传输到新设备。我们建议使用此解决方案,因为它会将生成的备份数据存储在其他第三方应用无法访问的目录中,并且支持静态加密、传输中加密以及允许从备份中排除敏感数据的配置。
如果应用实施的备份解决方案不依赖于标准 Android 备份系统,则可能会增加因失误导致敏感数据泄露的可能性。将用户数据暴露于泄露风险的非标准备份解决方案示例包括提供“导出”或“备份”功能的应用,这些功能会在其他应用可读取的目录中创建应用数据的副本,因此容易被泄露(直接泄露或通过其他漏洞泄露)。
5.9 安全剪贴板处理
Android 提供了一个强大的框架,称为剪贴板,用于在应用之间复制和粘贴数据。对此功能的不当实现可能会将用户相关数据暴露给未经授权的恶意行为者或应用。
与剪贴板数据暴露相关的具体风险取决于应用的性质及其处理的个人身份信息 (PII)。对于金融应用而言,影响尤其高,因为它们可能暴露支付数据,或者处理双因素身份验证 (2FA) 代码的应用。
5.10 SQL注入
SQL 注入通过向 SQL 语句插入代码来利用易受攻击的应用,从而访问底层数据库超出其有意公开接口的部分。这种攻击可能暴露私人数据、破坏数据库内容,甚至危及后端基础设施。
通过在执行前连接用户输入动态创建的查询,SQL 可能会受到注入攻击(如:'OR 1=1–)。SQL 注入针对网络、移动端和任何 SQL 数据库应用。
SQL 注入可以暴露敏感的用户或应用数据,绕过身份验证和授权限制,并使数据库容易受到损坏或删除。其影响可能对个人数据被暴露的用户产生危险和持久的后果。应用和服务提供商面临丢失知识产权或用户信任的风险。
5.11 测试/调试功能
发布包含测试或调试功能的生产版本可能会对应用的安全状况产生负面影响。这些功能旨在帮助开发者在新版本发布之前或之后发现并识别应用预期用例中的错误,不应公开访问。
应用中任何测试或调试功能的执行应仅限于有限的过渡版本集,以便只有开发者才能在受控环境中调试或测试应用功能。
5.12 不安全的反序列化
存储或传输大量 Java 对象数据时,通常先对数据进行序列化会更高效。接收应用、activity 或 provider 在处理数据时会对数据进行反序列化。正常情况下,数据在没有任何用户干预的情况下进行序列化和反序列化。但是,反序列化过程与其预期对象之间的信任关系可能被恶意行为者滥用,他们可以例如拦截和修改序列化对象。这会使恶意行为者能够执行拒绝服务 (DoS)、权限提升和远程代码执行 (RCE) 等攻击。
5.13 不安全的HostnameVerifier
HostnameVerifier实现负责验证服务器证书中的主机名是否与客户端尝试连接的服务器主机名匹配。Android 应用中不安全的 HostnameVerifier 实现是指未能正确验证应用正在与其通信的服务器的主机名的实现。这可能允许攻击者冒充合法服务器,诱骗应用将敏感数据发送给攻击者。
存在此漏洞是因为 HostnameVerifier
类中包含一些函数调用,这些调用可以跳过 X.509 证书主机名验证,而仅验证证书哈希。一个常见的误解是 SSLSession#isValid 函数会执行与安全相关的操作,而实际上它的目的只是检查会话是否有效以及是否可用于恢复或加入;这两者都不会验证会话的*安全性*。
5.14 不安全的X509TrustManager
X509TrustManager
类负责验证远程服务器的真实性。它通过验证服务器证书来实现此目的。
Android 应用中不安全的 X509TrustManager
实现是指未正确验证应用通信服务器真实性的实现。这可能允许攻击者冒充合法服务器,并诱骗应用将敏感数据发送给攻击者。
存在此漏洞的原因在于,通过使用 X509TrustManager 类,Java/Android 允许完全覆盖服务器验证。 X509TrustManager
类有两个重要函数:checkServerTrusted() 和 getAcceptedIssuers()。可以将这些函数调用配置为信任所有 X.509 证书。最后,自定义验证逻辑可能存在错误或不完整,并允许意外连接。在所有这些情况下,此类别的目的都已无效,基于 X509TrustManager
输出建立的网络连接是不安全的。
5.15 原生代码使用
Android 应用可以利用以 C 和 C++ 等语言编写的原生代码来实现特定功能。然而,当应用使用 Java Native Interface (JNI) 与此原生代码交互时,可能会暴露自身于原生代码实现中可能存在的漏洞,例如缓冲区溢出和其他问题。
5.16 XML外部实体注入
XML 外部实体注入 (XXE) 是针对解析 XML 输入的应用的攻击。当配置薄弱的 XML 解析器处理包含外部实体引用的不可信 XML 输入时,就会发生 XXE 攻击。此攻击可用于引发多起事件,包括拒绝服务、文件系统访问或数据泄露。
当应用解析 XML 文档时,它可以处理文档中包含的任何 DTD(文档类型定义,也称为外部实体)。攻击者可以利用此行为,将恶意代码注入为 DTD。然后,此代码可以访问设备文件系统的某些部分,这些部分仅对应用可见,并可能包含敏感数据。此外,此恶意代码可以从设备发出请求,可能绕过外围安全措施。
5.17 WebView-不安全的URI加载
当 Android 应用未能正确评估 URI 的有效性便将其加载到 WebView 时,就会发生不安全的 URI 加载。
将恶意 URI(即绕过过滤/白名单的 URI)加载到 WebView 的情况下,可能导致账户被盗(例如,使用网络钓鱼)、代码执行(例如,加载恶意 JavaScript)或设备被入侵(通过超链接传递利用代码)。
参考链接:降低应用中的安全风险 | 安全 | Android 开发者