通用审计方法
最后更新于
2.1 静态检测
静态检测主要是指通过扫描工具对 apk 文件进行静态扫描和 检查,尽快发现可能存在的安全隐患。
测试客户端程序是否对自身完整性进行校验。
测试方法: 需要安装 Java 环境,配置好环境变量,然后执行 “jarsigner –verify xxx.apk”命令,如下图:
当输出结果为“jar 已验证”时,表示签名正常。(下面的警 告是因为签名密钥不在本地密钥库中)。
漏洞描述:如果安装包验证不合规,说明安装包被修改 过,有可能被植入了木马。 漏洞类型:应用完整性 漏洞评级:低危 漏洞危害:安装包验证不合规,可能存在被植入木马等风险,容易造成用户信息泄露。 修复建议:确认 APP 校验通过在发布版本。
测试方法:
解压缩 Apk 文件,从解压目录的 META-INF 目录中找到以 “.SF”为后缀的文件。
用文本编辑器打开后缀为.SF 的文件,如果从文件内容中找到“x-Android-apk”字符串,说明则采用了 V1+V2 签名,检测结果安全。
漏洞描述:该漏洞可以让攻击者绕过安卓系统的 signaturescheme V1 签名机制,进而使用篡改过的 APP 安装获取原始APP 的所有数据,直接进行篡改。而且由于安卓系统的其他安全机制也是建立在签名和校验基础之上,该漏洞相当于绕过了安卓系统的整个安全机制,该漏洞影响 Android4.0-Android7.0 版本,在 Android7.0 及以上版本可以使用signature scheme V2 签名。 漏洞类型:应用配置 漏洞评级:中危 漏洞危害:若此 APP 存在 Janus 签名漏洞,容易在不修改签名信息的情况下被植入木马获取用户隐私等敏感数据,造成用户信息泄露。 修复建议:采用 signature scheme V1 加 signaturescheme V2 同时签名 APP 文件。
测试方法:通过“jarsigner –verify –verbose –certsxxx.apk”命令判断证书签发者身份。
如下图:
可以看到签名信息中得 CN 字段对应值即为签发者身份。如 果签发者包含 “Debug”或者“Android”字符串,说明使 用的调试证书。
漏洞描述:签名证书是验证应用开发者身份的关键标识, 可用于判断应用程序是否是由合法开发者发布的正版应 用,并且应用程序常使用签名校验作为防止应用程序被二 次打包的措施。使用调试证书发布应用,可能导致应用程 序无法在应用市场上架,并且调试版本的证书有效期比较 短,使用调试版本证书发布的应用可能会出现各个版本的 签名证书不一致的情况,这样会严重影响应用的迭代更 新。 漏洞类型:应用配置 漏洞评级:低危 漏洞危害:如果使用 debug 证书发布,会导致应用应用更 新迭代容易失败,个别应用市场无法上架。 修复建议:建议使用由公司或个人申请的正式签名证书进 行打包。
测试方法: 解压缩 Apk 文件,从解压目录中查找各个厂商加固后的 标识文件,如果查找到文件,说明应用已经加壳,反之未 加壳。 漏洞描述:由于 Android 平台是基于 java 开发,所以导致 Android 应用很容易被反编译,进行二次打包成盗版。所以 对应用进行加固是当前最有效的保护方案,而现在加固厂 商很多,加固的方案参差不齐,个别加固方案无法有效的 防止反编译工具的破解,甚至推掉加固壳拿到真实代码。 漏洞类型:应用配置 漏洞评级:中危 漏洞危害:未做加固保护的应用很容易被反编译分析其业务逻辑。 修复建议:对应用采取加固方式进行保护。
测试方法:解压缩 Apk 文件,从解压目录中查找所有.so 后缀的文件,使用 readelf.exe 工具的“readelf –axxx.so >out.txt”命令对每个.so 后缀文件进行解析,如果解析出错,说明 SO 文件已经加壳,反之未加壳。
加壳示例:
未加壳示例:
漏洞描述:动态链接库文件俗称 SO 文件,在 Android 应用 开发过程中是通过 NDK 将 C/C++语言编写的核心代码编译成 SO 文件,提供对应接口以便 java 层进行调用。如果 SO 文 件被破解,则将直接导致应用核心代码被分析,用户账 号,密码等信息都将被窃取。严重者可能会直接拿到服务 器地址对服务器进行攻击。 漏洞类型:应用配置 漏洞评级:中危 漏洞危害:如果重要 SO 文件未做加固保护,使用 IDA 等工 具可以分析、篡改 SO 内部代码逻辑。 修复建议:重要 SO 文件进行加固保护。
测试方法:
解压缩 Apk 文件,使用 AxmlPrinter.jar 工具反编译解 压目录中的AndroidManifest.xml 文件。命令行如下: java –jar AxmlPrinter.jar AndroidManifest.xml >out.xml
将解析结果存储到 out.xml 文件中。
使用文本编辑器打开 out.xml 文件,从文件内容中查找 所有“” 字符串,如果查找到说明安全,反之则存在风险。 安全示例:
漏洞描述:应用正常会以界面形式启动程序,如果设置隐 藏程序启动,应用易被安全检测工具误识别为恶意应用木 马、病毒等,也可能存在感染恶意木马和病毒的风险。 漏洞类型:应用配置 漏洞评级:低危 漏洞危害:应用在没有 LAUNCHER 在设备显示的情况下,被 恶意程序感染后也很难发现 修复建议:设置 APP 主入口的 category 中那 name 值为android.intent.category.LAUNCHER。
测试方法:
1.使用 Apktool 反编译 apk 文件,命令行如下: java –jar apktool.jar d xxx.apk –o out/
反编译成功结果如下图:
2.获取反编译输出目录下所有 smali 文件,从文件内容中查 找 “Ljava/lang/Thread;->setDefaultUncaughtExceptionHa ndler”
字符串,查找到说明安全,反之存在风险。示例:
漏洞描述:如果应用没有使用全局异常捕获机制,则当出 现未捕获的异常时,系统会强制终止应用,出现系统的默 认提示“抱歉,XXX 应用已停止运行”,既影响用户体验, 也不利于开发者解决问题。应用应该有一个全局的异常捕 获机制,当出现未知异常时,捕获这个异常,将异常信息 记录下来,并且上传到服务器分析出现异常的具体原因。 漏洞类型:自身逻辑 漏洞评级:低危 漏洞危害:应用停止运行后无法拿到异常信息,影响用户 体验。 修复建议:建议使用全局异常捕获 UncaughtExceptionHandler 类,当程序发生未知异常时, 由该类来处理,并记录发送错误报告。
8. 启用 VPN 服务检测
测试方法:
1. 使用 Apktool 反编译 apk 文件 2.获取反编译输出目录下所有 smali 文件,从文件内容中查 找“.super Landroid/net/VpnService;”字符串,查找到 说明有风险,反之安全。 示例:
漏洞描述:使用 VPN 联网时,通过网络请求的数据容易被 劫持,造成用户敏感信息泄露。可以提供 VPN 服务的软 件,又叫“翻墙”软件。提供“翻墙”服务属于违法行 为。 漏洞类型:自身逻辑 漏洞评级:低危 漏洞危害:使用 VPN 联网时容易造成数据劫持,导致用户 敏感信息泄露。 修复建议:避免使用 vpn 服务。
测试方法: 1.解压缩 Apk 文件。使用 AxmlPrinter.jar 的工具解析解 压目录下的 AndroidManifest.xml 文件。命令行如下: java –jar AxmlPrinter.jar AndroidManifest.xml >out.xml 将解析结果存储到 out.xml 文件中。 3. 使用文本编辑器打开 out.xml,从文件内容中查找 如下字符串: "Android.permission.INSTALL_PACKAGES", "Android.permission.WRITE_SECURE_SETTINGS", "Android.permission.MOUNT_FORMAT_FILESYSTEMS", "Android.permission.MOUNT_UNMOUNT_FILESYSTEMS" ,"Android.permission.RESTART_PACKAGES"。
查找到以上任意一个字符串说明存在风险。 示例:
漏洞描述:若 App 如果使用了一些系统限制权限,但又不 是系统自带或 Google 的 APP,则应该加以控制。 漏洞类型:应用配置问题 漏洞评级:中危 漏洞危害:若此 APP 拥有系统权限,容易被木马等利用, 违规获取用户隐私等敏感数据,甚至威胁到其他无关 APP。 修复建议:根据业务需求,如非必要,移除系统权限 2. 危险 ProtectionLevel 权限检测 测试方法: 1.解压缩 Apk 文件,使用 AxmlPrinter.jar 工具反编译解 压目录中的 AndroidManifest.xml 文件。命令行如下: java –jar AxmlPrinter.jar AndroidManifest.xml >out.xml 将解析结果存储到 out.xml 文件中。 2.使用文本编辑器打开 out.xml 文件,从文件内容中查找 所有 标签,并判断每个标签
的 protectionLevel 属性值,如果属性值为 0x0 或 0x1, 或者没有找到 protectionLevel 属性,说明存在风险。 示例:
漏洞描述:Android 中自定义权限的保护等级 (Android:protectionLevel 属性)设置为 normal,或没有 设置此属性,可能会导致敏感信息泄露。 漏洞类型:应用配置问题 漏洞评级:低危 漏洞危害:导致组件(如:content provider)数据泄露 危险 修复建议:注意使用"signature"或"signatureOrSystem" 防止其他 app 注册或接受该 app 的消息,提高安全性。 3. sharedUserid 检测 测试方法: 1.解压缩 Apk 文件,使用 AxmlPrinter.jar 工具反编译解 压目录中的 AndroidManifest.xml 文件。命令行如下:
java –jar AxmlPrinter.jar AndroidManifest.xml >out.xml 将解析结果存储到 out.xml 文件中。 3.使用文本编辑器打开 out.xml 文件,从文件内容中查找 “sharedUserId”字符串,查找到说明存在风险。 示例:
漏洞描述:使用此属性容易造成 APP 的进程中数据泄露。 漏洞类型:应用配置问题 漏洞评级:低危 漏洞危害:通过 sharedUserId,可以让拥有同一个 User Id 的多个 apk 运行在同一个进程中,互相访问任意资源。 将 sharedUserId 设置为“Android.uid.system”,可以把 app 放到系统进程中,app 将获得极大的权限。如果 app 同 时有 master key 漏洞,容易导致被 root。 修复建议:检测配置项 4. allowBackup 标志检测 测试方法:
1.解压缩 Apk 文件,使用 AxmlPrinter.jar 工具反编译解 压目录中的 AndroidManifest.xml 文件。命令行如下: java –jar AxmlPrinter.jar AndroidManifest.xml >out.xml 将解析结果存储到 out.xml 文件中。 2.使用文本编辑器打开 out.xml 文件,从文件内容中查找 “allowBackup”字符串,如果“allowBackup”后面对 应的值为 true,或者没有查找到“allowBackup”字符 串,说明存在风险。 示例:
漏洞描述:如果 APP 中设置 allowBackup 设置为 true,则 会导致使用 adb 命令可以备份 APP 数据。 漏洞类型:应用配置问题 漏洞评级:低危 漏洞危害:当 allowBackup 被设置成 true 或不设置该标志 位时,应用程序数据可以备份和恢复,adb 调试备份允许恶 意攻击者复制应用程序数据。
修复建议:设置 AndroidManifest.xml 的 Android:allowBackup 标志为 false。 5. debuggable 配置检测 测试方法: 1.解压缩 Apk 文件,使用 AxmlPrinter.jar 工具反编译解 压目录中的 AndroidManifest.xml 文件。命令行如下: java –jar AxmlPrinter.jar AndroidManifest.xml >out.xml 将解析结果存储到 out.xml 文件中。 2.使用文本编辑器打开 out.xml 文件,从文件内容中查找 “debuggable”字符串,如果“debuggable”后面对应 的值为 true,或者没有查找到“allowBackup”字符串, 说明存在风险。 示例:
漏洞描述:如果 APP 中设置 debuggable 设置为 true,则 会导致 APP 可以被附加调试。 漏洞类型:应用配置问题 漏洞评级:高危 漏洞危害:APP 存在被恶意程序调试的风险,可能导致泄露 敏感信息等问题。 修复建议:设置 AndroidManifest.xml 的 debuggable 标志 为 false 6. 非必要权限检测 测试方法: 1.解压缩 Apk 文件,使用 AxmlPrinter.jar 工具反编译解 压目录中的 AndroidManifest.xml 文件。命令行如下: java –jar AxmlPrinter.jar AndroidManifest.xml >out.xml 将解析结果存储到 out.xml 文件中。 2.使用文本编辑器打开 out.xml 文件,从文件内容中查找 “android.permission.ACCESS_MOCK_LOCATION”字符串, 如果查找到字符串,说明存在风险。 示例:
漏洞描述:有些权限只能在模拟器上使用,如果 APP 中使 用了此权限,则会有模拟器运行的风险。 漏洞类型:Android 组件问题 漏洞评级:低危 漏洞危害:android.permission.ACCESS_MOCK_LOCATION 权 限只有在模拟器中才使用,模拟器运行会导致用户位置任 意篡改。 修复建议: 移除”android.permission.ACCESS_MOCK_LOCATION”权限 7. 应用测试模式发布风险 测试方法: 1.解压缩 Apk 文件,使用 AxmlPrinter.jar 工具反编译解 压目录中的 AndroidManifest.xml 文件。命令行如下: java –jar AxmlPrinter.jar AndroidManifest.xml >out.xml 将解析结果存储到 out.xml 文件中。 2.使用文本编辑器打开 out.xml 文件,从文件内容中查找 “testOnly”字符串,如果“testOnly”后面对应的值为true,或者没有查找到“testOnly”字符串,说明存在风 险。 示例:
8、Activity 组件导出风险
测试方法:解压缩 Apk 文件,使用 AxmlPrinter.jar 工具反编译解压目录中的 AndroidManifest.xml 文件。命令行如下:java –jar AxmlPrinter.jarAndroidManifest.xml >out.xml 将解析结果存储到out.xml 文件中。2.使用文本编辑器打开 out.xml 文件,从文件内容中查找所有“”标签,判断标签中“android:exported”对应的值,如果为 true,则说明是导出组件,如果没有“android:exported”属性,再查找标签目录下的子标签,如果找到<intent-filter 标签,说明这个 Activity 组件为导出,反之为未导出。
示例:
漏洞描述:Activity 是 Android 应用程序与用户的交互界 面,如果 Activity 组件为非导出,其他应用无权访问。如 果设置组件为导出,则 Activity 可以被系统应用或三方应 用调用,造成用户敏感信息泄露或本地拒绝服务攻击。 漏洞类型:Android 组件问题 漏洞评级:低危 漏洞危害:Activity 组件导出容易造成本地拒绝服务攻击 与用户信息泄露。 修复建议:1.如果应用的 Activity 组件不必要导出,则显 示设置组件的"android:exported"属性为 false 2.如果组件必须要提供给外部应用使用,建议对组件进行 权限控制。 9. Services 组件导出风险 测试方法: 1.解压缩 Apk 文件,使用 AxmlPrinter.jar 工具反编译解 压目录中的 AndroidManifest.xml 文件。命令行如下: java –jar AxmlPrinter.jar AndroidManifest.xml >out.xml 将解析结果存储到 out.xml 文件中。
2.使用文本编辑器打开 out.xml 文件,从文件内容中查找
所有“”标签,判断标签中
“android:exported”对应的值,如果为 true,则说明是
导出组件,如果没有“android:exported”属性,再查找
标签目录下的子标签,如果找到<intent-filter 标签,说
明这个 Service 组件为导出,反之为未导出。
示例:
漏洞描述:Service 是 Android 应用程序再后台启动的一些 服务,如果 Service 组件为非导出,其他应用无权访问。如 果设置组件为导出,则 Service 可以被系统应用或三方应 用调用,造成用户敏感信息泄露或本地拒绝服务攻击。 漏洞类型:Android 组件问题 漏洞评级:低危 漏洞危害:Service 组件导出容易造成本地拒绝服务攻击与 用户信息泄露。 修复建议:1.如果应用的 Service 组件不必要导出,则显 示设置组件的"android:exported"属性为 false 2.如果组件必须要提供给外部应用使用,建议对组件进行 权限控制。
10.BroadcastReceiver 组件导出风险
测试方法:
1.解压缩 Apk 文件,使用 AxmlPrinter.jar 工具反编译解
压目录中的 AndroidManifest.xml 文件。命令行如下:
java –jar AxmlPrinter.jar
AndroidManifest.xml >out.xml 将解析结果存储到
out.xml 文件中。
2、使用文本编辑器打开 out.xml 文件,从文件内容中查找
所有“”标签,判断标签中
“android:exported”对应的值,如果为 true,则说明是
导出组件,如果没有“android:exported”属性,再查找
标签目录下的子标签,如果找到<intent-filter 标签,说
明这个 Receiver 组件为导出,反之为未导出。
示例:
漏洞描述:Receiver 是 Android 应用程序中针对外部广播 进行过滤的组件,如果 Receiver 组件为非导出,其他应用 无权访问。如果设置组件为导出,则 Receiver 可以被系统 应用或三方应用调用,造成用户敏感信息泄露或本地拒绝 服务攻击。 漏洞类型:Android 组件问题 漏洞评级:低危
漏洞危害:Receiver 组件导出容易造成本地拒绝服务攻击 与用户信息泄露。 修复建议:1.如果应用的 Receiver 组件不必要导出,则显 示设置组件的"android:exported"属性为 false 2.如果组件必须要提供给外部应用使用,建议对组件进行 权限控制。 11. ContentProvider 组件导出风险 测试方法: 1.解压缩 Apk 文件,使用 AxmlPrinter.jar 工具反编译解 压目录中的 AndroidManifest.xml 文件。命令行如下: java –jar AxmlPrinter.jar AndroidManifest.xml >out.xml 将解析结果存储到 out.xml 文件中。 2. 使用文本编辑器打开 out.xml 文件,从文件内容中查找 所有“”标签,判断标签中 “android:exported”对应的值,如果为 true,则说明是 导出组件,如果没有“android:exported”属性, minSdk>=17,说明这个 Receiver 组件为未导出,反之为导 出。 示例:
漏洞描述:Provider 是 Android 应用程序之间实现数据共 享的组件,如果 Provider 组件为非导出,其他应用无权访 问。如果设置组件为导出,可能被系统或者第三方的 App 直接调用,导致敏感信息泄露,并可能受到目录遍历、SQL 注入等攻击风险 漏洞类型:Android 组件问题 漏洞评级:低危 漏洞危害:provider 组件导出容易导致敏感信息泄露和目 录遍历、SQL 注入攻击风险。 修复建议:1.如果应用的 Content Provider 组件不必要导 出,建议显式设置组件的“android:exported”属性为 false 2.如果必须要有数据提供给外部应用使用,建议对组件进 行权限控制。 2.1.3 组件安全检测 1. debug/test 敏感组件泄露 测试方法:
1.解压缩 Apk 文件,使用 AxmlPrinter.jar 工具反编译解 压目录中的 AndroidManifest.xml 文件。命令行如下: java –jar AxmlPrinter.jar AndroidManifest.xml >out.xml 将解析结果存储到 out.xml 文件中。 2.使用文本编辑器打开 out.xml 文件,从文件内容中查找<///>标签,获 取标签中 name 属性的内容。如果 name 属性的内容包含 debug 或 test 字符串,说明存在风险。 示例:
漏洞描述:如果 APP 中存在测试组件残留,加以利用可能 会导致 APP 数据泄露。 漏洞类型:Android 组件问题 漏洞评级:中危
漏洞危害:在应用开发过程中,会有一些代码用于做功能 性测试,而在正式发版本的时候,如果携带了测试信息被 恶意攻击者进行利用,将导致用户信息等数据被窃取,如 果测试信息包含有服务器地址等信息,服务器将面临攻击 者的攻击,严重的将导致服务器瘫痪。 修复建议:在正式发布前移除所有的测试组件。 2. Manifest 定义组件未实现 测试方法: 1.使用 Apktool 反编译 apk 文件,命令行如下: java –jar apktool.jar d xxx.apk –o out/ 反编译成功结果如下图:
2.获取反编译输出目录下的所有 smali 文件的路径和 AndroidManifest.xml 文件内容中所有
///标签中 name 属性的值。 3.循环从 smali 文件路径列表中查找第二步获取的四个标 签 name 值,如果存在未找到到的标签值,说明存在风险。
漏洞描述:如果 APP 中存在没有实现的组件,攻击者可能 通过 ddos 攻击 APP。 漏洞类型:Android 组件问题 漏洞评级:中危 漏洞危害:攻击者可以通过 ddos 攻击导致 APP 崩溃。 修复建议:删除 Manifest 文件中无效的导出组件。 4. Intent-based 攻击 测试方法: 1. 解压缩 Apk 文件,使用 AxmlPrinter.jar 工具反编译解 压目录中的 AndroidManifest.xml 文件。命令行如下: java –jar AxmlPrinter.jar AndroidManifest.xml >out.xml 将解析结果存储到 out.xml 文件中。 2.使用文本编辑器打开 out.xml 文件,从文件内容中查找 “ ”字符串,查找到说明存在风险。 示例:
漏洞描述:Activity 只有配置了 category filter 才有被 android.intent.category.BROWSABLE 通过这种方式在浏览 器中打开,设置了则存在风险,容易造成远程执行命令。 漏洞类型:Android 组件问题 漏洞评级:中危 漏洞危害:通过浏览器唤起,这会导致远程命令执行漏洞 攻击。 修复建议:APP 中任何接收外部输入数据的地方都是潜在的 攻击点,过滤检查来自网页的参数。 5. PendingIntent 误用 Intent 测试方法: 1. 使用 Apktool 反编译 apk 文件,命令行如下: java –jar apktool.jar d xxx.apk –o out/ 反编译成功结果如下图:
2.获取反编译输出目录下所有 smali 文件,从文件内容中查 找“Landroid/content/Intent;->()V”字符串,查 找到以后再从当前位置向下查找 “Landroid/content/Intent;->addFlags(I)Landroid/con tent/Intent;”字符串,找到后根据 smali 语法去分析方 法参数如果为“0x10000000”,说明存在风险。 示例:
漏洞描述:如果 Intent 调用设置了 FLAG_ACTIVITY_NEW_TASK,可以跨任务访问,则容易造成 敏感数据泄露风险。 漏洞类型:Android 组件问题 漏洞评级:中危 漏洞危害:APP 创建 Intent 传递数据到其他 Activity,如 果创建的 Activity 不是在同一个 Task 中打开,就很可能被 其他的 Activity 劫持读取到 Intent 内容,跨 Task 的 Activity 通过 Intent 传递敏感信息是不安全的。 修复建议:尽量避免使用包含 FLAG_ACTIVITY_NEW_TASK 标 志的 Intent 来传递敏感信息。
7、Fragment 注入漏洞
测试方法:
使用 Apktool 反编译 apk 文件,命令行如下:
java –jar apktool.jar d xxx.apk –o out/
反编译成功结果如下图:
2、打开反编译目录中的 AndroidManifest.xml 文件,查找
到包含“export”属性的 Activity 标签,获取对应的名
字。
3、获取反编译输出目录下所有 smali 文件,找到第二步对
应的 Activity 文件,从文件内容中查找“.super
Landroid/preference/PreferenceActivity;”字符串,查
找到以后再从当前位置向下查找
“isValidFragment(Ljava/lang/String;)Z”字符串,找
到说明安全,反之说明存在风险。
漏洞描述:导出的 PreferenceActivity 的子类中,没
有加入 isValidFragment 方法,进行 fragment 名的合
法性校验,攻击者可能会绕过限制,访问未授权的界
面,由于通过该漏洞可以加载 app 里面的任何类,包括
未导出类,如果未导出类对畸形消息处理不当,将会导致本地拒绝服务漏洞,fragment 注入攻击可导致应用 的敏感信息泄露、远程代码执行或者应用崩溃。 漏洞类型:Android 组件问题 漏洞评级:中危 漏洞危害:导致应用的敏感信息泄露、远程代码执行或者应 用崩溃。 修复建议:使用 fragment 时,重写 isValidFragment 方 法,验证 fragment 来源的正确性。 8. 动态注册广播风险 测试方法: 1. 使用 Apktool 反编译 apk 文件,命令行如下: java –jar apktool.jar d xxx.apk –o out/ 反编译成功结果如下图:
2.获取反编译输出目录下所有 smali 文件,从文件内容中查 找“registerReceiver”字符串,查找到以后根据 smali 语法分析判断参数如果大于两个则说明安全,反之则存在 风险。
漏洞描述:Android 中 receiver 分为动态注册与静态注 册两种方式,静态注册是直接在 AndroidManifest.xml 中设置,动态注册是在应用程序中调用 registerReceiver()进行注册,只有运行到时才会注 册,如果在动态注册时采用的全局方式进行注册,则这 个 receiver 在生命周期中默认是可导出的,如果没有 设置访问权限,系统应用或者第三方应用可以操作此 receiver,导致导致敏感信息泄露,可能受到权限绕 过、拒绝服务等攻击。 具体可以参考在乌云平台有一 些攻击案例。 漏洞类型:Android 组件问题 漏洞评级:中危 漏洞危害:容易造成敏感信息泄露,权限绕过,拒绝服务等 攻击。 修复建议:开发者可使用 LocalBroadcastManager 来替代 registerReceiver 注册,保证数据传递仅限于应用内。 2.1.4 WebView 安全检测 1. WebView 远程执行漏洞 测试方法: 1. 使用 Apktool 反编译 apk 文件,命令行如下: java –jar apktool.jar d xxx.apk –o out/ 反编译成功结果如下图:
2.从反编译后的输出目录下查找 AndroidManifest.xml 文 件,从文件内容中查找“minSdk”字符串,如果 “minSdk”对应的值大于等于 17,说明安全。反之继续下 一步。 3.获取反编译输出目录下所有 smali 文件,从文件内容中查 找 “Landroid/webkit/WebView;->addJavascriptInterface( Ljava/lang/Object; Ljava/lang/String;)”字符串,如 果查找到字符串,说明存在风险。 示例:
漏洞描述:在 Android SDK 版本小于 17 并且使用了 addJavascriptInterface 方法,则容易造成远程代码执行 漏洞。 漏洞类型:Android 组件问题 漏洞评级:中危
漏洞危害:攻击者可以通过 Java 反射利用该漏洞执行任意 Java 对象的方法,导致远程代码执行。 修复建议:1.修改 minSdk>=17,必须在 Java 的远程方法上 面声明一个@JavascriptInterface 注解 2.在使用 js2java 的 bridge 时候,需要对每个传入的参数 进行验证,避免恶意代码的攻击 3.使用 removeJavascriptInterface 移除 Android 系统内 部的默认内置接口:searchBoxJavaBridge_、 accessibility、accessibilityTraversal。 2. WebView 中 xss 漏洞 测试方法: 1. 使用 Apktool 反编译 apk 文件,命令行如下: java –jar apktool.jar d xxx.apk –o out/ 反编译成功结果如下图:
2.获取反编译输出目录下所有 smali 文件,从文件内容中查 找 “Landroid/webkit/WebView;->setJavaScriptEnable(Z) ”字符串,根据 smali 语法去分析方法参数如果为 true,再从当前文件中查找 “Landroid/webkit/WebView;->setAllowFileAccess(Z)” 字符串,查找到后根据 smali 语法去分析方法参数如果为 true,说明存在风险。 漏洞描述:允许 WebView 执行 JavaScrypt 代码。就可以利 用延迟执行绕过 File 域检查。 漏洞类型:Android 组件问题 漏洞评级:中危 漏洞危害:应用程序一旦使用 WebView,同时支持 File 域,并打开了对 JavaScript 的支持,就能利用 JavaScript 的延时执行,绕过 File 协议的同源检查,并能够访问应用 程序的所有私有文件,大多数使用 WebView 的应用都将受 到此漏洞的影响,该漏洞还可以获取到浏览器中的历史记 录、账号密码、cookie 等信息,最终导致敏感信息泄露。 修复建议:1.对于不需要使用 File 协议的应用,禁用 File 协议,显式设置 WebView.getSettings().setAllowFileAccess(false) 2.对于需要使用 File 协议的应用,禁止 File 协议调用 JavaScript,显式设置 WebView.getSettings().setJavaScriptEnabled(false)
3.WebView 明文存储密码
测试方法:
1.使用 Apktool 反编译 apk 文件,命令行如下:
java –jar apktool.jar d xxx.apk –o out/
反编译成功结果如下图:
2.获取反编译输出目录下所有 smali 文件,从文件内容中查 找 “Landroid/webkit/WebView;->getSettings()Landroid/w ebkit/WebSettings;”字符串,找到以后再从当前位置向 下查找 “Landroid/webkit/WebSettings;->setSavePassword(Z) ”字符串,查找到后根据 smali 语法去分析方法参数如果为 true,说明存在风险。 示例:
漏洞描述:将用户密码信息进行存储。 漏洞类型:Android 组件问题 漏洞评级:低危 漏洞危害:对于可被 root 的系统,攻击者可获取到用户密 码。 修复建议: WebView.getSetting().setSavePassword(false)。 4. WebView 组件忽略 SSL 证书验证错误漏洞 测试方式: 1. 使用 Apktool 反编译 apk 文件,命令行如下: java –jar apktool.jar d xxx.apk –o out/ 反编译成功结果如下图:
2.获取反编译输出目录下所有 smali 文件,从文件内容中查 找“onReceivedSslError”字符串,找到以后根据 smali 语法去分析从方法查找 “Landroid/webkit/SslErrorHandler;->proceed()V”字 符串,如果查找到说明存在风险。示例:
漏洞描述:Android WebView 组件加载网页发生证书认证错 误时,会调用 WebViewClient 类的 onReceivedSslError 方 法,如果该方法内部实现调用 handler.proceed()来忽略该 证书错误,这样客户端可以继续访问非法的 Url,导致中间 人攻击,攻击者使用假的服务器与客户端进行交互,从而 导致客户敏感信息泄露。 漏洞类型:Android 组件问题 漏洞评级:中危 漏洞危害:如果忽略证书错误,容易导致中间人攻击,造 成用户信息泄露。 修复建议:当发生证书认证错误时,采用默认的处理方法 SslErrorHandler.cancel(),停止加载问题页面,或根据 业务逻辑自行处理。 5. WebView 系统隐藏接口未移除漏洞 测试方式: 1.使用 Apktool 反编译 apk 文件,命令行如下:java –jar apktool.jar d xxx.apk –o out/ 反编译成功结果如下图:
2.获取反编译输出目录下所有 smali 文件,从文件内容中查 找 “Landroid/webkit/WebSettings;->removeJavascriptInt erface”字符串,找到以后根据 smali 语法去分析方法参 数值,如果传入了“searchBoxJavaBridge_” “accessibility”“accessibilityTraversal”这三个字 符串被分别传入过,说明安全。 示例:
漏洞描述:Android 中 Webview 远程代码执行早期在 CVE2012-663 中被发现,生成的原因是由于 WebViewaddJavascriptInterface 接口函数引发的。但是在 2014 年的时候,又公布了 CVE-2014-1939 漏洞中,研究人员发 现 Android 系统中的 webView 中内置的函数 searchBoxJavaBridge也存在远程代码执行漏洞,同时还 有另外两个函数 accessibilityTraversal 以及 accessibility 未移除的函数,也将会导致远程代码执行漏 洞。 漏洞类型:Android 组件问题 漏洞评级:低危 漏洞危害:接口未移除容易造成远程代码执行。 修复建议:建议开发过程中如果使用了 WebView,那么需要 手动调用 WebView.removeJavascriptInterface(String name) 函数,显示的移除 searchBoxJavaBridge、 accessibility、accessibilityTraversal 这三个接口函 数。 6. WebView 组件克隆应用漏洞 测试方式: 1.使用 Apktool 反编译 apk 文件,命令行如下: java –jar apktool.jar d xxx.apk –o out/ 反编译成功结果如下图:
2.获取反编译输出目录下所有 smali 文件,从文件内容中查 找“Landroid/webkit/WebView;-> setAllowFileAccessFromFileURLs(Z)V”或者 “Landroid/webkit/WebView;-> setAllowUniversalAccessFromFileURLs(Z)”字符串,找 到以后根据 smali 语法去分析方法参数值,如果为 true, 说明存在风险。 示例:
漏洞描述:Android 应用开发中如果使用了 WebView,并且 承载 WebView 的 Activity 为可导出,若 webView 支持 File 域,未做校验,则存在应用克隆风险,攻击者利用该漏 洞,可远程获取用户隐私数据(包括手机应用数据、照 片、文档等敏感信息),还可窃取用户登录凭证,在受害者 毫无察觉的情况下实现对 APP 用户账户的完全控制。
漏洞类型:Android 组件问题 漏洞评级:中危 漏洞危害:攻击者利用该漏洞,可远程获取用户隐私数 据,窃取用户登录凭证等。 修复建议:使用 setAllowFileAccessFromFileURLs 函数 或 setAllowUniversalAccessFromFileURLs 设置为 false。 2.1.5 数据安全检测 1. 数据库任意读写漏洞 测试方式: 1. 使用 Apktool 反编译 apk 文件,命令行如下: java –jar apktool.jar d xxx.apk –o out/ 反编译成功结果如下图: