跳到正文
npaka · AI与游戏开发技术· 来源·· 1 小时前AI 评分15

Android应用开发安全指南:防网络攻击与信息泄露要点

Androidアプリ開発のセキュリティ対策 - サイバー攻撃と情報漏洩を防ぐための注意点

正文 · AI 翻译

总结了Android应用开发的安全对策。

目次

  1. 1. 前言
  2. 2. Android安全的基础知识
  3. 3. 文件的存储位置与访问权限
  4. 3-1. 主要存储位置
  5. 3-2. 文件的公开范围
  6. 4. Google的备份、同步与共享
  7. 4-1. 主要机制
  8. 4-2. 控制备份对象
  9. 4-3. 云访问控制与加密
  10. 5. 机密信息的保存与加密

1. 引言

Android 具备操作系统级别的安全功能,如应用沙箱、应用签名和数据加密。

然而,如果应用的实现存在问题,可能会导致个人信息或认证信息泄露,或者服务器遭受非法访问。此外,还需要注意 Google 的备份功能、应用间的数据共享、外部库以及开发环境的管理。

本次将从数据保存、通信、认证、信息共享和开发环境等角度,介绍确保 Android 应用安全开发与运营的安全措施。

2. Android 安全基础

Android 提供了多种机制来保护应用和用户数据。

主要的安全功能如下。

・沙盒:为每个应用分配不同的Linux UID,隔离数据与进程
・应用签名:利用应用签名验证更新来源的完整性等
・SELinux:限制对操作系统和应用进程的访问
・基于文件的加密:对设备内的数据进行加密
・Android Keystore:安全管理加密密钥
・权限控制:控制对摄像头、麦克风、位置信息等资源的访问
・Google Play Protect:在支持的设备上检测恶意应用

通过这些机制,限制了对其他应用数据的非法访问。

然而,这并不能自动防止以下问题。

・解析应用中嵌入的API密钥
・对服务器API的非法访问
・因实现错误导致个人信息泄露
・通过外部库引发的信息泄露
・设备被入侵或应用被篡改

区分Android的保护范围与开发者自身需采取对策的范围至关重要。

3. 文件的保存位置与权限

Android应用的数据根据其存储位置,对其他应用的访问范围以及备份处理方式有所不同。

3-1. 主要存储位置

・filesDir:应用专用的内部文件。通常作为备份对象
・cacheDir:可重新生成的缓存。不作为备份对象
・noBackupFilesDir:希望从备份中排除的应用专用文件
・DataStore:应用配置及小规模数据。默认情况下不加密
・Room / SQLite:用于保存结构化数据的数据库
・getExternalFilesDir():应用专用的外部存储区域
・MediaStore / SAF:由用户管理的照片、视频、文档等
・Android Keystore:用于管理加密密钥

高机密性数据原则上使用应用专用的内部存储。

由于外部存储可能会根据用途被其他应用或用户访问,因此需注意公开范围。

3-2. 文件的公开范围

在Android中,内部存储的文件原则上无法被其他应用直接访问。

但是,使用ContentProvider或FileProvider等组件时,可以与其他应用共享数据。

请特别注意以下几点:

・不要随意将内部文件公开到外部
・使用FileProvider等进行文件共享
・限定要共享的文件或URI范围
・仅向必要的对象临时授予访问权限
・不在共享存储中以明文形式保存机密信息

例如,对内部文件的访问方式如下。

context.openFileOutput(
    "data.txt",
    Context.MODE_PRIVATE
).use {
    it.write(data)
}

MODE_PRIVATE 用于创建仅限本应用使用的文件。但仅靠此指定并不会对文件内容进行应用专属的加密。

4. Google 的备份、同步与共享

在 Android 中,您可以使用 Google 的备份功能保存应用数据,或通过云服务进行同步和共享。

然而,备份、同步和共享是三种不同的功能。

4-1. 主要机制

・Auto Backup:将支持的应用数据备份到云端
・设备间数据传输:更换机型时迁移应用数据
・Google Drive:用户将文件保存到云端并共享
・Firebase / Firestore:由应用实现的云同步与共享
・Google 密码管理器:管理并同步支持的密码和密码密钥

例如,即使保存在 filesDir 中的数据包含在 Auto Backup 中,这并不意味着它会自动成为 Google Drive 上的共享文件。

4-2. 备份目标的控制

在Android中,可以通过配置文件来控制备份目标。

特别注意以下设置:

・android:allowBackup:关于是否允许备份的设置
・android:dataExtractionRules:Android 12及更高版本的云备份、设备间传输等规则
・android:fullBackupContent:面向Android 11及更低版本的备份规则

根据需要对机密信息和设备特定信息进行排除,不将其纳入备份范围。

