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分 |