前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >隐私合规代码排查思路

隐私合规代码排查思路

作者头像
codelang
发布2021-12-24 19:47:43
1.7K0
发布2021-12-24 19:47:43
举报
文章被收录于专栏:codelang

隐私合规整治不仅仅是排查一次就完,而是要做一个完整的体系来规范后面的编码,避免隐私代码调用又出现而触发合规问题。

一个体系的完善,总体流程为:

  • 发现问题
  • 更改问题
  • 规范问题

1、如何检查 “同意用户隐私” 之前的隐私代码调用?

通过 as 去手动 Find in Fies ?那你怎么知道这个代码是在什么时机调用的呢?所以,静态检查隐私代码调用是不合适的。有没有一种能在运行的时候知道是哪些类调用了隐私 API 呢?有,我们的基础团队写了一篇《Android APP运行时行为监控技术方案》的调研,采用 Frida 来 hook java 的代码,但 Frida 用起来真的太麻烦了,要搭建各种环境,搭建过程可以参考[APP逆向神器之Frida【Android初级篇】]https://zhuanlan.zhihu.com/p/73008784,就不能来点直接 hook 的吗?有,[epic]https://github.com/tiann/epic/blob/master/README_cn.md

❝Epic 是一个在虚拟机层面、以 Java Method 为粒度的 运行时 AOP Hook 框架。简单来说,Epic 就是 ART 上的 Dexposed(支持 Android 5.0 ~ 11)。它可以拦截本进程内部几乎任意的 Java 方法调用,可用于实现 AOP 编程、运行时插桩、性能分析、安全审计等。 ❞

使用起来也非常简单:提前设置需要 hook 哪个 java 方,比如,我要 hook TelephonyManager 的 getDeviceId 方法:

代码语言:javascript
复制
Class clazz=null;
try {
    clazz = Class.forName("android.telephony.TelephonyManager");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

DexposedBridge.findAndHookMethod(clazz, "getDeviceId", new XC_MethodHook() {
    @Override
        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
        super.beforeHookedMethod(param);
        Log.i(TAG, "beforeHookedMethod: this:" + param.thisObject, new RuntimeException("stack"));
    }

    @Override
        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
        super.afterHookedMethod(param);
        Log.i("Case3", "afterHookedMethod getDeviceId");
    }
});

在代码中如果有地方调用 TelephonyManager.getDeviceId 的,都会被 epic 的 beforeHookedMethod 给拦截到,我们只需要在 beforeHookedMethod 打印出堆栈即可看到是谁调用的,打印堆栈也很简单,我们就让他抛出一个异常即可看到,实验结果如图:

但有那么多隐私的 api 接口调用,如果未来又有新增的 api 变为隐私了,总不能每个都去写一遍 findAndHookMethod 吧,没问题,将隐私 Api 配置化即可。

在主工程的 assets 目录下放置一份 privacy.json 的配置文件,格式如下:

在初始化中我们去读取该配置转成 json 文件解析出 className 和 method 进行 hook,示例如下:

2、如何全局检查隐私调用的代码?

1、解压 apk 取出所有 dex,将 dex 反汇编成 smail 文件,根据规则扫描 smail 文件中的方法是否有调用隐私相关的 API,代表作有网易云的 Android 隐私合规静态检查

2、自定义 gradle transfrom 处理 class 文件和 jar 文件,然后通过 ASM 的 ClassVisitor 获取当前类下所有的方法,并检查该方法是否是有调用隐私相关的 API,visitMethod 可以查看[Mamba] https://github.com/MRwangqi/Mamba/blob/master/mamba-plugin/src/main/groovy/com/codelang/mamba/core/MambaClassVisitor.groovy

3、基于 lint 去做一套隐私合规检查,[Lint-隐私检测利器 ]https://juejin.cn/post/6955746471522238495 中的作者基于 ClassScanner 去做了一套 lint 检查,该方案的好处是可以配合 CI 构建去规范检查

3、如何更改隐私调用的代码?

手动改?很麻烦,模块太多,这个地方可以采用 ASM 方案,将调用隐私的代码全部收拢为自己写的类,可以看宝哥的[thread_hook_plugin]https://github.com/Leifzhang/AndroidAutoTrack/blob/master/Plugin/thread_hook_plugin/src/main/java/com/kronos/plugin/thread/visitor/privacy/PrivacyClassNode.kt 这个项目:

替换方法的方案有很多,如 booster 的 [booster-transform-thread]https://github.com/didi/booster/blob/master/booster-transform-thread/src/main/kotlin/com/didiglobal/booster/transform/thread/ThreadTransformer.kt

4、如何规范隐私调用

这个地方就需要大力发展我们的 lint 检查工具了,将隐私 api 这块能力再丰富一下,但我看现有的很多 lint 工具还是有弊端,每一项规范都需要去写 UastScanner 类,其实很多检查项他们都是相同的代码,只是检查的方法和类不同而已,这块完全可以做成 lint 配置化,读取配置文件来实现,圆圆大佬有出一款基于配置检查的 [AndroidLint]https://github.com/RocketZLY/AndroidLint 工具,我们可以只需要将隐私 api 配置到 custom_lint_config.json 文件中即可

参考文档:

  • [一步步治理隐私权限 | 安卓黑魔法]https://juejin.cn/post/6995015604839137316#heading-7
  • [我为Dexposed续一秒——论ART上运行时 Method AOP实现]https://weishu.me/2017/11/23/dexposed-on-art/
  • [Lint-隐私检测利器]https://juejin.cn/post/6955746471522238495
  • [深入探索编译插桩技术]https://blog.csdn.net/c6E5UlI1N/article/details/105423951
  • [ASM 系列文章]https://blog.51cto.com/lsieun/2924583
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 扣浪 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、如何检查 “同意用户隐私” 之前的隐私代码调用?
  • 2、如何全局检查隐私调用的代码?
  • 3、如何更改隐私调用的代码?
  • 4、如何规范隐私调用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档