一、应用权限
1.1 查看命令
命令:adb shell dumpsys package package_name
我们可以以微信为示例:adb shell dumpsys package com.tencent.mm
1.2 declared permissions 声明(自定义)的权限
应用自定义权限声明显示以下信息:权限名称、权限等级以及获取时机("INSTALLED"表示安装时即授予该权限)。
1.3 请求权限requested permissions
1.4 安装时权限install permissions
安装时权限允许您的应用有限地访问受限数据,或允许您的应用执行对系统或其他应用影响最小的受限操作。
1.5 运行时权限runtime permissions
运行时权限(也称为危险权限)允许您的应用额外访问受限数据,或允许您的应用执行对系统和其他应用影响更大的受限操作。因此,需要先在应用中请求运行时权限,然后才能访问受限数据或执行受限操作。不要假定这些权限已事先授予 - 在每次访问之前检查它们,并在需要时请求它们。
二、敏感权限分类
行为 | 权限 | 内容 |
发送短信/彩信 | android.permission.SEND_SMS | 是否存在用户不知情的情况下,在后台发送短信或彩信的行为。 |
在程序发送短信/彩信前,即使有提示用户将发送信息,是否存在用户无法取消操作的行为。 | ||
拨打电话 | android.permission.CALL_PHONE, android.permission.CALL_PRIVILEGED | 是否存在用户不知情的情况下,在后台拨打电话的行为 |
在程序拨打电话前,即使有提示用户将拨打电话,是否存在用户无法取消操作的行为。 | ||
读取联系人 | android.permission.READ_CONTACTS | 是否存在用户不知情的情况下,在后台读取手机中联系人信息的行为。 |
在程序读取联系人前,即使有提示将读取联系人时,是否存在用户无法取消操作的行为。 | ||
修改联系人 | android.permission.WRITE_CONTACTS | 是否存在用户不知情的情况下,在手机后台修改手机中联系人信息的行为。 |
在程序修改联系人前,即使有提示将修改联系人信息,是否存在用户无法取消操作的行为。 | ||
读取短信、彩信 | android.permission.READ_SMS android.permission.RECEIVE_SMS android.permission.RECEIVE_MMS | 是否存在用户不知情的情况下,在手机后台读取用户短信或彩信的行为。 |
在程序读取短信/彩信时,即使有提示将读取用户短信或彩信,是否存在用户无法取消操作的行为。 | ||
修改短信、彩信 | android.permission.WRITE_SMS | 是否存在用户不知情的情况下,在手机后台修改用户短信或彩信的行为。 |
在程序修改短信/彩信前,即使有提示将修改用户短信或彩信,是否存在用户无法取消操作的行为。 | ||
读取通话记录 | android.permission.READ_ CALL_LOG | 是否存在用户不知情的情况下,在手机后台读取通话记录的行为。 |
在程序读取通话记录前,即使有提示将读取通话记录,是否存在用户无法取消操作的行为。 | ||
修改通话记录 | android.permission.WRITE_ CALL_LOG | 是否存在用户不知情的情况下,在手机后台修改通话记录的行为。 |
在修改通话记录时,即使有提示将修改通话记录,是否存在用户无法取消操作的行为。 | ||
调用摄像头 | android.permission.CAMERA | 是否存在用户不知情的情况下,在手机后台调用摄像头,拍照或录像的行为。 |
在程序调用摄像头时,即使有提示将调用摄像头,拍照或录像的行为,是否存在用户无法取消操作的行为。 | ||
打开WIFI/WiFi AP | android.permission.CHANGE_WIFI_ MULTICAST_STATE WIFI_STATE WIMAX_STATE | 是否存在用户不知情的情况下,在手机后台打开WIFI的行为。 |
在程序打开wifi或wifi AP前,即使有提示将打开WIFI或wifi AP前,是否存在用户无法取消操作的行为。 | ||
打开蓝牙 | android.permission.BLUETOOTH android.permission.BLUETOOTH_ADMIN | 是否存在用户不知情的情况下,在手机后台打开蓝牙的行为。 |
在程序打开蓝牙前,即使有提示将打开蓝牙,是否存在用户无法取消操作的行为。 | ||
打开定位开关(GPS、wifi、基站方式) | android.permission.ACCESS_ COARSE_LOCATION FINE_LOCATION LOCATION_EXTRA_COMMANDS MOCK_LOCATION | 是否存在用户不知情的情况下,在手机后台打开定位开关的行为。 |
在程序打开定位开关前,即使有提示将打开定位开关,是否存在用户无法取消操作的行为。 | ||
打开数据业务 | android.permission.INTERNET | 是否存在用户不知情的情况下,在手机后台打开数据业务的行为。 |
在程序打开数据业务开关前,即使有提示将打开数据业务,是否存在用户无法取消操作的行为。 | ||
录音 | android.permission.RECORD_AUDIO | 是否存在用户不知情的情况下,在手机后台打开录音业务的行为。 |
在程序录音前,即使有提示将打开录音,是否存在用户无法取消操作的行为。 | ||
NFC | android.permission.NFC | 是否存在用户不知情的情况下,在手机后台打开NFC业务的行为。 |
在程序打开NFC前,即使有提示将打开NFC,是否存在用户无法取消操作的行为。 |
三、数据存储
Android 应用最常见的安全问题是您在设备上保存的数据是否可供其他应用访问。在设备上保存数据有三种基本方式:
内部存储
外部存储
内容提供程序
3.1 内部存储
默认情况下,在内部存储上创建的文件只能由您的应用访问。Android 实现了这种保护,对于大多数应用程序来说已经足够了。
3.2 外部存储
在外部存储(例如 SD 卡)上创建的文件是全局可读写的。由于外部存储可能被用户移除,也可能被任何应用程序修改,因此只能使用外部存储来存储非敏感信息。
在处理来自外部存储的数据时,请像处理来自任何不受信任的源的数据一样执行输入验证。在动态加载之前,不要将可执行文件或类文件存储在外部存储上。如果您的应用确实从外部存储检索可执行文件,请确保这些文件在动态加载之前已签名并经过加密验证。
3.3 内容提供程序
内容提供程序提供了一种结构化存储机制,可以将其限制为仅您的应用程序使用,或者导出以允许其他应用程序访问。如果您不打算向其他应用程序提供对您的 ContentProvider 的访问权限,请在应用程序清单中将其标记为 android:exported=false。否则,将 android:exported
属性设置为 true
以允许其他应用访问存储的数据。
访问内容提供程序时,请使用参数化查询方法,例如 query、update 和 delete(),以避免来自不可信来源的潜在 SQL 注入。
不要对写入权限抱有错误的安全感。写入权限允许使用 SQL 语句,通过巧妙的 WHERE
子句和解析结果来确认某些数据。例如,攻击者可能会通过仅在特定电话号码已存在时修改行来探测通话记录中是否存在该号码。
四、用户数据
用户数据安全的最佳方法是尽量减少使用访问敏感或个人信息的 API。如果有权访问用户数据,如果可以,请避免存储或传输它。考虑应用程序逻辑是否可以使用数据的哈希或不可逆形式实现。例如,应用程序可能使用电子邮件地址的哈希作为主键,以避免传输或存储电子邮件地址。这减少了无意中暴露数据的机会,也减少了攻击者试图利用您的应用程序的机会。
每当需要访问私人数据时,请对用户进行身份验证,并使用现代身份验证方法,例如通行密钥和凭据管理器。如果应用需要访问个人信息,请记住某些司法管辖区可能要求您提供隐私政策,解释您对该数据的使用和存储。遵循最小化用户数据访问的安全最佳实践以简化合规性。
此外,还要考虑应用程序是否会无意中将个人信息暴露给其他方,例如用于广告的第三方组件或应用程序使用的第三方服务。如果不知道某个组件或服务为何需要个人信息,请不要提供。总的来说,减少应用程序对个人信息的访问可以减少这方面问题的潜在发生。
如果应用需要访问敏感数据,请评估是否需要将其传输到服务器,或者是否可以在客户端上运行该操作。考虑在客户端上运行任何使用敏感数据的代码,以避免传输用户数据。
如果需要全局唯一标识符 (GUID),请创建一个大而唯一的数字并将其存储起来。不要使用电话号码或 IMEI 等可能与个人信息相关的电话标识符。
在写入设备日志时要小心。在 Android 上,日志是共享资源,可供具有 READ_LOGS 权限的应用程序访问。尽管电话日志数据是临时的,并在重启时擦除,但对用户信息的不当日志记录可能会无意中将用户数据泄露给其他应用程序。除了不记录个人身份信息 (PII) 外,还要限制生产应用程序中的日志使用。为了轻松实现这一点,请使用调试标志和具有易于配置的日志记录级别的自定义 Log
类。