隐私合规之大厂初探
背景
随着我国在互联网个人信息保护方面法律法规的完善,互联网行业对于用户隐私信息保护越来越重视。特别是从2019年初由网信办、工信部、公安部、市场监管总局四部门联合成立APP专项治理小组以来,国家相关监管部门也不断加强相关政策制定落实,不断深入开展相关治理专项行动,通过通报批评、限时整改、强制下架的方式落实个人隐私信息。
这里,我们选取主流大厂的APP,通过技术手段来窥探APP在启动、运行过程中都做了些什么。目前市场上的MIUI系统已经可以向用户展示APP获取设备、用户敏感信息的可视界面。我们在这里是更加精确定位到具体代码位置的窥探。
基本信息
这里选择11类设备(Android智能手机)信息,信息名称和具体的Android api(Application ProgrammingInterface)对应关系如表1所示。IMEI、MAC地址、android_id为设备唯一标识符,基站定位、GPS为用户地理位置信息、sim卡信息包括IMSI、手机号、运营商信息,安装列表表示设备所有已安装应用的包名和应用名,传感器包括加速度传感器、温度传感器等,账户为各类应用注册的不同账号信息,WiFi包含WiFi名称、WiFi mac地址以及设备扫描到的所有WiFi的信息。蓝牙信息包括设备蓝牙地址和设备扫描到的蓝牙设备信息。
设备信息类型
对应Android系统api
IMEI
android.telephony.TelephonyManager: getDeviceIdandroid.telephony.TelephonyManager: getImei
基站定位
android.telephony.TelephonyManager: getCellLocationandroid.telephony.TelephonyManager: getAllCellInfo
MAC地址
android.net.wifi.WifiInfo: getMacAddress
android_id
android.provider.Settings$Secure: getString
sim卡信息
android.telephony.TelephonyManager: getSubscriberIdandroid.telephony.TelephonyManager: getSimSerialNumberandroid.telephony.TelephonyManager: getLine1Numberandroid.telephony.TelephonyManager: getNetworkOperatorandroid.telephony.TelephonyManager: getSimCountryIso
安装列表
android.app.ApplicationPackageManager: getInstalledApplicationsandroid.app.ApplicationPackageManager: getInstalledPackages
传感器
android.hardware.SensorManager: registerListener
账户
android.accounts.AccountManager: getAccountsandroid.accounts.AccountManager: getAccountsByType
WiFi
android.net.wifi.WifiInfo: getSSIDandroid.net.wifi.WifiInfo: getBSSIDandroid.net.wifi.WifiManager: getScanResults
GPS
android.location.LocationManager
蓝牙信息
android.bluetooth.le.BluetoothLeScanner: startScanandroid.provider.Settings$Secure: getString para: bluetooth_address
表1:设备信息和api对应关系表
我们从应用宝安卓应用市场下载了主流15款APP,包含支付、电商、即时聊天、本地生活、地图等,APP名称如图1所示。
图1:APP列表
实验过程
我们在红米Note8 (MIUI10.3.2稳定版)安装EdXposed Manager (Version:4.5.4),通过编写hook模块实现对表1中的系统api hook,当app调用某一api时时记录下来时间和系统调用栈。具体实验过程为:
1、 编写hook模块,根据api对应的类名、方法名和参数hook系统api,记录APP调用栈信息,编写完表1中的所有api hook方法后将hook模块打包成apk文件安装到手机上,重启手机使hook模块生效;
2、 安装图1中的APP,打开运行、登录,在APP主页面保持5分钟以上,为避免应用之间相互干扰,实验过程中同一时刻手机只会安装一个APP;
3、 保存APP在运行过程中的hook日志(单条日志样例如表2所示),时间跨度为从开始时5分钟内,将日志从手机中导出待分析;
06-23 18:04:36.243 25121 25121 I android.telephony.TelephonyManager: getDeviceId06-23 18:04:36.243 25121 25121 I Dump stack ===== start =====06-23 18:04:36.243 25121 25121 I Dump stack4: com.sina.weibo.utils.bf ==== DeviceInfo.java ==== 286 ==== b06-23 18:04:36.243 25121 25121 I Dump stack5: com.sina.deviceidjnisdk.DeviceId ==== DeviceId.java ==== 50 ==== getDeviceId06-23 18:04:36.243 25121 25121 I Dump stack6: com.sina.deviceidjnisdk.DeviceId ==== DeviceId.java ==== 39 ==== getDeviceId06-23 18:04:36.243 25121 25121 I Dump stack7: com.sina.weibo.appmonitor.b ==== AppMonitorHelper.java ==== 30 ==== a06-23 18:04:36.243 25121 25121 I Dump stack8: com.sina.weibo.appmonitor.m ==== Log4580Helper.java ==== 51 ==== a06-23 18:04:36.243 25121 25121 I Dump stack9: com.sina.weibo.appmonitor.n ==== SwitchStateObserverForMainProcess.java ==== 41 ==== a06-23 18:04:36.243 25121 25121 I Dump stack10: com.sina.weibo.appmonitor.i ==== GroundStateObserver.java ==== 28 ==== update06-23 18:04:36.243 25121 25121 I Dump stack11: java.util.Observable ==== Observable.java ==== 163 ==== notifyObservers06-23 18:04:36.243 25121 25121 I Dump stack12: com.sina.weibo.appmonitor.h ==== GroundStateObservable.java ==== 26 ==== notifyObservers06-23 18:04:36.243 25121 25121 I Dump stack13: com.sina.weibo.appmonitor.g ==== GroundStateMonitorImpl.java ==== 188 ==== a06-23 18:04:36.243 25121 25121 I Dump stack14: com.sina.weibo.appmonitor.g$b$1 ==== GroundStateMonitorImpl.java ==== 368 ==== run06-23 18:04:36.243 25121 25121 I Dump stack15: com.sina.weibo.appmonitor.d.e$a ==== AMRunUtil.java ==== 120 ==== handleMessage06-23 18:04:36.243 25121 25121 I Dump stack16: android.os.Handler ==== Handler.java ==== 106 ==== dispatchMessage06-23 18:04:36.243 25121 25121 I Dump stack17: android.os.Looper ==== Looper.java ==== 201 ==== loop06-23 18:04:36.243 25121 25121 I Dump stack18: android.app.ActivityThread ==== ActivityThread.java ==== 6864 ==== main06-23 18:04:36.243 25121 25121 I Dump stack19: java.lang.reflect.Method ==== Method.java ==== -2 ==== invoke06-23 18:04:36.243 25121 25121 I Dump stack20: com.android.internal.os.RuntimeInit$MethodAndArgsCaller ==== RuntimeInit.java ==== 547 ==== run06-23 18:04:36.243 25121 25121 I Dump stack21: com.android.internal.os.ZygoteInit ==== ZygoteInit.java ==== 873 ==== main06-23 18:04:36.243 25121 25121 I Dump stack ===== over =====
表2:单条日志样例表
4、 分析APP运行日志,主要分析内容包括在首次安装时未点击同意隐私政策之前是否调用表1中的api和5分钟内api调用次数。
实验结果:
1、 微信首次安装之后没有弹任何隐私协议直接获取手机设备信息:android_id、IMEI、IMSI、手机号、默认输入法、WiFi信息;
2、 京东首次安装未点击同意隐私政策之前获取手机android_id和mac地址;
3、 拼多多首次安装未点击同意隐私政策之前获取WiFi mac地址、WiFi 名称、android_id、已安装应用列表、IMSI、IMEI、蓝牙名称、手机账户信息;
4、 抖音首次安装未点击同意隐私政策之前获取手机IMEI;
5、 快手首次安装未点击同意隐私政策之前获取手机android_id、蓝牙地址、WiFi mac地址、WiFi名称、WiFi列表、基站信息;
6、 手机百度首次安装未点击同意隐私政策之前获取android_id、WiFi名称;
7、 百度地图首次安装未点击同意隐私政策之前获取android_id、基站信息、WiFi列表、WiFi名称、WiFi mac地址、imsi;
8、 新浪微博首次安装未点击同意隐私政策之前获取手机mac地址、IMEI、IMSI、sim卡序列号、已安装应用列表、蓝牙名称;
9、 支付宝、淘宝、美团、饿了么、QQ、钉钉、高德地图在首次安装未点击同意隐私政策之前未获取表1中的设备信息;
10、表3为APP 5分钟之内获取表1中的的设备信息次数(数据受手机型号、系统版本等隐私影响,仅供参考)。
设备信息APP名称
Imei
基站定位
Mac
android_id
SIM卡信息
安装列表
传感器
账户
WiFi
GPS
蓝牙信息
支付宝
40
27
13
29
25
10
12
1
127
59
4
微信
23
1
6
10
22
5
0
2
340
0
3
淘宝
53
15
15
18
23
2
4
0
103
29
6
京东
1
0
3
8
1
0
0
0
0
0
0
拼多多
14
0
1
55
11
5
28
5
187
1
0
抖音
29
9
3
44
9
3
10
0
53
37
0
快手
11
5
2
23
2
2
0
0
44
0
0
手机百度
32
7
5
166
37
3
0
0
211
9
0
美团
239
37
85
45
200
86
2
0
400
56
1
饿了么
153
13
10
170
51
4
6
0
101
16
4
微博
84
0
39
35
191
6
28
22
58
4
3
38
5
62
84
53
8
1
1
275
4
0
钉钉
10
0
4
36
8
0
6
0
67
4
2
百度地图
36
152
7
884
16
3
15
0
379
12
0
高德地图
32
38
10
29
30
1
12
0
116
437
4
表3:APP获取设备信息次数表(单位:次)
根据国家互联网信息办公室秘书局、工业和信息化部办公厅、公安部办公厅、国家市场监督管理总局办公厅下发的《App违法违规收集使用个人信息行为认定方法》(以下简称办法)中“App首次运行时未通过弹窗等明显方式提示用户阅读隐私政策等收集使用规则;”可被认定为“未公开收集使用规则”,微信在首次安装时未通过弹框方式提示用户阅读隐私政策,可被认定为“未公开收集使用规则”。
在APP隐私政策方面,高德地图获取了用户设备已安装列表但在APP隐私政策文本中并没有在隐私政策中没有说明收集目的,根据办法中“未逐一列出App(包括委托的第三方或嵌入的第三方代码、插件)收集使用个人信息的目的、方式、范围等”可被认定为“未明示收集使用个人信息的目的、方式和范围”。拼多多、新浪微博、QQ获取手机传感器信息但在APP隐私政策文本中并没有说明收集目的,根据办法中“未逐一列出App(包括委托的第三方或嵌入的第三方代码、插件)收集使用个人信息的目的、方式、范围等”这些可被认定为“未明示收集使用个人信息的目的、方式和范围”;
《京东隐私政策》、《“抖音”隐私政策》、《“百度”移动应用隐私政策》、《美团点评隐私政策》、《高德隐私权政策》中没有写明注册地址,根据《App违法违规收集使用个人信息自评估指南》(以下称为指南)不符合“清晰说明个人信息处理规则及用户权益保障”
总结
个人隐私保护存在的问题:
1、没有隐私政策弹窗协议,这一点在目前绝大多数APP都有,笔者仅遇到微信没有弹窗协议。
2、隐私政策文本不规范,有一部分APP隐私政策中没有明确写明公司注册名称和注册地址,但是这一要求是指南中评估点9明确要求以清晰说明APP运营者的基本情况。
3、用户点击同意隐私政策之前开始获取设备信息,像手机状态、android_id、已安装列表信息在大部分手机上没有明确弹框权限使得APP在不需要用户同意情况下就可以获取,因此部分APP处于主动或者不知情情况下获取这类信息。
4、APP未明示收集使用个人信息的目的、方式和范围,这一点主要体现在已安装应用列表和传感器信息方面,主要有以下两个原因:一是这两类信息没有对应明确的系统权限概念,因此在绝大多数手机上不需要用户授权;二是这两类信息在“个人信息”、“个人敏感信息”方面界定模糊,尤其是传感器信息,手机传感器包含信息众多,例如运动传感器、心跳传感器、温度传感器等。