最近参与的 APP 陆陆续续发现一些需要修改的点去符合工信部的合规要求,针对工信部和应用商店是否有政策违规的风险点,大家可以自查一下以下一些点:
-
应用需要加固
如果App 未加固,攻击者可轻易地反编译APK,获取App 源代码,篡改App 代码逻辑并重打包,对于有付费功能的App,会造成严重的财产损失。- App 注入风险
注入是常见的攻击手段。通过系统API 将代码写入到目标进程并让其执行,攻击者可以将一段恶意代码写到目标进程,这段代码可以加载其它可执行程序,进而实施hook,监控程序运行、获取敏感信息等。常见的动态注入,可以实现窃取输入的登录账号、密码、支付密码,修改转账的目标账号、金额,窃取通讯数据等。 - 动态调试攻击风险
如果App 存在C 层代码动态调试的风险,攻击者可以利用GDB、IDA、Ptrace 等调试器跟踪运行的目标程序,查看、修改内存中的代码和数据,甚至分析篡改程序的业务逻辑,对客户关键数据或者服务器进行恶意攻击,例如修改客户端业务操作的数据,比如转账账号、金额等,导致用户的损失。 - 篡改和二次打包风险
APK 篡改后二次打包不仅已经严重危害开发者版权和经济利益,而且也使App 用户遭受到不法应用的恶意侵害。对客户端程序添加或修改代码,修改客户端资源图片,配置信息、图标,添加广告,推广自己的产品,再生成新的客户端程序,可导致大量盗版应用的出现分食开发者的收入;恶意的二次打包还能实现应用钓鱼、添加病毒代码、添加恶意代码,从而窃取登录账号密码、支付密码,拦截验证码短信,修改转账目标账号、金额等。 - App 内存数据 dump 风险
应用程序在运行时会产生一些敏感数据、比如解密后的资源文件、解密后的执行代码等,如果进程的内存数据未采取任何保护措施,攻击者可以使用dump 工具将程序内存dump 到文件中,或者修改内存数据来欺骗程序、伪装虚假数据欺骗服务端。
TIP:笔者对比了360公司的360加固保和腾讯云的应用加固的免费方案,发现360加固保功能更稳定,而且有电脑客户端可下载安装,方便进行多个渠道包同时加固以及签名。而腾讯云加固方案,对比起来就没那么易用了。
- App 注入风险
App 运营者未在个人信息处理规则(隐私政策)中提供或说明:个人信息存储期限。
App 在申请打开可收集个人信息的存储等系统权限时,仅依赖系统弹窗向用户索取权限而未向用户同步告知申请目的、方式和范围,无法保证用户的知情权。用户在使用更换头像业务功能时授权App 打开存储权限,但后续用户使用意见反馈图片上传业务功能时直接复用该权限,变更了使用目的,但未向用户同步告知并征得用户同意,不符合规范要求。
TIP: 若同一系统权限适用于多个场景(例如:发帖子的图片、更改头像、意见反馈上传图片等地方均需要打开系统读取存储权限),则需要在弹系统权限之前弹出APP内自己的弹框说明,用于告知用户当前权限会应用的当次及后续的全部场景和用途。用户了解全部的权限使用场景后,可自行选择是否同意授权。App 存在提供消息推送、悬浮窗等消息通知功能,但未向用户提供关闭消息通知功能的选项,不符合规范要求。
App 在用户拒绝同意隐私政策后,App 直接退出拒绝提供服务,不符合规范要求。
TIP: 如果不同意一隐私协议,比如APP可以以游客方式使用,可以再弹一个使用试用模式的弹框,告知用户在使用试用模式时功能的局限性,以及对于隐私敏感信息时如何处理的,如果用户不同意使用试用模式,则可以点拒绝按钮退出APP。App 在用户使用微信等第三方登录后,在未涉及信息发布、金融支付等业务功能场景下,仍强制要求用户绑定手机号码,违反必要性原则,不符合规范性要求。
如果隐私协议里有提收集用户相关信息,用于更个性化的用户体验和服务。则会认为存在定向推送功能,需要在应用内主功能界面以“推荐”、“为你推荐”、“个性化”、“标签化”、“猜你喜欢”等字样进行显著标识。如果应用内的确存在个性化推荐的功能,则需要在设置页面有拒绝、关闭定向推送或广告精准营销的选项,让用户可以自行控制。
未按法律规定提供删除或更正个人信息功能或未公布投诉、举报方式等信息。1、App 内未提供注销账号的功能,不符合相关规范要求。2、用户在申请注销用户账户时,强制要求用户填写联系QQ 账号,不符合规范要求
用户同意隐私协议弹框后,如果APP的隐私协议的内容有变动,用户后面打开APP时需要能看到最新隐私协议有变动的弹框提示,在APP内的系统通知里也同时告知一下会更好。尽量用户同意隐私协议的弹框的标识代码,不要在客户端写死,让服务器通过接口来动态控制。
-
在未同意隐私协议弹框之前,有调用以下代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { String processName = getProcessName(context); if (!getPackageName(context).equals(processName)) { WebView.setDataDirectorySuffix(processName); } }
TIP:这个代码会导致获取用户应用列表权限,需要将这个针对 WebView 的 Android版本适配代码,放在用户同意隐私协议弹框后面进行调用。
数据存储风险(私有文件泄露风险)
TIP:检查 APP 内自己的业务代码以及第三方SDK中是否有调用getSharedPreferences 参数设置不当,导致第三方程序可访问,存在信息泄露的问题。漏洞风险(WebView 组件远程代码执行漏洞)
TIP:在Android 版本<=4.1.2(API 16)的系统中中WebView 组件未对addJavaScriptInterface接口权限做出相应限制,导致攻击者可通过反射机制调用“java.lang.Runtime”来执行任意指令,从而导致用户的敏感信息泄露。比如应用内有限制最小 Android 系统版本5.0(API 21)才可使用,但是代码里也要做对应使用WebView 组件的addJavaScriptInterface接口的页面,去做Android系统版本判断,在Android 版本<=4.1.2(API 16)的系统中做相应限制(因为各大应用商店和各个省的管局对这个审核标准不一样)。漏洞风险(随机数破解漏洞风险)
TIP:Android 4.4 之前版本SecureRandom 实现中存在安全漏洞,这可使攻击者利用PRNG 预测性,利用此漏洞绕过密码保护机制。漏洞风险(checkServerTrusted 证书漏洞风险)
TIP:checkServerTrusted 覆盖实现后可能没有实现证书的判断逻辑,并作异常处理,将导致中间人攻击等严重安全隐患,攻击者可以轻易劫持HTTPS 会话,嗅探用户密码和其他敏感信息。漏洞风险(Intent 协议解析越权漏洞风险)
TIP:Receiver 权限未设置,恶意程序可以发送相应的action 广播危害应用安全。-
漏洞风险(WebView File同源策略绕过漏洞)
TIP:通过该漏洞,可在无特殊权限下盗取应用的任意私有文件,尤其是浏览器,可通过利用该漏洞,获取到浏览器所保存的密码、Cookie、收藏夹以及历史记录等敏感信息,从而造成敏感信息泄露。WebView跨域访问漏洞
如果file域访问为非功能需求,对 WebView 的设置,可以添加如下代码:
webSettings.setAllowFileAccess(false);
webSettings.setAllowFileAccessFromFileURLs(false); //Android4.1版本之前这个API默认是true
webSettings.setAllowUniversalAccessFromFileURLs(false); ///Android4.1版本之前这个API默认是true
若需要开启file域访问,则设置file路径的白名单,严格控制file域的访问范围,具体如下:
1)固定不变的HTML文件可以放在assets或res目录下,file:///android_asset和file:///android_res在不开启API的情况下也可以访问。
2)可能会更新的HTML文件放在/data/data/(app) 目录下,避免被第三方替换或修改。
3)对file域请求做白名单限制时,需要对"../../"特殊情况进行处理,避免白名单被绕过。有风险的WebView系统隐藏接口漏洞
根据CVE披露的WebView远程代码执行漏洞信息(CVE-2012-663、CVE-2014-7224),Android系统中存在一共三个有远程代码执行漏洞的隐藏接口。分别是位于android/webkit/webview中的"searchBoxJavaBridge"接口、android/webkit/AccessibilityInjector.java中的"accessibility"接口和"accessibilityTraversal"接口。调用此三个接口的APP在开启辅助功能选项中第三方服务的Android系统上将面临远程代码执行漏洞。
开发者自查,如果使用了WebView,那么使用WebView.removeJavascriptInterface(String name)API时,显示的移除searchBoxJavaBridge_、accessibility、accessibilityTraversal这三个接口。
WebView.removeJavascriptInterface("searchBoxJavaBridge_");
WebView.removeJavascriptInterface("accessibility");
WebView.removeJavascriptInterface("accessibilityTraversal");WebView File域同源策略绕过风险检测
应用程序一旦使用WebView,同时支持File域,并打开了对JavaScript的支持,就能利用JavaScript的延时执行,绕过File协议的同源检查,并能够访问应用程序的私有文件,导致敏感信息泄露。
1.对于不需要使用File协议的应用,禁用File协议,显式设置WebView.getSettings().setAllowFileAccess(false)
2.对于需要使用File协议的应用,禁止File协议调用JavaScript,显式设置WebView.getSettings().setJavaScriptEnabled(false) 漏洞风险(未移除有风险的WebView 隐藏系统接口漏洞)
TIP:攻击者可利用WebView 隐藏的系统接口实现远程代码执行
也可再看下笔者更早之前的一篇文章,这篇文章是对之前文章的一个内容补充:
Android APP 如何去符合工信部上架应用商店的要求
https://www.jianshu.com/p/bcf8c3d23e25