此外,仅设置 allowBackup="false" 并不能完全控制所有设备间传输,因此还需要针对操作系统版本和设备制造商进行相应的行为确认。

4-3. 云端的访问控制与加密

Google的备份功能包含加密机制,但并非所有数据都以相同条件进行端到端加密。

此外,在使用Firebase等服务共享数据时,需要在应用侧设置访问控制。

・通过Firestore Security Rules等限制访问权限
・不单纯信任用户ID,而是验证认证状态
・根据需要对机密信息在应用侧进行加密
・考虑是否备份加密密钥
・确认取消共享或注销时的数据删除

特别是使用Android Keystore生成的密钥,通常无法恢复到备份目标的其他设备上。

还需注意仅加密文件被恢复但无法解密的问题。

5. 机密信息的保存与加密

在应用内处理的信息,根据其机密性选择相应的保存方法。

5-1. 基于 Android Keystore 的密钥管理

Android 提供了用于管理加密密钥的“Android Keystore”。

・不在明文状态下保存密码或认证令牌
・使用 Android Keystore 管理加密密钥
・根据需要利用硬件级别的密钥保护
・删除不再需要的认证信息
・确认密钥失效及终端迁移时的行为

Android Keystore 是用于管理加密密钥的机制,并非用于直接保存任意密码或文件的通用存储。

例如,应用专属的认证令牌使用由 Keystore 保护的密钥进行加密,并将密文保存至 DataStore 等位置。

此外,传统的 EncryptedSharedPreferences 和 MasterKey 已被标记为不推荐。在新开发中,建议使用 Android Keystore 和标准加密 API 等,并根据需要考虑采用 Google Tink。

5-2. 加密与硬件保护

Android 支持使用 AES-GCM 等标准加密方式。

此外,在支持的终端设备上,可以将加密密钥保护在 TEE(可信执行环境)或 StrongBox 中。

・Android Keystore:用于生成、使用和管理的加密密钥
・TEE:与普通操作系统隔离的执行环境
・StrongBox:可在支持的设备上使用的专用安全硬件
・Google Tink:用于实现安全加密处理的库

硬件保护的对应情况因设备而异。

基本做法是不创建自定义加密算法,而是使用标准的安全方式。

6. 网络通信与API的保护

在应用与服务器之间的通信中,必须防止窃听、篡改和认证信息泄露。

6-1. HTTPS 与 Network Security Configuration

在 Android 中,可以利用“Network Security Configuration”来管理网络通信的安全设置。

・API通信需使用HTTPS
・原则上禁止明文HTTP通信
・不得禁用TLS证书验证
・不得忽略证书错误
・不得在正式环境中保留用于调试的通信配置

例如,禁止明文HTTP通信的配置如下所示。

<network-security-config>
    <base-config
        cleartextTrafficPermitted="false" />
</network-security-config>

针对Android 9(API级别28)及以上版本的应用,标准网络API的明文HTTP通信默认受到限制。不过,对于自定义通信实现等场景,仍需另行确认。

此外,HTTPS是一种保护通信路径的机制,并不能防止对API本身的非法访问。

6-2. API密钥的管理

包含在APK或AAB中的代码和资源有可能通过解析被读取。

・不要将用于服务器的秘密API密钥嵌入到应用中
・即使隐藏在BuildConfig或strings.xml中,也无法保证保密性
・即使嵌入到NDK的原生代码中,也无法完全隐藏
・需要秘密密钥的API应通过后端调用
・对于公开前提的API密钥,请设置应用限制和API限制

即使进行混淆处理,也无法完全隐藏包含在应用中的秘密信息。

6-3. 服务器端的对策

在服务器端,还需要采取以下措施。

・针对每个API的认证与授权
・速率限制与异常访问检测
・对数据库访问权限的限制
・针对SQL注入等输入攻击的对策
・根据需要利用Play Integrity API

Play Integrity API提供用于判断应用或终端完整性的信息。

不过,这并不能完全检测出不正利用,也不能替代用户认证或服务器端的访问控制。

7. 认证与访问控制

即使具备登录功能,如果认证或访问权限的验证存在问题,他人的信息也可能被获取。

7-1. 安全的认证方式

・考虑使用 Passkey 或 Credential Manager
・在 OAuth 2.0 中,面向原生应用使用 PKCE
・登录时使用可信的外部浏览器等
・为访问令牌设置适当的有效期
・登出时执行必要的令牌吊销处理
・区分基于 BiometricPrompt 的设备内认证与服务器认证

Android 的 Credential Manager 是一种统一处理密码、通行密钥等认证方法的机制。

此外,BiometricPrompt 可用于利用指纹或面部等进行的设备端身份验证,但这并不能保证服务器端的访问权限。

