一文总结 Android 隐私合规代码思路

简介: 一文总结 Android 隐私合规代码思路

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


通过 as 去手动 Find in Fies ?那你怎么知道这个代码是在什么时机调用的呢?所以,静态检查隐私代码调用是不合适的。有没有一种能在运行的时候知道是哪些类调用了隐私 API 呢?


有,我们的基础团队写了一篇《Android APP运行时行为监控技术方案》的调研,采用 Frida 来 hook java 的代码,但 Frida 用起来真的太麻烦了,要搭建各种环境,搭建过程可以参考[APP逆向神器之Frida【Android初级篇】],就不能来点直接 hook 的吗?有,[epic]。


https://zhuanlan.zhihu.com/p/73008784

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 方法:


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 打印出堆栈即可看到是谁调用的,打印堆栈也很简单,我们就让他抛出一个异常即可看到,实验结果如图:


f9573d11141388ec9c1ad91f77e4c8bd_68dfbb1393ce272c49edfcd08ffd4c6b.png


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


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


f2eb2ea96ad90f7ef021dda592a5d12c_6cab0412c44736f7b266dfed89f7cab8.png


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


4b4d15c335ed6261b5ca33a822dd9351_c6e9f31b67aa19dcbb4c0466c9f47dc6.png


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-隐私检测利器 ]中的作者基于 ClassScanner 去做了一套 lint 检查,该方案的好处是可以配合 CI 构建去规范检查。


https://juejin.cn/post/6955746471522238495


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


e29b490f768ceba9f692826296fd14f3_ba64e084fcb1cd62e37bdddfa427e334.png


替换方法的方案有很多,如 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]工具,我们可以只需要将隐私 api 配置到custom_lint_config.json 文件中即可。


https://github.com/RocketZLY/AndroidLint


参考文档:


一步步治理隐私权限 | 安卓黑魔法

我为Dexposed续一秒——论ART上运行时 Method AOP实现

Lint-隐私检测利器

深入探索编译插桩技术

ASM 系列文章


相关文章
|
14天前
|
JSON JavaScript 前端开发
Android调用Vue中的JavaScript代码
Android调用Vue中的JavaScript代码
14 3
|
1月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
很多文章都介绍了FTPClient如何连接ftp服务器,但却很少有人说如何连接一台开了SSL认证的ftp服务器,现在代码来了。
66 2
|
21天前
|
Java Android开发
Android项目架构设计问题之要提升代码的可读性和管理性如何解决
Android项目架构设计问题之要提升代码的可读性和管理性如何解决
23 0
|
2月前
|
存储 Java Android开发
🔥Android开发大神揭秘:从菜鸟到高手,你的代码为何总是慢人一步?💻
【7月更文挑战第28天】在Android开发中,每位开发者都追求极致的用户体验。然而,“代码执行慢”的问题时常困扰着开发者。通过案例分析,我们可探索从新手到高手的成长路径。
31 3
|
2月前
|
安全 数据安全/隐私保护 Android开发
探索Android 12中的隐私保护特性
随着数字化时代的到来,个人隐私保护成为全球关注的焦点。Android作为广泛使用的操作系统之一,其在最新发布的Android 12版本中引入了多项隐私保护功能。本文将深入探讨这些新特性如何增强用户数据的安全性,以及它们对应用开发者和普通用户的具体影响。
47 3
|
2月前
|
安全 Android开发 数据安全/隐私保护
探索Android 12的新特性:用户体验与隐私保护的革新
【7月更文挑战第7天】随着技术的不断进步,用户对手机操作系统的期望也日益增长。本文将深入分析Android 12带来的创新特性,特别是其如何通过重新设计的用户界面和增强的隐私功能提升整体体验,并探讨这些变化如何影响开发者和用户的互动模式。
|
2月前
|
API Android开发
Android 监听Notification 被清除实例代码
Android 监听Notification 被清除实例代码
|
2月前
|
安全 算法 数据安全/隐私保护
探索Android 12中的隐私保护新特性
【6月更文挑战第30天】随着数字时代的到来,个人数据安全和隐私保护日益成为用户关注的焦点。本文将深入探讨Android 12操作系统中引入的隐私保护功能,从全新的隐私仪表板到精细的应用权限管理,再到增强的系统安全性,我们将逐一分析这些新特性如何提升用户的隐私保护水平,并讨论它们对开发者和用户体验可能产生的影响。
|
2月前
|
存储 安全 Android开发
探索Android 12中的隐私特性及其对开发者的影响
【7月更文挑战第12天】随着数字隐私意识的增强,Android操作系统在新版本中引入了多项隐私保护功能。本文将深入分析Android 12中新增的隐私特性,探讨这些变化如何影响应用开发流程及用户体验,并指导开发者如何优化应用以适应新的隐私要求。
48 0
|
3月前
|
JavaScript 前端开发 Android开发
kotlin安卓在Jetpack Compose 框架下使用webview , 网页中的JavaScript代码如何与native交互
在Jetpack Compose中使用Kotlin创建Webview组件,设置JavaScript交互:`@Composable`函数`ComposableWebView`加载网页并启用JavaScript。通过`addJavascriptInterface`添加`WebAppInterface`类,允许JavaScript调用Android方法如播放音频。当页面加载完成时,执行`onWebViewReady`回调。