APP如何做到隐私合规

897 阅读2分钟

合规检测

前言

最近公司的 APP 陆续收到各大应用商店的隐私合规报警;还有一些支付类的 APP 还需要每年送检,隐私合规检查极其严格;APP 大多使用 React Native 框架,所以本文大多数解决问题的技术路径都依赖此框架,大多 React Native 包也没有注意隐私合规问题;APP 没有统一架构,使用的 React Native 版本都不一样,使用的模块包也不尽相同,遇到这种问题还需要一个个解决,砖头都搬废了。

隐私合规检测评比

小米

小米在检测出有隐私合规问题后,为了开发者方便直接给了摘要日志,非常有针对性,是我最喜欢的;但是就是每次需要留言申请,需要等待一段时间;以下我摘要一段的内容:

检测到 10 次“未经许可读取个人信息”行为,其中获取MAC地址 4 次,获取ANDROID ID 2 次,获取应用列表 3 次,获取运营商 1 次。 违规行为:未经许可读取个人信息 | 获取MAC地址 发生时间:2022-09-14 01:48:29 违规md5:md5=2998EE5DA6297867FAD0E69B4EA48AE3, 违规包名:pkg=com.suixingpay.tssapp, 违规动作:action=android.permission.GET_MAC, 违规详情:content=wlan0:02:00:00:00:00:00,callstack:android.net.wifi.WifiInfo.getMacAddress:377;com.loc.o.k:69;com.loc.n.b:12;com.loc.n.b:1;com.loc.n.a:0;com.loc.ap.a:28;com.loc.bj.c:26;com.loc.bj.a:32;com.loc.bg.a:14;com.loc.bg.a:39;com.loc.bg.a:4;com.loc.t.b:18;com.loc.t.a:0;com.loc.t2.a:58;com.loc.ck.run:7;java.util.concurrent.Executors2.a:58;com.loc.ck.run:7;java.util.concurrent.ExecutorsRunnableAdapter.call:458;java.util.concurrent.FutureTask.run:266;java.util.concurrent.ThreadPoolExecutor.runWorker:1167;java.util.concurrent.ThreadPoolExecutor$Worker.run:641;java.lang.Thread.run:764;

这摘要服务也有时间限制的,一般收到通知后 5 天内整改好就不下架你的 APP;下架后的隐私检测服务就在一个专门的模块里面了,内置两个检测引擎;我觉得是两服务商的检测服务。

先说小米安全、百度史宾格联合评估;评估内容洋洋洒洒写了一大堆,其实就找“存在问题”的项目就行了,但是呢,没有给我们程序员的信息,所以不用看也行。

再说爱加密的检测引擎,它们给了一份评估报告,也不太适合程序员看,虽然有透露技术要点,但没实际具体问题路径;还有一份是日志 excel,也是一大堆内容,其实关键问题就在筛选出“个人信息相关”的调用堆栈,顺着堆栈信息就能找的出现问题代码片段。

腾讯应用宝

应用宝也是出具了两份,一份是 PDF 文件,内容也不是给程序员看的,关注里面“发现风险的项目”即可;一份是日志 Excel 文件,内容没怎么分类,一大堆东西罗列出来也不知道咋想的,但也是在筛选出“个人信息相关”的调用堆栈,顺着堆栈信息就能找的出现问题代码片段;如有雷同,纯属虚构。

爱加密(专项服务商)

爱加密的隐私合规检测服务还是挺多平台使用的,公司内部也有用;前面平台大多也是基于他的服务;所以有条件的最好使用来改隐私合规的问题。

需要改造的 React Native 模块

  • react-native-code-push;以下是该包调用隐私(获取ANDROID ID)的堆栈信息:

callstack:android.provider.SettingsSecure.getStringForUser:4987;android.provider.SettingsSecure.getStringForUser:4987;android.provider.SettingsSecure.getString:4934;com.microsoft.codepush.react.CodePushNativeModule.getConfiguration:292;java.lang.reflect.Method.invoke:-2;com.facebook.react.bridge.JavaMethodWrapper.invoke:372;com.facebook.react.bridge.JavaModuleWrapper.invoke:158;com.facebook.react.bridge.queue.NativeRunnable.run:-2;android.os.Handler.handleCallback:873;android.os.Handler.dispatchMessage:99;com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage:29;android.os.Looper.loop:193;com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run:232;java.lang.Thread.run:764;

  • react-native-device-info; 以下是该包调用隐私(获取MAC地址)的堆栈信息:

java.net.NetworkInterface.getHardwareAddress:574;com.learnium.RNDeviceInfo.RNDeviceModule.getMacAddress:197;java.lang.reflect.Method.invoke:-2;com.facebook.react.bridge.JavaMethodWrapper.invoke:372;com.facebook.react.bridge.JavaModuleWrapper.invoke:158;com.facebook.react.bridge.queue.NativeRunnable.run:-2;android.os.Handler.handleCallback:873;android.os.Handler.dispatchMessage:99;com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage:29;android.os.Looper.loop:193;com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run:232;java.lang.Thread.run:764;

  • react-native-amap(高德地图);以下是该包调用隐私(获取MAC地址)的堆栈信息:

android.net.wifi.WifiInfo.getMacAddress:377;com.loc.o.k:69;com.loc.n.b:12;com.loc.n.b:1;com.loc.n.a:0;com.loc.ap.a:28;com.loc.bj.c:26;com.loc.bj.a:32;com.loc.bg.a:14;com.loc.bg.a:39;com.loc.bg.a:4;com.loc.t.b:18;com.loc.t.a:0;com.loc.t2.a:58;com.loc.ck.run:7;java.util.concurrent.Executors2.a:58;com.loc.ck.run:7;java.util.concurrent.ExecutorsRunnableAdapter.call:458;java.util.concurrent.FutureTask.run:266;java.util.concurrent.ThreadPoolExecutor.runWorker:1167;java.util.concurrent.ThreadPoolExecutor$Worker.run:641;java.lang.Thread.run:764; 要注意高德的 jar 包名就是com.loc

  • jpush-react-native(极光推送);以下是该包调用隐私(获取MAC地址)的堆栈信息:

android.app.ApplicationPackageManager.getInstallerPackageName:2044;org.chromium.base.BuildInfo.:106;org.chromium.base.BuildInfo.:21;BB.:53;BB.a:53;org.chromium.base.BuildInfo.getAll:1083;org.chromium.content.browser.BrowserStartupControllerImpl.nativeSetCommandLineFlags:-2;org.chromium.content.browser.BrowserStartupControllerImpl.b:37;Gl.run:403;org.chromium.content.browser.BrowserStartupControllerImpl.a:1415;org.chromium.android_webview.AwBrowserProcess.a:131;xz.run:2;org.chromium.base.ThreadUtils.a:73;org.chromium.android_webview.AwBrowserProcess.b:111;my.b:166;mD.run:291;android.os.Handler.handleCallback:873;android.os.Handler.dispatchMessage:99;android.os.Looper.loop:193;android.app.ActivityThread.main:7168;java.lang.reflect.Method.invoke:-2;com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run:493;com.android.internal.os.ZygoteInit.main:858;

如果大家使用 React Native 开发的 APP 中遇到隐私合规问题,欢迎联系我

531665742580_.pic.jpg