We are Mr Bug! We are App Bug Hunter!!!

目的

用评分的形式,通过:安全、性能、稳定三个方面去检测评估一款APP。

活动简介

  • 主刀医生: Mr Bug 项目团队
  • 发起时间: 11月4日
  • 发起方: 毛里求斯
  • 体检目标: 京东钱包 3.11.1
  • 体检项: 性能,安全,稳定

总分

总分为 61.54 33.3%(安全)+ 67.44 33.3%(性能) + 84.0 * 33.3%(稳定性)= 70.99 分。

体检结果概要

得分详细信息

安全

检查项 满分 得分 说明
本地数据敏感信息均经过加密 3.85 0.0 发现cookies数据库
本地数据没有明文存储的敏感信息 3.85 0.0 shared_prefs目录下MYINFO.xml文件中暴露了用户名,如果是手机号的话就很麻烦
本地数据篡改检测 3.85 3.85 修改数据后,更换xml文件后应用没有提醒,但是会被覆盖掉
使用 https 7.69 7.69 网络连接主要有两类,一类是操作事件类,主要收集用户操作信息,采用 http ;另一类是业务类,主要是 app 的功能(登陆、注册、投资等主要操作),采用 https
不允许使用自定义 ssl 证书 3.85 3.85 把抓包工具的 ssl 证书加入到系统信任证书并设置代理后,所有 https 通讯均会失败(握手时会检查出使用的不是京东的证书)
敏感信息加密传输 7.69 7.69 所有包含敏感信息的网络包均通过 https 通道,且不支持第三方证书,难以解密
数据包防篡改校验(服务端) 7.69 7.69 由于无法篡改网络包,故此扫描项无法进行
数据包防篡改校验(客户端) 7.69 7.69 由于无法篡改网络包,故此扫描项无法进行
DNS 劫持校验 3.85 3.85
权限扫描,除少量与外部沟通的组件外其他组件不允许外部调用 7.69 0.0 扫描结果显示有36个 activity ,4个 broadcast receiver 和4个 services 可被外部调用。
各 activity 接收空/具有非法值的 intent 后保持稳定 3.85 3.85 有些 activity 传入空 Indent 后回出现 NullPointException ,但应用会改为启动 MainActivity ,不会崩溃
content provider 防 sql 注入 3.85 3.85 content provider 不能被外部调用
content provider 防遍历文件 3.85 3.85 content provider 不能被外部调用
DEX加壳保护,防止静态反编译直接获取源码 7.69 0.0 无防护,apktools直接反编译
资源文件加密,防止直接查看或修改资源文件 3.85 0.0 无防护,可直接获取资源文件
反二次打包,使二次打包时无法成功或打包后的apk无法安装使用 7.69 0.0 无防护,可植入第三方代码重打包
so文件保护,防止高级调试工具对so文件进行动态调试获取接口等敏感信息 3.85 0.0 未做防护,so文件可反编译,可打断点调试
屏蔽日志输出流中的info、debug等信息 3.85 3.85
核心业务中无敏感信息在日志中输出 3.85 3.85

性能

检查项 满分 得分 说明
内存 不超过80M 11.11 5.28 实际内存峰值为 122 M
流量 页面消耗不超过200KB 11.11 9.44 实际页面消耗达到 230 KB
耗电量 每小时不超过 300 mAh 11.11 11.11 实际耗电量为 300 mAh
页面重绘 3x 和 4x 重绘不超过 1/3 11.11 0.0 实际 3x 和 4x 重绘超过 1/3 的页面有20个
无内存泄露 11.11 8.89 内存泄露点有1个
无内存抖动 11.11 6.67 内存抖动点有2个
帧率不小于10 11.11 7.78 最低帧率为7 fps
启动时间 热启动时间不超过3s 11.11 7.16 综合时间取全新启动。启动时间为 6.1s
响应时间 关键业务响应时间不超过3s 11.11 11.11 关键业务最大响应时间为 2.26s

备注:其中 内存抖动、内存泄露 采用的测试机为 小米 红米Note1 ,其它项为 Mi3 联通版。详细内容请看 设备配置

稳定性

检查项 满分 得分 说明
弱网环境跑monkey 异常概率低于万分7 10.0 6.0 (ANR)异常2次
无网环境跑monkey 异常概率低于万分7 10.0 10.0 正常
正常网络环境跑monkey 异常概率低于万分7 30.0 30.0 正常
无后台进程应用持续运行10小时无异常情况 20.0 20.0 正常
系统Cpu占用率高于80%以上持续运行5小时无异常退出 10.0 8.0 (ANR)异常1次
在测试过程中无明显crash,卡顿等等情况 20.0 10.0 测试过程中和跑monkey的时候经常性退出需要重新登录

由于篇幅所限,评分规则放在报告末尾的 附录。有兴趣的同学可以点击查看

Bug List