7-2. 服务器端的授权

例如,假设存在以下 API。

GET /api/users/123/profile

如果仅将用户 ID 更改为 124 就能获取他人的信息,则访问控制存在问题。

在 API 中,不仅需要验证认证状态,还需要在服务器端验证是否有权访问操作对象的数据。

仅在屏幕上隐藏按钮无法防止非法操作。

8. 应用间信息共享与WebView

在Android中,通过沙箱机制限制了应用间的相互访问,但可以通过Intent等方式传递数据。

8-1. 应用间信息共享

主要的共享功能包括以下几项:

・Intent:用于请求其他应用或组件执行处理
・ContentProvider:向其他应用提供数据
・FileProvider:通过URI安全地共享文件
・App Links:将网站与应用关联起来
・Deep Links:从URL等来源启动应用内的界面
・PendingIntent:将未来的处理委托给其他应用等

需要特别注意 AndroidManifest.xml 中的配置。

・无需对外公开的组件应设置为 android:exported="false"
・验证从外部接收的 Intent 和 URI
・限制 ContentProvider 的读写权限
・为 PendingIntent 指定适当的可变/不可变设置
・不信任 Deep Link 的参数
・不要随意将认证令牌等包含在 Intent 中

如果 Activity、Service、BroadcastReceiver、ContentProvider 的公开范围存在问题,其他应用可能会执行非预期的处理。

8-2. WebView 的安全性

在使用 WebView 显示 Web 内容时也需要多加注意。

・适当处理不可信的 HTML 或 JavaScript
・仅在必要时启用 JavaScript
・验证对 URL 的跳转
・限制 addJavascriptInterface 的公开功能
・妥善管理 Cookie 和会话信息
・限制文件访问和外部内容的加载

特别是在 addJavascriptInterface 中,可以从 JavaScript 调用 Android 侧的方法。

必须进行设计,使不可信的网页无法执行重要的终端功能。

9. 个人信息、日志与通知的处理

机密信息也可能从日志或画面中泄露。

9-1. 个人信息的访问权限

相机、麦克风、照片、通讯录、位置信息等,将在必要范围内访问。

・仅请求必要的权限
・明确说明请求权限的理由
・照片尽可能使用 Photo Picker
・位置信息根据需要仅在使用期间授予许可
・如果不需要精确位置信息,则使用大致位置信息
・不再需要的个人信息不予保留

在Android中,由于权限类型和行为会随操作系统版本而变化,因此需要针对每个支持的版本进行确认。

9-2. 日志中的信息泄露

应避免如下代码:

Log.d("Auth", "Token: $accessToken")

重要的是不要将密码、认证令牌、个人信息等输出到Logcat中。

此外,还需检查崩溃分析和访问分析的SDK是否意外发送了不应传输的信息。

9-3. 来自屏幕和通知的泄露

・不在锁屏通知中包含机密信息
・不在最近使用的应用预览中保留机密信息
・不随意将秘密信息复制到剪贴板
・考虑屏幕共享或截图导致的泄露风险

在Android中,可以通过为高敏感性的屏幕设置FLAG_SECURE来限制普通的截图和部分屏幕共享功能。

window.addFlags(
    WindowManager.LayoutParams.FLAG_SECURE
)

然而,这并不能防止所有形式的信息泄露,例如通过其他设备拍摄等方式。

10. 保护外部库和开发环境

在Android应用开发中,外部库、GitHub、CI/CD以及AI开发工具等也可能成为攻击目标。

10-1. 外部库与SDK

・使用可信赖来源的库
・删除不必要的依赖库
・确认已知漏洞
・管理Gradle依赖版本
・掌握外部SDK收集并发送的数据
・正确申报Google Play的Data safety信息

特别是广告SDK和访问分析SDK,会影响应用所收集信息的范围。

10-2. Git与CI/CD

・不要在源代码中包含API密钥或私钥
・正确配置.gitignore
・为GitHub等账户设置多因素认证
・限制对CI/CD中秘密信息的访问
・安全管理Android应用的签名密钥
・检查Gradle插件及构建脚本的执行内容

特别注意防止keystore.jks等签名密钥和密码泄露。

即使使用Google Play App Signing,也需要妥善管理上传密钥和对Play Console的访问权限。

如果不慎提交了机密信息,不仅要将其从 Git 历史记录中删除,还要使相应的密钥或令牌失效并重新签发。

10-3. AI开发工具的安全性

使用 Codex 或 Claude Code 等 AI 代理时也需要注意。

・不要轻率地将私钥或认证令牌交给AI
・不要输入包含个人信息的真实数据
・确认源代码的外部发送范围
・限制文件操作和命令执行的权限
・验证AI生成的认证与加密代码

