文章目录
- 移动金融APP备案
- Android APP数据存储
- sdcard 文件
- SQLite数据库
- ContentProvider
- sharedPreferences
- APK客户端敏感信息测试
- Logcat 运行日志
- SQLite 数据库
- sharedPreferences
- 其他本地文件的检查
- Genymotion模拟器补充
移动金融APP备案
最近在接触新的工作项目——移动金融APP备案,需要对金融 APP 客户端进行安全测试,在此总结记录下相关的部分测试内容和方法。
关于移动金融APP备案,
Part1:首先看中国互联网金融协会的通知
为落实《中华人民共和国网络安全法》要求,加强移动金融客户端应用软件(以下简称客户端软件)安全管理,根据中国人民银行印发的《关于发布金融行业标准 加强移动金融客户端应用软件安全管理的通知》(银发〔2019〕237号,以下简称《通知》),中国互联网金融协会(以下简称协会)于2019年12月启动了客户端软件实名备案工作。
客户端软件备案工作启动以来,各金融从业机构积极通过移动金融客户端应用软件备案管理系统(https://finapp.nifa.org.cn)向协会登记了有关备案信息。依据中国人民银行发布的《移动金融客户端应用软件安全管理规范》,协会结合相关检测机构出具的测评结果,经综合审核,于5月19日对首批拟备案的33家机构的73款客户端软件名单在协会官网(http://www.nifa.org.cn)和《金融时报》予以公示。后续,协会将按照《通知》要求,持续做好客户端软件备案、风险监测等行业自律管理工作,督促引导各金融从业机构严格落实法律规定和监管要求,为金融消费者提供安全、便捷、满意的移动金融产品及服务。
随着第一批名单的公布,想必现在各个公司老板都已经在催运营部门准备备案了吧。
Part2:解读一下政策
- 是人民银行要监管各大贷款APP,互联网金融协会负责去落实做这个事情;
- 互联网金融协会拉了几个检测机构做这个事情;
- 互联网金融协会组织了培训,会员单位免费一人参加,不是会员的交2500元。如果是大型金融机构,建议加入协会会员,否则你不会是第一批,你懂的。这个是定期开展的,不是天天搞。
- 培训后,要按照相关法律文件进行整改。
- 公安部署名的那个《APP违法违规XXX》这个是高压线;中国人民银行《移动金融客户端XXXX》这个是参考书;《个人金融信息保护技术规范》这个是给开发人员看的标准。
- 改完,花点小钱找检测结构检测。
Part3:附相关法律文件名称
- 《网络安全法》-国家层面的立法
- 《金融科技(FinTech)发展规划(2019-2021年)》-懂政治
- 《个人金融信息保护技术规范》(以下简称规范)(JR/T 0171-2020)-随便看看
- 《App违法违规收集使用个人信息行为认定方法》-国家互联网信息办公室、工业和信息化部、公安部、市场监管总局四部委–高压线
- 《关于发布金融行业标准 加强移动金融客户端应用软件安全管理的通知》(银发〔2019〕237号)–领会文件精神
- 《移动金融客户端应用软件安全管理规范》-中国人民银行–参考书
Android APP数据存储
先来看看中国人民银行发布的《移动金融客户端应用软件安全管理规范》中对APP客户端本地存储数据的安全要求:
本文将简单介绍 Android APP 客户端的四种数据存储方式(分别为:文件存储数据、SQLite数据库存储数据、使用ContentProvider存储数据、使用SharedPreferences存储数据)与相关风险点,从安全的角度出发,对本地信息存储进行安全测试以及描述涉及到的检测方法与流程。
以下是对几种数据本存储方式的介绍:
sdcard 文件
文件存储方式主要是使用IO流操作读写 sdcard 上的文件,比如应用程序数据文件夹下的某一文件被其他应用读取、写入等操作,其核心原理为: Context 提供了两个方法来打开数据文件里的文件IO流 FileInputStream openFileInput(String name)、FileOutputStream(Stringname , int mode)
,这两个方法第一个参数用于指定文件名,第二个参数指定打开文件的模式。不过权限需要在 AndroidManifest.xml 文件上进行配置:
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
SQLite数据库
SQLite是轻量级嵌入式数据库引擎,支持 SQL 语言,并且只利用很少的内存就有很好的性能,是android等主流移动设备上的复杂数据存储引擎。SQLiteDatabase 类为我们提供了很多种方法,支持增删查改等基本的数据库操作。
APP 运行生成的*.db
文件一般位于:
/data/data/<package name>/databases/*db
ContentProvider
ContentProvider 主要用于程序之间的数据交换,这些数据包括文件数据、数据库数据和其他类型的数据。一个程序可以通过实现一个 Content Provider 的抽象接口将数据暴露出去,其他的应用程序可以通过统一的接口保存、读取、修改、添加、删除此 Content Provider 的各种数据(涉及到一定权限)。
Content Provider 中使用的查询字符串有别于标准的SQL查询。很多诸如 select, add, delete, modify 等操作我们都使用一种特殊的URI来进行,这种 URI 由3个部分组成 “content://”
, 代表数据的路径,和一个可选的标识数据的 ID。
sharedPreferences
该存储方式通常用来存储应用的配置信息,保存方式基于 XML 文件存储的 key-value 键值对数据,一般作为数据存储的一种补充。SharedPreferences 对象本身只能获取数据而不支持存储和修改,存储修改是通过 SharedPreferences.edit()
获取的内部接口 Editor 对象实现。SharedPreferences 本身是一个接口,程序无法直接创建 SharedPreferences 实例,只能通过 Context 提供的 getSharedPreferences(String name, intmode)
方法来获取实例。
APP 的 sharedPreferences 文件存储路径为:
/data/data/<package name>/shared_prefs
APK客户端敏感信息测试
介绍完移动金融APP备案的项目背景、以及Android本地数据存储技术,下面开始步入正题,介绍如何进行APK客户端敏感信息测试。
1、APK数据安全测试要点
在对本地信息存储方面进行安全测试时,一般主要检查:
- SQLite 数据库文件是否保存、泄漏敏感信息;
- SharedPreferances 配置文件是否保存、泄漏敏感信息;
- APP客户端本地 log 运行日志是否打印、泄露用户敏感信息。
2、APK数据安全测试工具
在此次的安全测试中,主要使用AndroidSDK(Software Development)中集合的软件开发工具,主要包括:
- ADB(Android Debug Bridge),Android sdk中的一个工具,分为客户端(电脑)和服务端(android手机或者模拟器),可以用来直接操作管理android模拟器或者真实的android设备。
- DDMS(Dalvik Debug Monitor Service),Android sdk 中的一个工具,是 Android 开发环境中的 Dalvik 虚拟机调试监控服务。提供例如:为测试设备截屏,查看正在运行的线程以及堆信息、APP运行日志 Logcat、APP文件管理等服务。通存放在
sdk/tools/
路径下,直接双击ddms.bat
运行。 - Sqlite3数据库管理工具,Android SDK 的
adk/platform-tools
目录下提供的一个简单的 sqlite 数据库管理工具。可以方便的使用其对sqlite数据库进行命令行的操作,也可以安装SQLite Expert
进行图形化的操作。
Logcat 运行日志
下面先来看看 APP 运行日志的检查,本次测试我是用的是 Genymotion 手机模拟器,模拟器型号为 Google Nexus 6。
1、启动模拟器后,首先在 Android SDK 安装路径下找到 monitor.bat
,双击运行 DDMS 工具:
不知道为何我的 DDMS 工具出问题了(原本好好的…),解决办法是打开另一个:
DDMS 打开后页面如下:
2、先重点关注 Logcat 日志模块,在不过滤日志的情况下,所有运行的进程日志都会被打印显示,显得十分杂乱:
3、可以右键选择 “Find” 按键对日志进行关键字搜索,此处演示某 APP 登录时的日志打印了用户的手机号码和密码(目测 Base 64 值):
4、同时可以创建日志过滤条件,记录指定进程或APP的日志,如图创建过滤器,记录QQ浏览器的日志:
那么在对于的过滤器里,将全部是QQ浏览器的日志:
进一步地还可以把日志保存到 PC 本地文件留存或者搜索,很简单,不演示。
SQLite 数据库
查完敏感的运行日志,接下来查一下 SQLite 数据库是否存储敏感信息,这时候就要借助 DDMS 的 File Exploer
模块了:
从图中我们可以在/data/data/<package name>/databases/*db
路径下找到对应APP的本地 SQLite 数据库文件。
【注意】
/data/data
路径下的文件是需要 root 权限才能访问的,故需要一个已经 root 的测试机(模拟器默认都是已经 root 的)。
对于一些测试机,如果暂时没有权限查看到/data
目录下的文件,需要使用adb shell
以 root 身份(手机需要 root)将 data 目录下的文件读写权限进行更改(最简单粗暴就是设置为 777),如下图所示:
1、在获得 root 权限并对 data 目录设置 777后,使用 File Explorer 打开 /data/data,查看所要测试的包名下的 db 文件:
2、将整个待测APP的 databases 文件导出到本地 PC(注意如果此处无法成功导出文件,则要么文件权限尚未设置777,要么手机未完全root):
3、最后,使用 SQLite Expert 可视化数据库管理工具逐一查看获取到的 db 文件,是否包含敏感的信息,如下发现存储了用户的手机号码明文:
sharedPreferences
SQLite 数据库文件查完了,接下来查一下/data/data/<package name>/shared_prefs
路径下的sharedPreferences
文件,同样的需要借助 File Explorer 将待测 APP 对应的 shared_prefs
文件夹整个导出到 PC 本地:
导出到本地桌面文件夹:
编辑器打开文件查看是否存在敏感信息,发现明文存储了用户的手机号码、邮箱:
其他本地文件的检查
除了重点对 SQLite 数据库文件和 SharedPreferences 配置文件进行安全检查外,其他的文件夹均可进行敏感文件、关键字的搜索。
Genymotion模拟器补充
当您尝试在 Genymotion中 安装针对 ARM 体系结构编译的应用程序时 ,会出现以下错误消息:
INSTALL_FAILED_CPU_ABI_INCOMPATIBLE
原因是 Genymotion 使用 x86 架构,因此您的 ARM 64 位应用程序不直接兼容。根据您的情况,请采用以下两种方法之一:
您是应用程序的开发人员
您只需要将x86构建目标添加到当前目标。有关更多信息,请单击 此处。
您不是应用程序的开发人员
您可以将ARM安装到x86翻译库(可以在Internet上找到),也可以与应用程序的开发人员联系以寻求x86架构支持。
具体解决方案参见博文:Genymotion-ARM-Translation.zip各安卓版本合集。