序号 类型 严重级别 描述
1 内存溢出 P0 拍立返时,点击拍照,屏幕卡在转圈loading界面,日志出现out of memory
2 内存泄露 P0 MAT 分析内存情况时发现内存泄露嫌疑对象:com.wangyin.maframe.cache.ImageMemoryCache
3 其他体验问题 P1 在测试过程中经常出现要求重新登录,体验不是很流畅
4 内存抖动 P1 在用户余额页面切换至京东小金库模块会有明显内存抖动
5 内存抖动 P1 在使用扫一扫时,存在明显的内存抖动
6 界面重绘 P1 至少20个界面出现3x或者4x重绘
7 功能 P1 电影票-观看影片预告片,点击左上方关闭按钮,仍然在播放视频
8 功能 P1 在操作过程中至少遇见三次突然需要重新登录的情况
9 安全 P1 apk包可直接被apktools等工具反编译得到源码与资源文件
10 安全 P1 反编译得到的源码,经过二次修改后可直接打包成新的apk文件,可注入病毒与广告
11 内存峰值 P2 在界面间频繁操作,内存占用峰值,达到122M
12 帧率 P2 操作界面过程中,帧率一般在10以下,较卡顿
13 安全 P3 修改手势密码的界面可通过外部 indent 启动,若此时京东钱包在后台运行并处于已登录状态,将可直接修改手势密码,绕过界面上必须先输入登录密码才可修改手势密码的限制
14 启动时间 P3 启动时间较长,平均启动时间达到6.1s
15 体验 P3 手势密码部分划较快时,可能出现中间经过的点没有滑到
16 安全 P3 反编译后,libWangyinCryptoLib.so等加密库可直接断点调试
17 流量 P4 随机打开活动页面,流量最大达到230kb
18 安全 P5 shared_prefs目录下MYINFO.xml文件中暴露了用户名(若包含其他信息则可能出现泄漏)

总体结论

安全

好的地方:

  • 敏感数据网络传输使用 https ,且应用内自动校验服务端 ssl 证书,能有效阻止 dns 篡改、代理抓包等获取传输数据的手段。
  • 日志输出中没有敏感信息

不好的地方

  • 作为金融软件,没有对应用本身任何加壳、防重打包、防篡改资源文件、防反编译方面的保护。 甚至代码混淆也没有(更正:有代码混淆,只是程度还不是太高)。大大降低了攻击者制作恶意包的门槛。且经过团队成员尝试,确实能重打包出可正常使用的应用。

  • 本地数据库未加密,且存有部分敏感信息

  • 组件暴露过多,甚至连相当重要的修改手势密码的 activity 也是可以被外部调用的。这会导致用户在不知情的情况下被其他人修改手势密码。

性能

好的地方:

  • 耗电量不是太大
  • 关键业务启动时间在 3s 内

不好的地方

  • 内存峰值过大,超过 120 M

  • 发现1处内存泄露和2处内存抖动,内存管理不大理想

  • 页面重绘过多,导致帧率偏低,用户用起来不流畅

  • 启动时间过长

稳定

好的地方:

  • 应用总体比较稳定,Monkey 测试下 Crash 出现次数少。

不好的地方

  • 弱网下出现2次 ANR ,说明对弱网下异常数据包的处理能力有待加强。

附录

评分规则

安全