AI 生成的代码未必安全。尤其是在认证、加密、访问控制等关键处理环节,需要由人工进行审查。

11. 数据删除与应用运维

在个人信息保护中,不仅保存方式重要,删除方法也同样重要。

11-1. 数据删除

在注销、退会或卸载时,请确认以下数据的处理方式:

・通过Android Keystore管理的加密密钥
・DataStore或Room等存储的数据
・缓存和临时文件
・Google备份数据
・Firebase等云同步数据
・保存在服务器上的个人信息
・与其他用户共享的数据

通常,在卸载应用时会删除应用专用数据和Keystore中的密钥。

但是,备份的数据可能会在重新安装时被恢复。

此外,在退会时,还需确认服务器和云端数据以及备份中数据的保存期限和删除方针。

11-2. 应用的持续运营

应用发布后,仍需应对漏洞问题。

・确认Android或外部库的漏洞信息
・提供包含安全修复的更新
・监控非法API访问
・必要时限制旧版应用的使用
・确认Google Play政策变更
・准备事故发生时的应对措施

由于Android因终端制造商和OS版本不同而更新情况各异,因此确定支持对象也很重要。

12. 安全测试与发布前检查

可以使用OWASP发布的“MASVS”(Mobile Application Security Verification Standard,移动应用安全验证标准)来评估移动应用的安全性。

MASVS是定义了移动应用应满足的安全要求的标准,而非检查工具。

12-1. MASVS的8个领域

MASVS由以下8个领域组成:

・STORAGE:数据的安全存储
・CRYPTO:加密与密钥管理
・AUTH:认证与访问控制
・NETWORK:网络通信
・PLATFORM:与操作系统及其他应用的交互
・CODE:代码安全性
・RESILIENCE:对分析和篡改的抵抗力
・PRIVACY:隐私保护

具体的验证方法总结在“MASTG”(Mobile Application Security Testing Guide,移动应用安全测试指南)中。此外,“MASWE”(Mobile Application Security Weakness Enumeration,移动应用安全弱点枚举)对移动应用的安全弱点进行了系统化整理。

MASVS中定义了“需要确认什么”,MASTG中研究了“如何确认”,并通过分析工具和手动测试进行验证,这就是它们之间的关系。

12-2. 基于AI代理的安全审查

委托Codex或Claude Code等AI代理,按照MASVS的安全要求进行审查也是一种有效的方法。

借助AI代理,可以跨领域调查Kotlin代码、AndroidManifest.xml、Gradle配置以及依赖库等,从而梳理出潜在问题。

例如,可以这样下达指令:

请根据OWASP MASVS的最新要求和MASTG的测试方法,对本Android应用的安全性进行审查。

・针对MASVS的8个领域
・检查Kotlin代码、AndroidManifest.xml、Gradle配置、依赖库和备份设置
・针对每个问题,标明重要度、相关文件与行号、MASVS需求ID以及修改建议
・区分实现层面的问题和需要额外测试的项目
・对于无法确认的项目,明确标注为“未验证”
・首先以只读模式进行调查,并汇总成Markdown报告

然而,仅靠AI代码审查无法保证符合MASVS。

在设备上的运行行为、通信内容、服务器端的访问控制以及Google备份的设置等,需要另行验证。

此外,还需提前确认向AI发送源代码或使用工具的安全性。

12-3. 发布前的检查清单

・机密信息是否已通过Android Keystore等方式妥善保护
・已确认文件的保存位置与公开范围
・已确认Google备份与共享范围
・API通信是否使用HTTPS
・未在应用中嵌入秘密API密钥
・已在服务器端验证认证与访问权限
・已限制Intent、Deep Link和ContentProvider的访问
・日志和通知中不包含机密信息
・已确认外部SDK及依赖库的安全性
・Git或CI/CD中未残留秘密信息
・已确认注销与退会时的数据删除
・已完成AI审查及必要的设备测试

AIエージェントによる初期レビュー → 指摘事項の修正 → 実機・APIのセキュリティテストという流れで確認するとよいでしょう。

13. まとめ

Androidは強力なセキュリティ機能を備えていますが、アプリやサーバーの実装に問題があれば、サイバー攻撃や情報漏洩は発生します。

特に重要なのは、機密情報の安全な保存、Googleバックアップや外部アプリとの共有範囲、通信の保護、サーバー側でのアクセス制御です。

また、外部ライブラリやAI開発ツール、開発環境の管理も含め、設計から公開後の運用まで継続的に安全性を確認する必要があります。

MASVSのような標準やAIエージェントを活用しながら、セキュリティ対策を開発プロセスに組み込むことが、安全なAndroidアプリの提供につながります。

関連

来源:npaka · AI与游戏开发技术 · note.com