京东金融App合规治理的探索与实践
Tech
导读
随着国家对用户隐私信息保护越来越严格,相关的法规、政策、标准相继落地,为了更好的保护用户隐私信息,市场与平台运营中心本着合规安全无小事的原则,在App全生命周期内进行严格把控,通过多种手段相结合,切实保障用户隐私安全。本文主要介绍了平台研发部团队在京东金融App合规治理工作中的相关经验, 包括合规治理背景、重点关注的问题、如何排查合规问题、及移动平台研发部自研工具和平台的介绍、治理合规问题的手段及解决方案。
01隐私合规治理背景
手机的广泛使用,带动了移动互联网的发展,移动互联网应用(App)的种类和数量呈爆发式增长,越来越多地渗透到人们生活、工作的各个领域,正逐渐成为用户信息数据的主要入口和核心载体。App安全和用户个人信息保护态势愈加严峻,侵害用户权益的事件层出不穷,受到国家和社会公众高度关注。
在如此严峻的大环境下,监管部门法律法规密集出台,近一年先后发布实施多部法律法规。《个人信息保护法》、《数据安全法》、《网络数据安全管理条例》、《数据出境安全评估办法》等,主要规范平台主体责任、个人信息收集、算法安全、数据出境等。
伴随着相关安全法规/政策/标准/行动的落地, 各监管部门不断开展App专项治理工作及核查通报, 不合规的App通知整改或直接下架。
作为APP的开发运营者,一方面,要承担起保护用户隐私的责任,另一方面,如果违反,会对企业造成危害。
图1 给企业带来的危害
App违法违规收集和使用个人信息,导致个人信息泄露,不仅给用户人身财产造成损失,也对企业商誉造成影响,甚至对信息安全造成严重的威胁, 因此对App的隐私合规治理迫在眉睫。
02隐私范围的界定
隐私是指个体的敏感信息,群体或组织的敏感信息可以表示为个体的公共敏感信息。中央网信办、工业和信息化部、公安部、市场监管总局四部门联合制定了《App违法违规收集使用个人信息行为认定方法》, 明确了侵犯用户隐私信息的7大类39种情形, 主要包括:
1. 没有公开收集使用规则的情形。
2. 没有明示收集使用个人信息的目的、方式和范围的情形。
3. 未经同意收集使用个人信息的情形。
4. 违反必要性原则,收集与其提供的服务无关的个人信息的情形。
5. 未经同意向他人提供个人信息的情形。
6. 未按法律规定提供删除或更正个人信息功能的情形。
7. 侵犯未成年人在网络空间合法权益的情形。
通俗的理解:
必须有隐私政策,隐私政策中需要有收集用户隐私的范围,第三方SDK信息,以及App权限详细情况。 用户未同意隐私政策时,不允许收集用户的相关隐私数据,并且保证App可正常使用。App要能够撤销授权,注销等功能。 隐私数据传输需加密,隐私数据、敏感权限能不用则不用。 隐私治理,一切从严,目前大厂App几乎都进行过治理,行业常规方案不一定满足合规要求,听从监管的治理建议。
用户隐私信息列举
个人隐私信息包括:个人基本信息、身份信息、生物识别信息、财产信息、常用设备信息、位置信息等。
图2 个人信息列举
03App合规治理实践
3.1 重点关注的问题
2021年监管部门通报下架App的数量高达数百款。随着监管部门检测能力不断提升、执法覆盖面不断扩大,执法趋严是明确态势。分析App被通报的理由,主要集中在违规收集个人信息、App强制、频繁、过度索取权限、违规使用个人信息、超范围收集个人信息、欺骗误导用户下载等方面。
图3 重点关注的问题
3.1.1 隐私政策
隐私政策需要采用“告知-同意”的方式,以明显的方式提醒用户阅读并主动同意隐私政策。几乎每次的治理中,都会涉及隐私政策的修改,主要治理内容包含以下几部分:
必须要有隐私政策,需要明示个人信息收集范围以及收集目的和方式。
隐私政策中需提供第三方SDK列表清单,包括收集用户隐私范围、应用场景、官网地址等。
隐私政策中需提供App权限介绍、权限使用详细信息和使用场景。
3.1.2 App权限
App权限与用户隐私紧密相关,如存储权限-相册/文件、位置权限-地理位置等等,因此做好权限申请的把控也是App合规治理中十分重要的部分。
权限申请需遵循以下几个基本原则:
最小必要原则:权限申请时仅申请有业务必须的权限,不申请与业务无关的权限。
用户可知原则:所有申请的权限需要有明确、合理的场景说明,并告知用户使用目的。
不强制捆绑原则:不强制申请系统权限,不一揽子申请多个权限。
动态申请原则:申请权限时,需在用户触发功能时申请,不提前申请无关权限。
同时在开发时还需要注意:
高敏感权限比如剪切板、通知栏监听权限、定位权限、电话设备、软件列表等重点关注。其中读取剪切板和通知栏权限尤为敏感、剪切板可以读取用户的剪切板任何内容,非必要不读取,读取的内容需加密。通知栏权限可以做到收集用户通知栏任何内容在一些应用市场中属于禁止权限,非必需时去除相关服务。
非用户主动行为,申请权限时48小时内仅弹出一次。
设置中提供权限撤销功能。
3.1.3 数据加密
数据加密可以保障网络免受干扰、破坏,也可以防止用户数据泄露或者被窃取、篡改。这其中包括了本地、网络等数据传输:
本地存储(包括 数据库和本地文件)需进行数据加密,尤其是包含用户信息的数据,如IMEI、用户信息、IP地址等。
网络数据需加密,可采用整体报文加密。
H5中在数据加密传输问题中容易被忽略。例如页面URL中携带的参数 或 接口数据加密情况。
3.1.4 系统敏感API
系统敏感API,包括但不限于Android ID、WIFI信息、IMEI、Mac地址、设备信息等。大型App几乎都会存在API 高频调用、违规调用问题,因此在开发时应尽可能的减少敏感API的调用,不调用与当前业务无关的系统敏感API。
3.1.5 第三方sdk
绝大多数第三方SDK并非开放源代码,只提供相关功能的公开接口。第三方SDK不透明,作为宿主App很难核实这些SDK是否合规,这无疑是增加了App本身的合规风险。常见的SDK合规问题包括权限过度申请、高频调用敏感API、明文传输、违规传输等。
3.2 搭建合规保障体系
在严峻背景下,京东金融App本着安全合规无小事的原则, 在App全生命周期内进行严格把控, 通过多种手段相结合的方式, 近一年来进行了十多轮的合规治理,涉及内外部几十个SDK,上千处的API改动,顺利的完成了监管的要求,为用户的隐私安全保驾护航。
3.2.1 标准化
目前的合规治理工作已经是常态化, 为此团队专门成立了京东金融App合规治理虚拟小组, 专门负责京东金融App隐私合规问题的处理, 小组成员包括了App研发、产品、质量、安全专员、以及法务、安全合规等部门的同事。同时制定合规治理SOP,指导大家日常工作,保证不带着问题上线。
政策解读
监管部门出台新法律法规后, 集团信息安全部第一时间对其进行解读,并将解读内容下发给各个部门安全对接人,京东金融App合规治理小组会从业务视角对内容进行解读和评估,如果存在隐患,则与法务、安全、合规等部门进行沟通并确定治理方案,治理完成后安排上线。 需求阶段
所有需求在确定产品方案后, 必须经过法务部门、合规部门、安全部门进行评审,评审通过后方可进入研发阶段。 研发阶段
研发人员完成相应功能的技术方案制定后,会统一邀请安全同事进行方案的安全评估,安全确认无风险后,才可启动具体研发工作。 测试阶段
功能测试及回归测试阶段,会进行专项的安全合规测试,结果会汇总到测试报告中。同时研发人员会依照《 安全合规checklist》对本次功能变更涉及到的风险点进行逐一排查, 并把排查结果发给安全部门的同事进行确认, 确认无风险, 才具备上线条件。此过程中如有涉及隐私相关的权限变更,SDK变更等研发人员也会通知法务同事进行隐私政策更新。
发布阶段
功能开发完成后,App上线前必须通过自研Utrust合规检测平台进行安全合规扫描,最终通过后才会予以上线。(合规检测平台本身也根据政策的变化进行更新与迭代)。
运营阶段
如果线上App被监管机构抽检出存在安全合规问题,包括但不限于工信部、网信办等下发的治理通知,由集团合规部、安全部统一梳理监管通知并下发到各个业务,明确治理要求及时间点。京东金融App合规治理小组牵头组会讨论确定治理方案及发版计划,并最终与安全、合规部门确认,并反馈给监管机构。
3.2.2 工具化
(1)Pandora Kit 开发助手
Pandora Kit 开发助手是京东金融App自研的开发工具集,目前已经融合了50+的移动端及PC端工具。其中包含了大量的合规治理工具,如数据库/SP助手、实时权限查询、三方SDK权限查询、FindUsages等功能。
通常在合规治理中,几乎每个版本都需要排查第三方SDK权限情况。通过人工对编译产物进行排查,会耗费开发者较多的时间,京东金融App通过Pandora Kit中三方权限列表功能,仅需开启App调试即可通过浏览器查询到当前App所有三方权限列表。
合规治理中需要排查本地存储加密情况,本地存储文件多、格式不统一打开时需各种工具,例如数据库需要sqlite导入查看内容,过程繁琐,通过Pandora Kit 数据库/SP助手功能,清晰明了的通过浏览器可视化操作本地存储文件,降低排查问题门槛,提升排查问题的效率。
在排查敏感API过程中, 研发人员经常需要寻找目标API的调用, 在IDE中可以使用Find Usages功能, 但该功能仅能查询存在源代码的类, 无法对二进制库中的类进行查询, Pandora Kit FindUsages功能很好的解决了此问题, 使用该功能, 可以查询整个App中目标API的调用。
图4 Pandora使用效果图
图5 Pandora使用效果图
(2)Lancet合规工具
在监管部门的历次检查中, 以下的三种行为每次检查都会涉及, 需要重点关注。
关注1:用户同意隐私协议前获取任何用户信息的行为,包括但不限于:AndroidID、WiFi信息、IMEI、Mac地址、系统版本等。
关注2: 频繁调用系统方法获取敏感信息的行为。
关注3: App在后台获取敏感信息的行为。
为了解决上述问题,采用 “合规SDK”统一封装收口管理的思路,与京东零售团队共建了Lancet合规工具, 解决App中存在的未同意隐私政策前调用敏感API、高频调用系统敏感API、后台获取敏感信息等不合规问题。
Lancet合规工具分为两部分
① 合规SDK
合规SDK提供了一套收口方法, 用于替换系统的敏感API或属性。
图6 收口方法列举
接入合规SDK后可解决的问题:
a. 当用户未同意隐私政策, 调用收口方法时, 收口方法不会调用系统方法,而是直接返回默认值, 解决用户同意隐私协议前App获取用户信息的问题。
b. 当App第一次调用收口方法时, 收口方法会对获取真实数据进行缓存, 后续再次调用收口方法, 直接返回缓存值, 解决App频繁调用系统方法获取敏感信息的问题。
c. 当App处于后台时, 调用收口方法时, 收口方法不会调用系统方法, 而是直接返回默认值, 解决App在后台获取敏感信息的问题。
② 合规插件
在接入合规SDK时,京东金融App面临着如下三个问题:
问题1: 如果采用人工修改源码的方式接入,会有900+处改动,存在大量重复性工作。
问题2: 京东金融App中使用的部分SDK属于第三方SDK,京东金融团队没有源代码,无法接入合规SDK。
问题3: 即使App全部使用人工方式接入合规SDK后,后续依旧会有人在不知情或者疏忽的情况下使用系统方法获取系统信息, 无法达到一劳永逸。
为了解决上述问题,京东金融团队研发Lancet合规插件, 该插件的作用就是完成合规SDK的自动化接入。
在App工程编译期间, Lancet合规插件会侵入到编译流程中, 插件会把App中所有系统敏感API或属性替换为SDK的收口方法 , 从而解决直接使用系统方法时面临的隐私合规问题。
图7 合规插件工作流程
合规插件具有如下优势:
优势1:使用友好, 无侵入性, 插件不会修改用户源代码, 只在编译期生效。
优势2:对于没有源码的SDK, 也可在编译期完成合规SDK的自动化接入。
优势3:在编译期动态接入, 因此可以一劳永逸的解决上述合规问题。
Lancet具有很强的通用性,目前该方案已在京东金融、京东、7鲜、1号会员店、京东企业购等10+App中上线,并且上线半年来线上情况稳定,充分验证了方案的能力和可行性。
3.2.3 平台化
(1)平台介绍
京东金融App在合规治理过程中, 有如下痛点:
a. 在App产研阶段, 由于不了解相关隐私合规风险点, 设计或开发了存在合规问题的功能或流程, 在应用发布前没有有效的手段进行检测排查。
b. 目前App合规检测的主要方式是标记敏感API,但此方式依赖研发人员手动对敏感内容进行标记,需要大量的人工干预,并且可能存在无法全面覆盖的情况。因此这种方式从效率,成本,风险性考虑是不合理的。
c. 由于部分第三方SDK、外部程序的安全审查过程缺乏,安全意识薄弱, 京东金融App引入这些功能后, 导致最终的App应用存在未知的风险漏洞。
为了解决上述问题, 京东科技自研了Utrust合规风险检测系统,Utrust能够对移动应用个人信息安全问题进行多方位的全面检测,对应用App中收集个人信息行为是否违法违规进行认定,并形成专业的检测报告,为App开发者提供专业的合规、安全的治理依据。
(2)能力图谱
Utrust 平台能力图谱如下所示,主要包括:APK/SDK静态扫描,APK动态扫描,隐私政策检测,自查合规评估,检测报告,应用协同,系统功能,外部系统服务等。
图8 Utrust能力图谱
APK/SDK静态扫描:静态扫描对Android应用程序APK包文件进行解压和反编译,获取App基础信息、权限调用及源码程序等重要数据。
APK动态扫描:动态扫描主要用于对应用程序在运行时状态下的行为进行实时监控及动态检测,分为流量检测和场景检测两个部分。
隐私政策检测:对App内的隐私政策文件进行内容扫描,检测是否存在符合监管标准的相关声明信息,主要包括:系统权限使用声明、第三方SDK集成声明、个人信息使用声明等。
自查合规:在对应用App检测前,隐私合规检测系统也向App管理团队提供了自查预检入口,收集整理重点排查的检测项与检测点,方便团队提前发现风险点。
检测报告:静态扫描、动态扫描、隐私政策检测结束后,需要将分析数据进行统计归类,标注出调用权限风险等级与具体风险点,并形成直观量化的报表以供App运营团队自查整改,同时根据检测结果给出专业性整改意见。
应用协同:由于企业内部存在多个移动应用产品,每个产品都拥有自己的产研团队,在检测期间往往需要团队内部多人协同参与整改,这就需要建立完善的协同管理机制,以支持不同团队在系统内部对不同App的检测需求。
更多介绍请参见: 京东科技隐私合规检测系统设计最佳实战
3.3 案例解析及经验分享
3.3.1 合规问题排查方法
(1)使用Jadx工具排查
Jadx 是一个开源逆向工具,可以反编译jar、class、apk、dex等文件。Jadx简单易用,可以帮助在合规治理中轻松搜索代码。可以根据合规治理场景,定制自己的开发需求。例如通过对Jadx扩展,一键导出所有的敏感API调用。
图9 Jadx使用效果图
(2)根据调用栈排查
合规治理中经常需要排查敏感API在何处进行了调用, 常见的方法都是打log、查代码,但这种情况仅适用于代码结构简单的情况,在复杂场景下,仅靠代码、日志分析很难排查出问题。这种情况需要从技术层面进行分析和查找解决方案,因此可以通过动态代理 hook api 方案 、字节码插桩、Pandora工具等几种方式获取调用栈排查敏感API调用情况, 帮助解决问题。
图10 敏感API调用排查流程
动态代理hookapi方案,适用于 hook Android Framework中一些敏感API方法的排查,在代理类中增加自己的行为或日志。例如在 PackageManager中通过对 sPackageManager 替换完成代理类的插入,在代理类中增加对getInstalledPackages方法的hook点, 输出调用栈。
动态代理hook方案代码
package com.jd.jrapp.application;
import android.util.Log;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class HookFramework {
public static final String TAG = "HookFramework";
public HookFramework() {
}
public void fixSystemFramework() {
try {
Class<?> activityThreadClass =
Class.forName("android.app.ActivityThread");
Method currentActivityThreadMethod = activityThreadClass.
getDeclaredMethod("currentActivityThread");
Object currentActivityThread =
currentActivityThreadMethod.invoke(null);
Field sPackageManagerField = activityThreadClass.
getDeclaredField("sPackageManager");
sPackageManagerField.setAccessible(true);
Object sPackageManager = sPackageManagerField.get(currentActivityThread);
Class<?> iPackageManagerInterface =
Class.forName("android.content.pm.IPackageManager");
Object proxy = Proxy.newProxyInstance(
iPackageManagerInterface.getClassLoader(),
new Class<?>[]{iPackageManagerInterface},
new IActivityManagerProxy(sPackageManager));
sPackageManagerField.set(currentActivityThread, proxy);
} catch (Exception var10) {
Log.d(TAG, "" + var10);
}
}
private class IActivityManagerProxy implements InvocationHandler {
private Object iActivityManager;
public IActivityManagerProxy(Object iActivityManager) {
this.iActivityManager = iActivityManager;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String name = method.getName();
if ("getInstalledApplications".equals(name)
|| "getInstalledPackages".equals(name)
|| "getInstalledPackagesAsUser".equals(name)
|| "getInstallerPackageName".equals(name)) {
Log.d("jd_proxy", method.getName() + "method 栈信息 = " + getStackTrace());
}
return method.invoke(this.iActivityManager, args);
}
private String getStackTrace() {
try {
StackTraceElement[] var0 = Thread.currentThread().getStackTrace();
StringBuilder var1 = new StringBuilder("stacktrace: \n");
int var2 = var0.length;
for (int var3 = 0; var3 < var2; ++var3) {
StackTraceElement var4 = var0[var3];
var1.append(var4.toString()).append("\n");
}
return var1.toString();
} catch (Throwable var5) {
return "";
}
}
}
}
3.3.2 敏感API治理中App前后台状态问题
对于敏感API高频调用问题,可以使用Lancet合规工具,统一收口解决。而限制敏感API后台调用的前提是: 如何正确判断App前后台状态。
通常判断App前后台状态有几种方式:
方式1:通过ActivityManager获取进程列表,筛选前台进程。
方式2:通过ActivityManager获取任务列表,获取顶层页面。
方式3: 通过ActivityLifecycle监听Activity生命周期, 得到当前进程前后台状态。
前两种方式抛开性能问题,可能还是存在一些问题。首先,获取进程列表和任务列表,在合规治理中可能存在歧义,很多情况下不允许获取应用列表,并且该方法需实时调用,也会引起高频调用。其次,判断App前后台状态不准确,App切换到其他应用(按HOME键也是切换到其他应用)时,使用这两种方式可以正确获取App前后台状态,但按关机键进入锁屏状态时,使用这两种方式无法正确获取App前后台状态。方式3,通过页面生命周期进行引用计数,完全可以做到监听当前进程的状态。
但是对于方式3往往容易忽视多进程情况。从合规的角度,当App只有可见时才会认为在前台,即使是前台进程也不应该调用敏感API。多进程情况下,如果任何一个进程有页面在前台,整个App则应认为在前台,比如小程序的场景,小程序页面启动时,App也需要认为在前台。所以需通知其他进程前后台状态,来解决多进程情况,综合所有进程状态得到App前后台状态。
任何一个进程有页面在前台,则App处在前台。
图11 多进程前后台判断
所有进程没有页面在前台,则App处在后台。
图12 多进程前后台判断
3.3.3 WebView合规治理
(1)WebvView调用Wifi信息
Android 系统中 WebView 在初始化或获取UA时会调用获取Wifi信息的相关API。而Wifi信息中可以获取Mac地址,Bssid等信息。针对这个情况,在首页场景及拒绝隐私政策后的页面中,不再使用WebView,包括WebView的初始化及UA相关方法的调用。
图13 webview中敏感信息调用栈
(2)WebView加载隐私政策
合规治理中要求App未同意隐私政策前,不允许使用网络、获取和收集用户隐私。大多数App隐私政策都是H5链接,需要使用WebView加载H5。系统WebView 或目前市场常用的WebView内核,都存在获取Wifi信息、Mac地址、Bssid等不满足合规要求的情况。通过方案调研,为了更彻底的解决问题,京东金融App使用手机自带浏览器打开隐私政策,从而规避隐私政策由于WebView带来的合规问题。
图14 京东金融App隐私政策
3.3.4 剪切板合规治理
今年以来, 监管部门多次要求对App读取剪切板内容的问题进行整改,从最初要求App读取剪切板的内容后如需上报需进行加密处理,到后来把App读取用户剪切板的行为定义为违规收集使用个人信息。经过一系列挣扎、趟坑后,京东金融App决定不再读取用户剪切板内容。
如果不使用对应功能,可能会对业务造成损失,合规固然重要,但是会对业务造成损失。京东金融App采用一种合规的方案,引导用户主动粘贴内容到场景区域,代替读取剪切板功能。很多App中都会存在分享口令,类似必须使用剪切板的场景,京东金融团队从活动中场景引导用户主动复制到固定的区域,让用户主动触发粘贴功能,例如引导用户复制到搜索框,功能如下图所示。
图15 引导用户复制效果图
实际项目中, 也会有部分第三方SDK使用剪切板功能,但推进第三方SDK对其进行合规治理, 治理周期较长, 无法满足监管要求。这种情况可以使用Lancet 合规工具将涉及的敏感API进行替换, 从而完美解决类似问题。
3.3.5 拒绝隐私政策后引起的合规问题
目前大多数App都是拒绝隐私政策后直接退出App, 禁止用户使用, 但根据监管机构最新要求, 要求用户拒绝隐私政策后, App要继续提供必要服务,此问题的治理周期短,治理面临的影响较大。同时治理需考虑的几个问题:
a. 拒绝隐私政策后进入App不能收集用户隐私。
b. 用户可正常浏览访问App。
c. 保证SDK及业务功能正常。
考虑到上线的稳定性,京东金融App考虑了几种解决方案:
方案一:针对于不同意隐私政策的场景,开发简易版首页,当进入App后, 使用权限及隐私数据时,弹出隐私政策弹框,用户在同意隐私政策后进入正常主页。
优点:简单高效能彻底解决问题。
缺点:用户体验差,需单独运营维护。
方案二:不同意隐私政策后进入App,针对主页不同功能进行场景区分,如必须使用隐私数据时,需弹出授权弹框,其他场景不做任何限制,用户可正常使用App。
优点:用户体验好,符合用户习惯,无需单独运营维护。
缺点:场景繁琐,梳理困难。
考虑到用户体验方面以及后期运营问题,京东金融App选择在方案二基础上进行优化,采用Lancet合规工具+ 部分SDK延迟初始化的方式解决此问题。
图16 拒绝隐私政策后的合规方案
3.3.6 第三方SDK合规治理
大多数App都存在多个甚至几十个第三方SDK,第三方SDK时常存在违规收集个人信息、高频调用敏感API、过多申请系统权限等行为,为宿主App带来诸多未知安全合规风险。
第三方SDK从接入到研发上线过程中,可以通过如下手段做到对第三方SDK合规管控:
手段1: 建立第三方SDK接入管理机制和工作流程、开展技术检测确保第三方SDK对用户个人信息的收集、满足安全合规要求等,同时确保第三方SDK个人信息收集、权限等情况与隐私政策中描述相符。
手段2:第三方SDK合规问题,建立合规治理机制,快速响应,排查解决问题。
手段3: App 接入合规SDK,动态拦截敏感API,从App层面统一管理,管控SDK个人信息收集行为。
03App合规治理实践
3.1 重点关注的问题
2021年监管部门通报下架App的数量高达数百款。随着监管部门检测能力不断提升、执法覆盖面不断扩大,执法趋严是明确态势。分析App被通报的理由,主要集中在违规收集个人信息、App强制、频繁、过度索取权限、违规使用个人信息、超范围收集个人信息、欺骗误导用户下载等方面。
图3 重点关注的问题
3.1.1 隐私政策
隐私政策需要采用“告知-同意”的方式,以明显的方式提醒用户阅读并主动同意隐私政策。几乎每次的治理中,都会涉及隐私政策的修改,主要治理内容包含以下几部分:
必须要有隐私政策,需要明示个人信息收集范围以及收集目的和方式。
隐私政策中需提供第三方SDK列表清单,包括收集用户隐私范围、应用场景、官网地址等。
隐私政策中需提供App权限介绍、权限使用详细信息和使用场景。
3.1.2 App权限
App权限与用户隐私紧密相关,如存储权限-相册/文件、位置权限-地理位置等等,因此做好权限申请的把控也是App合规治理中十分重要的部分。
权限申请需遵循以下几个基本原则:
最小必要原则:权限申请时仅申请有业务必须的权限,不申请与业务无关的权限。
用户可知原则:所有申请的权限需要有明确、合理的场景说明,并告知用户使用目的。
不强制捆绑原则:不强制申请系统权限,不一揽子申请多个权限。
动态申请原则:申请权限时,需在用户触发功能时申请,不提前申请无关权限。
同时在开发时还需要注意:
高敏感权限比如剪切板、通知栏监听权限、定位权限、电话设备、软件列表等重点关注。其中读取剪切板和通知栏权限尤为敏感、剪切板可以读取用户的剪切板任何内容,非必要不读取,读取的内容需加密。通知栏权限可以做到收集用户通知栏任何内容在一些应用市场中属于禁止权限,非必需时去除相关服务。
非用户主动行为,申请权限时48小时内仅弹出一次。
设置中提供权限撤销功能。
3.1.3 数据加密
数据加密可以保障网络免受干扰、破坏,也可以防止用户数据泄露或者被窃取、篡改。这其中包括了本地、网络等数据传输:
本地存储(包括 数据库和本地文件)需进行数据加密,尤其是包含用户信息的数据,如IMEI、用户信息、IP地址等。
网络数据需加密,可采用整体报文加密。
H5中在数据加密传输问题中容易被忽略。例如页面URL中携带的参数 或 接口数据加密情况。
3.1.4 系统敏感API
系统敏感API,包括但不限于Android ID、WIFI信息、IMEI、Mac地址、设备信息等。大型App几乎都会存在API 高频调用、违规调用问题,因此在开发时应尽可能的减少敏感API的调用,不调用与当前业务无关的系统敏感API。
3.1.5 第三方sdk
绝大多数第三方SDK并非开放源代码,只提供相关功能的公开接口。第三方SDK不透明,作为宿主App很难核实这些SDK是否合规,这无疑是增加了App本身的合规风险。常见的SDK合规问题包括权限过度申请、高频调用敏感API、明文传输、违规传输等。
3.2 搭建合规保障体系
在严峻背景下,京东金融App本着安全合规无小事的原则, 在App全生命周期内进行严格把控, 通过多种手段相结合的方式, 近一年来进行了十多轮的合规治理,涉及内外部几十个SDK,上千处的API改动,顺利的完成了监管的要求,为用户的隐私安全保驾护航。
3.2.1 标准化
目前的合规治理工作已经是常态化, 为此团队专门成立了京东金融App合规治理虚拟小组, 专门负责京东金融App隐私合规问题的处理, 小组成员包括了App研发、产品、质量、安全专员、以及法务、安全合规等部门的同事。同时制定合规治理SOP,指导大家日常工作,保证不带着问题上线。
政策解读 | 监管部门出台新法律法规后, 集团信息安全部第一时间对其进行解读,并将解读内容下发给各个部门安全对接人,京东金融App合规治理小组会从业务视角对内容进行解读和评估,如果存在隐患,则与法务、安全、合规等部门进行沟通并确定治理方案,治理完成后安排上线。 |
需求阶段 | 所有需求在确定产品方案后, 必须经过法务部门、合规部门、安全部门进行评审,评审通过后方可进入研发阶段。 |
研发阶段 | 研发人员完成相应功能的技术方案制定后,会统一邀请安全同事进行方案的安全评估,安全确认无风险后,才可启动具体研发工作。 |
测试阶段 | 功能测试及回归测试阶段,会进行专项的安全合规测试,结果会汇总到测试报告中。同时研发人员会依照《 安全合规checklist》对本次功能变更涉及到的风险点进行逐一排查, 并把排查结果发给安全部门的同事进行确认, 确认无风险, 才具备上线条件。此过程中如有涉及隐私相关的权限变更,SDK变更等研发人员也会通知法务同事进行隐私政策更新。 |
发布阶段 | 功能开发完成后,App上线前必须通过自研Utrust合规检测平台进行安全合规扫描,最终通过后才会予以上线。(合规检测平台本身也根据政策的变化进行更新与迭代)。 |
运营阶段 | 如果线上App被监管机构抽检出存在安全合规问题,包括但不限于工信部、网信办等下发的治理通知,由集团合规部、安全部统一梳理监管通知并下发到各个业务,明确治理要求及时间点。京东金融App合规治理小组牵头组会讨论确定治理方案及发版计划,并最终与安全、合规部门确认,并反馈给监管机构。 |
3.2.2 工具化
(1)Pandora Kit 开发助手
Pandora Kit 开发助手是京东金融App自研的开发工具集,目前已经融合了50+的移动端及PC端工具。其中包含了大量的合规治理工具,如数据库/SP助手、实时权限查询、三方SDK权限查询、FindUsages等功能。
通常在合规治理中,几乎每个版本都需要排查第三方SDK权限情况。通过人工对编译产物进行排查,会耗费开发者较多的时间,京东金融App通过Pandora Kit中三方权限列表功能,仅需开启App调试即可通过浏览器查询到当前App所有三方权限列表。
合规治理中需要排查本地存储加密情况,本地存储文件多、格式不统一打开时需各种工具,例如数据库需要sqlite导入查看内容,过程繁琐,通过Pandora Kit 数据库/SP助手功能,清晰明了的通过浏览器可视化操作本地存储文件,降低排查问题门槛,提升排查问题的效率。
在排查敏感API过程中, 研发人员经常需要寻找目标API的调用, 在IDE中可以使用Find Usages功能, 但该功能仅能查询存在源代码的类, 无法对二进制库中的类进行查询, Pandora Kit FindUsages功能很好的解决了此问题, 使用该功能, 可以查询整个App中目标API的调用。
图4 Pandora使用效果图
图5 Pandora使用效果图
(2)Lancet合规工具
在监管部门的历次检查中, 以下的三种行为每次检查都会涉及, 需要重点关注。
关注1:用户同意隐私协议前获取任何用户信息的行为,包括但不限于:AndroidID、WiFi信息、IMEI、Mac地址、系统版本等。
关注2: 频繁调用系统方法获取敏感信息的行为。
关注3: App在后台获取敏感信息的行为。
为了解决上述问题,采用 “合规SDK”统一封装收口管理的思路,与京东零售团队共建了Lancet合规工具, 解决App中存在的未同意隐私政策前调用敏感API、高频调用系统敏感API、后台获取敏感信息等不合规问题。
Lancet合规工具分为两部分
① 合规SDK
合规SDK提供了一套收口方法, 用于替换系统的敏感API或属性。
图6 收口方法列举
接入合规SDK后可解决的问题:
a. 当用户未同意隐私政策, 调用收口方法时, 收口方法不会调用系统方法,而是直接返回默认值, 解决用户同意隐私协议前App获取用户信息的问题。
b. 当App第一次调用收口方法时, 收口方法会对获取真实数据进行缓存, 后续再次调用收口方法, 直接返回缓存值, 解决App频繁调用系统方法获取敏感信息的问题。
c. 当App处于后台时, 调用收口方法时, 收口方法不会调用系统方法, 而是直接返回默认值, 解决App在后台获取敏感信息的问题。
② 合规插件
在接入合规SDK时,京东金融App面临着如下三个问题:
问题1: 如果采用人工修改源码的方式接入,会有900+处改动,存在大量重复性工作。
问题2: 京东金融App中使用的部分SDK属于第三方SDK,京东金融团队没有源代码,无法接入合规SDK。
问题3: 即使App全部使用人工方式接入合规SDK后,后续依旧会有人在不知情或者疏忽的情况下使用系统方法获取系统信息, 无法达到一劳永逸。
为了解决上述问题,京东金融团队研发Lancet合规插件, 该插件的作用就是完成合规SDK的自动化接入。
在App工程编译期间, Lancet合规插件会侵入到编译流程中, 插件会把App中所有系统敏感API或属性替换为SDK的收口方法 , 从而解决直接使用系统方法时面临的隐私合规问题。
图7 合规插件工作流程
合规插件具有如下优势:
优势1:使用友好, 无侵入性, 插件不会修改用户源代码, 只在编译期生效。
优势2:对于没有源码的SDK, 也可在编译期完成合规SDK的自动化接入。
优势3:在编译期动态接入, 因此可以一劳永逸的解决上述合规问题。
Lancet具有很强的通用性,目前该方案已在京东金融、京东、7鲜、1号会员店、京东企业购等10+App中上线,并且上线半年来线上情况稳定,充分验证了方案的能力和可行性。
3.2.3 平台化
(1)平台介绍
京东金融App在合规治理过程中, 有如下痛点:
a. 在App产研阶段, 由于不了解相关隐私合规风险点, 设计或开发了存在合规问题的功能或流程, 在应用发布前没有有效的手段进行检测排查。
b. 目前App合规检测的主要方式是标记敏感API,但此方式依赖研发人员手动对敏感内容进行标记,需要大量的人工干预,并且可能存在无法全面覆盖的情况。因此这种方式从效率,成本,风险性考虑是不合理的。
c. 由于部分第三方SDK、外部程序的安全审查过程缺乏,安全意识薄弱, 京东金融App引入这些功能后, 导致最终的App应用存在未知的风险漏洞。
为了解决上述问题, 京东科技自研了Utrust合规风险检测系统,Utrust能够对移动应用个人信息安全问题进行多方位的全面检测,对应用App中收集个人信息行为是否违法违规进行认定,并形成专业的检测报告,为App开发者提供专业的合规、安全的治理依据。
(2)能力图谱
Utrust 平台能力图谱如下所示,主要包括:APK/SDK静态扫描,APK动态扫描,隐私政策检测,自查合规评估,检测报告,应用协同,系统功能,外部系统服务等。
图8 Utrust能力图谱
APK/SDK静态扫描:静态扫描对Android应用程序APK包文件进行解压和反编译,获取App基础信息、权限调用及源码程序等重要数据。
APK动态扫描:动态扫描主要用于对应用程序在运行时状态下的行为进行实时监控及动态检测,分为流量检测和场景检测两个部分。
隐私政策检测:对App内的隐私政策文件进行内容扫描,检测是否存在符合监管标准的相关声明信息,主要包括:系统权限使用声明、第三方SDK集成声明、个人信息使用声明等。
自查合规:在对应用App检测前,隐私合规检测系统也向App管理团队提供了自查预检入口,收集整理重点排查的检测项与检测点,方便团队提前发现风险点。
检测报告:静态扫描、动态扫描、隐私政策检测结束后,需要将分析数据进行统计归类,标注出调用权限风险等级与具体风险点,并形成直观量化的报表以供App运营团队自查整改,同时根据检测结果给出专业性整改意见。
应用协同:由于企业内部存在多个移动应用产品,每个产品都拥有自己的产研团队,在检测期间往往需要团队内部多人协同参与整改,这就需要建立完善的协同管理机制,以支持不同团队在系统内部对不同App的检测需求。
更多介绍请参见: 京东科技隐私合规检测系统设计最佳实战
3.3 案例解析及经验分享
3.3.1 合规问题排查方法
(1)使用Jadx工具排查
Jadx 是一个开源逆向工具,可以反编译jar、class、apk、dex等文件。Jadx简单易用,可以帮助在合规治理中轻松搜索代码。可以根据合规治理场景,定制自己的开发需求。例如通过对Jadx扩展,一键导出所有的敏感API调用。
图9 Jadx使用效果图
(2)根据调用栈排查
合规治理中经常需要排查敏感API在何处进行了调用, 常见的方法都是打log、查代码,但这种情况仅适用于代码结构简单的情况,在复杂场景下,仅靠代码、日志分析很难排查出问题。这种情况需要从技术层面进行分析和查找解决方案,因此可以通过动态代理 hook api 方案 、字节码插桩、Pandora工具等几种方式获取调用栈排查敏感API调用情况, 帮助解决问题。
图10 敏感API调用排查流程
动态代理hookapi方案,适用于 hook Android Framework中一些敏感API方法的排查,在代理类中增加自己的行为或日志。例如在 PackageManager中通过对 sPackageManager 替换完成代理类的插入,在代理类中增加对getInstalledPackages方法的hook点, 输出调用栈。
动态代理hook方案代码
package com.jd.jrapp.application;
import android.util.Log;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class HookFramework {
public static final String TAG = "HookFramework";
public HookFramework() {
}
public void fixSystemFramework() {
try {
Class<?> activityThreadClass =
Class.forName("android.app.ActivityThread");
Method currentActivityThreadMethod = activityThreadClass.
getDeclaredMethod("currentActivityThread");
Object currentActivityThread =
currentActivityThreadMethod.invoke(null);
Field sPackageManagerField = activityThreadClass.
getDeclaredField("sPackageManager");
sPackageManagerField.setAccessible(true);
Object sPackageManager = sPackageManagerField.get(currentActivityThread);
Class<?> iPackageManagerInterface =
Class.forName("android.content.pm.IPackageManager");
Object proxy = Proxy.newProxyInstance(
iPackageManagerInterface.getClassLoader(),
new Class<?>[]{iPackageManagerInterface},
new IActivityManagerProxy(sPackageManager));
sPackageManagerField.set(currentActivityThread, proxy);
} catch (Exception var10) {
Log.d(TAG, "" + var10);
}
}
private class IActivityManagerProxy implements InvocationHandler {
private Object iActivityManager;
public IActivityManagerProxy(Object iActivityManager) {
this.iActivityManager = iActivityManager;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String name = method.getName();
if ("getInstalledApplications".equals(name)
|| "getInstalledPackages".equals(name)
|| "getInstalledPackagesAsUser".equals(name)
|| "getInstallerPackageName".equals(name)) {
Log.d("jd_proxy", method.getName() + "method 栈信息 = " + getStackTrace());
}
return method.invoke(this.iActivityManager, args);
}
private String getStackTrace() {
try {
StackTraceElement[] var0 = Thread.currentThread().getStackTrace();
StringBuilder var1 = new StringBuilder("stacktrace: \n");
int var2 = var0.length;
for (int var3 = 0; var3 < var2; ++var3) {
StackTraceElement var4 = var0[var3];
var1.append(var4.toString()).append("\n");
}
return var1.toString();
} catch (Throwable var5) {
return "";
}
}
}
}
3.3.2 敏感API治理中App前后台状态问题
对于敏感API高频调用问题,可以使用Lancet合规工具,统一收口解决。而限制敏感API后台调用的前提是: 如何正确判断App前后台状态。
通常判断App前后台状态有几种方式:
方式1:通过ActivityManager获取进程列表,筛选前台进程。
方式2:通过ActivityManager获取任务列表,获取顶层页面。
方式3: 通过ActivityLifecycle监听Activity生命周期, 得到当前进程前后台状态。
前两种方式抛开性能问题,可能还是存在一些问题。首先,获取进程列表和任务列表,在合规治理中可能存在歧义,很多情况下不允许获取应用列表,并且该方法需实时调用,也会引起高频调用。其次,判断App前后台状态不准确,App切换到其他应用(按HOME键也是切换到其他应用)时,使用这两种方式可以正确获取App前后台状态,但按关机键进入锁屏状态时,使用这两种方式无法正确获取App前后台状态。方式3,通过页面生命周期进行引用计数,完全可以做到监听当前进程的状态。
但是对于方式3往往容易忽视多进程情况。从合规的角度,当App只有可见时才会认为在前台,即使是前台进程也不应该调用敏感API。多进程情况下,如果任何一个进程有页面在前台,整个App则应认为在前台,比如小程序的场景,小程序页面启动时,App也需要认为在前台。所以需通知其他进程前后台状态,来解决多进程情况,综合所有进程状态得到App前后台状态。
任何一个进程有页面在前台,则App处在前台。
图11 多进程前后台判断
所有进程没有页面在前台,则App处在后台。
图12 多进程前后台判断
3.3.3 WebView合规治理
(1)WebvView调用Wifi信息
Android 系统中 WebView 在初始化或获取UA时会调用获取Wifi信息的相关API。而Wifi信息中可以获取Mac地址,Bssid等信息。针对这个情况,在首页场景及拒绝隐私政策后的页面中,不再使用WebView,包括WebView的初始化及UA相关方法的调用。
图13 webview中敏感信息调用栈
(2)WebView加载隐私政策
合规治理中要求App未同意隐私政策前,不允许使用网络、获取和收集用户隐私。大多数App隐私政策都是H5链接,需要使用WebView加载H5。系统WebView 或目前市场常用的WebView内核,都存在获取Wifi信息、Mac地址、Bssid等不满足合规要求的情况。通过方案调研,为了更彻底的解决问题,京东金融App使用手机自带浏览器打开隐私政策,从而规避隐私政策由于WebView带来的合规问题。
图14 京东金融App隐私政策
3.3.4 剪切板合规治理
今年以来, 监管部门多次要求对App读取剪切板内容的问题进行整改,从最初要求App读取剪切板的内容后如需上报需进行加密处理,到后来把App读取用户剪切板的行为定义为违规收集使用个人信息。经过一系列挣扎、趟坑后,京东金融App决定不再读取用户剪切板内容。
如果不使用对应功能,可能会对业务造成损失,合规固然重要,但是会对业务造成损失。京东金融App采用一种合规的方案,引导用户主动粘贴内容到场景区域,代替读取剪切板功能。很多App中都会存在分享口令,类似必须使用剪切板的场景,京东金融团队从活动中场景引导用户主动复制到固定的区域,让用户主动触发粘贴功能,例如引导用户复制到搜索框,功能如下图所示。
图15 引导用户复制效果图
实际项目中, 也会有部分第三方SDK使用剪切板功能,但推进第三方SDK对其进行合规治理, 治理周期较长, 无法满足监管要求。这种情况可以使用Lancet 合规工具将涉及的敏感API进行替换, 从而完美解决类似问题。
3.3.5 拒绝隐私政策后引起的合规问题
目前大多数App都是拒绝隐私政策后直接退出App, 禁止用户使用, 但根据监管机构最新要求, 要求用户拒绝隐私政策后, App要继续提供必要服务,此问题的治理周期短,治理面临的影响较大。同时治理需考虑的几个问题:
a. 拒绝隐私政策后进入App不能收集用户隐私。
b. 用户可正常浏览访问App。
c. 保证SDK及业务功能正常。
考虑到上线的稳定性,京东金融App考虑了几种解决方案:
方案一:针对于不同意隐私政策的场景,开发简易版首页,当进入App后, 使用权限及隐私数据时,弹出隐私政策弹框,用户在同意隐私政策后进入正常主页。
优点:简单高效能彻底解决问题。
缺点:用户体验差,需单独运营维护。
方案二:不同意隐私政策后进入App,针对主页不同功能进行场景区分,如必须使用隐私数据时,需弹出授权弹框,其他场景不做任何限制,用户可正常使用App。
优点:用户体验好,符合用户习惯,无需单独运营维护。
缺点:场景繁琐,梳理困难。
考虑到用户体验方面以及后期运营问题,京东金融App选择在方案二基础上进行优化,采用Lancet合规工具+ 部分SDK延迟初始化的方式解决此问题。
图16 拒绝隐私政策后的合规方案
3.3.6 第三方SDK合规治理
大多数App都存在多个甚至几十个第三方SDK,第三方SDK时常存在违规收集个人信息、高频调用敏感API、过多申请系统权限等行为,为宿主App带来诸多未知安全合规风险。
第三方SDK从接入到研发上线过程中,可以通过如下手段做到对第三方SDK合规管控:
手段1: 建立第三方SDK接入管理机制和工作流程、开展技术检测确保第三方SDK对用户个人信息的收集、满足安全合规要求等,同时确保第三方SDK个人信息收集、权限等情况与隐私政策中描述相符。
手段2:第三方SDK合规问题,建立合规治理机制,快速响应,排查解决问题。
手段3: App 接入合规SDK,动态拦截敏感API,从App层面统一管理,管控SDK个人信息收集行为。
04总结
04总结
本文分享了京东金融App团队在合规治理工作中的相关经验, 包括合规治理背景、重点关注的问题、如何排查合规问题、自研工具及平台介绍、治理合规问题的手段及解决方案。安全合规无小事, 随着监管政策的不断落地、合规整改日趋严格,京东金融App团队后续将继续夯实技术、提高合规意识、强化合规制度执行力, 切实保障用户的隐私安全。
京东APP秒级百G日志传输存储架构设计与实战
搜索中常见数据结构与算法探究(二)
前端领域的组件化究竟是在谈什么