检查项 检查项说明 权重(该检查项基础分) 评分方式
本地数据敏感信息均经过加密 检查 /data/data/、/sdcard/ 及其他应用使用到的存储的数据是否经过加密,尝试使用主流解密方法进行解密 3.85 通过得所有分。不通过0分
本地数据没有明文存储的敏感信息 本地没有经过加密的存储数据均非敏感信息(如密码、金额、cookie、token) 3.85 通过得所有分。不通过0分
本地数据篡改检测 当手动篡改本地存储数据后,应用能检测到此篡改并自动修正并给出警告 3.85 通过得所有分。不通过0分
使用 https 使用 https 进行加密通信 7.69 通过得所有分。不通过0分
不允许使用自定义 ssl 证书 应用中校验 SSL 证书是否为此应用对应后台的 SSL 证书。由于 Android 可以通过设置信任第三方证书(如 fiddler 的证书),因此如果信任所有系统信任证书会造成 https 被解密。 3.85 通过得所有分。不通过0分
敏感信息加密传输 数据包中所有敏感信息加密传输(包括但不限于密码、金额、用户个人信息) 7.69 通过得所有分。不通过0分
数据包防篡改校验(服务端) 不接受一模一样的两个数据包(有可能第二个包是 replay 出来的),不接受手工更改过数据包参数的数据包(需要有个类似 CRC 校验的值检验数据包内容是否被篡改) 7.69 通过得所有分。不通过0分
数据包防篡改校验(客户端) 不接受一模一样的两个数据包(有可能第二个包是 replay 出来的),不接受手工更改过数据包参数的数据包(需要有个类似 CRC 校验的值检验数据包内容是否被篡改) 7.69 通过得所有分。不通过0分
DNS 劫持校验 接口地址若使用域名应校验服务器是否正确(例如每个数据包中包含自定义规则的 token )。若使用 ip 地址则此项直接通过。 3.85 通过得所有分。不通过0分
权限扫描,除少量与外部沟通的组件外其他组件不允许外部调用 使用 drozer 运行 run app.package.attacksurface ,检查允许外部调用的组件是否确实必须允许外部调用 7.69 通过得所有分。不通过0分
各 activity 接收空/具有非法值的 intent 后保持稳定 使用 drozer 运行 run app.activity.start –action –category –component 检查各 activity 接收空/具有非法值的 intent 后反应 3.85 通过得所有分。不通过0分
content provider 防 sql 注入 使用 drozer 运行 run scanner.provider.injection -a 检查是否存在 sql 注入漏洞 3.85 通过得所有分。不通过0分
content provider 防遍历文件 使用 drozer 运行 run scanner.provider.traversal -a 检查是否能遍历 content provider 的文件 3.85 通过得所有分。不通过0分
DEX加壳保护,防止静态反编译直接获取源码 使用apktool、apkIDE、Apk改之理/androidkiller进行逆向获取资源。DEX有做加壳加固/有加入花指令更好,最终无法直接得到Java源码 7.69 通过得所有分。不通过0分
资源文件加密,防止直接查看或修改资源文件 使用apktool、apkIDE、Apk改之理/androidkiller进行逆向获取资源。资源文件有做压缩加密等操作,无法直接查看 3.85 通过得所有分。不通过0分
反二次打包,使二次打包时无法成功或打包后的apk无法安装使用 使用apktool进行重打包。有对核心代码做高级混淆欺骗,使二次打包失败或打包后的apk无法使用 7.69 通过得所有分。不通过0分
so文件保护,防止高级调试工具对so文件进行动态调试获取接口等敏感信息 使用IDA、JEB等工具进行动态调试。对so文件有加密或隐藏,防止被IDA等工具直接动态调试 3.85 通过得所有分。不通过0分
屏蔽日志输出流中的info、debug等信息 3.85 通过得所有分。不通过0分
核心业务中无敏感信息在日志中输出 3.85 通过得所有分。不通过0分

性能

设备配置

检查细则

检查项 检查项说明 权重(该检查项基础分) 评分方式
内存 不超过80M 11.11 小于80M为满分,大于80M,为 权重*(1-(x-80)/80)
流量 页面消耗不超过200KB 11.11 小于200KB为满分,大于200KB,为 权重*(1-(x-200)/200)
耗电量 每小时不超过 300 mAh 手机要处于未充电状态,测试场景分3个:1).高负荷操作1小时(高频率使用或者跑Monkey)。2).中等负荷操作一小时(平时正常使用频率)。3).低负荷操作小时(程序处于后台)。 11.11 小于300mAh为满分,大于300mAh为 权重*(1-(x-300)/300)
页面重绘 3x 和 4x 重绘不超过 1/3 11.11 小于等于2个为满分,大于2个每个扣权重的十分之一分。超过12个零分
无内存泄露 11.11 0个为满分,大于0个每个扣权重的十分之二分。超过5个零分
无内存抖动 内存是否发生抖动:这个地方要从两方面检测,一个是自然抖动,就是无任何操作情况下,是否发生抖动。第二个情况是点击才会出现内存突然增加或减少,频繁操作查看是否出现抖动。若发生抖动,与具有相同功能的其他App进行对比,如果对比App不发生抖动,则可认为待测App存在问题。 11.11 0个为满分,大于0个每个扣权重的十分之二分。超过5个零分
帧率不小于10 11.11 大于10为满分,否则为 权重*(1-(10-x)/10)
启动时间 热启动时间不超过3s 综合启动时间为全新启动,冷启动,热启动三项平均值 11.11 小于4.5s为满分,否则为 权重*(1-(x-4.5)/4.5)
响应时间 关键业务响应时间不超过3s 11.11 小于3s为满分,否则为 权重(1-(x-3)/3)

稳定性

检查项 检查项说明 权重(该检查项基础分) 评分方式
弱网环境跑monkey 异常概率低于万分7 9.6K/s~19.8K网络环境进行monkey测试,随机事件数量大于 100万运行时间大于5小时 10.0 通过基础分为权重,异常一次扣2分。不通过0分
无网环境跑monkey 异常概率低于万分7 无网进行monkey测试,随机事件数量大于100万运行时间大于5小时 10.0 通过基础分为权重,异常一次扣2分。不通过0分
正常网络环境跑monkey 异常概率低于万分7 正常环境进行monkey测试,随机事件数量大于 100万运行时间大于5小时 30.0 通过基础分为权重,异常一次扣2分。不通过0分
无后台进程应用持续运行10小时无异常情况 20.0 通过基础分为权重,异常一次扣2分。不通过0分
系统Cpu占用率高于80%以上持续运行5小时无异常退出 10.0 通过基础分为权重,异常一次扣2分。不通过0分
在测试过程中无明显crash,卡顿等等情况 20.0 通过基础分为权重,异常一次扣2分。不通过0分

留言

2016-02-05

⬆︎TOP