1.1 APP 违规收集使用个人信息现象频发
1.2 个人信息定义APP可直接访问信息
1.3 APP 隐私合规检测工具
2.1 Demo 演示
图1,隐私 Demo 项目演示
图2,Demo 个人信息收集记录
3.1 Privacy Sentry 技术思路
图3,Privacy Sentry 技术思路
所以这里面有个很重要的概念,就是 ASM 字节码修改。关于ASM 字节码修改,一起来看下一小节。
根据 ASM 官网的介绍,ASM 是一款通用的JAVA 平台字节码修改和分析框架。ASM 能够被用于直接在二进制层面修改现有的或生成新的class 文件。ASM还提供了一些常用的字节码转换和分析算法,可以用于构建自定义、复杂的转换和分析工具。当然,ASM 还有其高性能、使用简单等特点,使其非常适合在动态系统或动态分析中使用。ASM 由于上述的功能和特点,被众多开发者用于在 JAVA 应用程序中进行埋点、插桩和对控件的监控。
ASM 的核心包是 org.objectweb.asm,该包定义了ASM Visitor API,提供了ClassReader和ClassWriter类来读写编译后的Java class文件。ClassReader 用于访问class 文件的结构,ClassWriter可以用来生成新的 class 文件。
前文提到的 ASM 技术是用于字节码修改的框架,那么应该在何处以及何时进行字节码修改还是个问题,所以需要引入Transform。Gradle 1.5.0 以后开始提供 Transform API, Transform 是提供开发者在项目构建时期用来修改 class 文件的一套标准 API,用于将输入的 class文件转换为目标字节码文件。用户可以自定义 Tranform 来实现自己的字节码处理逻辑。
Transform 提供了获取所有class 文件集合的方法,所以可以在 Gradle编译过程中,引入 Transform, 让 Transform 接管从 class 文件生成到目标字节码的工作,接管以后,就能够获取到所有的 class 文件,而再通过 ASM 字节码修改,就能够完成 Hook 操作。
privacy-annotation 是对 java.lang.annotation 的一个封装。其存在的意思主要是为了给需要 Hook 的function 增加注解,对不同的属性构建了不同的注解类,对于需要注解的类命名为 PrivacyClassProxy,对于需要注解的method 命名为 PrivacyMethodProxy。
plugin-sentry 的工作主要使用 Gradle 编译时插件 Tranform 的运用,首先使用 Transform 接管 class 文件转目标字节码的工作,然后使用 ASM 的ClassReader 解析class 文件的结构,收集带有privacy-annotation注解的类和 method。再次使用Transform,运用 ClassReader 修改字节码。
privacy-proxy 主要工作是,定义 hook 规则以及设置代理方法。即需要 hook 的 method,只需要在在privacy-proxy 中增加,并且设定其代理方法即可。针对个人信息或设备信息的收集主要包括三大类,第一类是获取设备信息 API的拦截PrivacyProxyCall类,一般需要拦截的 API有:getRunningTasks(获取当前运行的任务)、getRecentTasks(获取最近运行的任务)、getInstalledPackages(获取设备已安全程序列表)、getPrimaryClip(获取剪贴板内容)、getSSID(获取 wifi名称)、getDeviceId(获取设备 id)、getImei(获取设备 IMEI )、getMacAddress(获取 MAC 地址)等等;第二类是获取用户个人信息,主要是针对联系人,通讯录,日历等等,该类为PrivacyProxyResolver类;第三类是获取设备传感器数据,名为PrivacySensorProxy类。
hook-sentry 是整个程序的业务层代码,主要包括日志管理、调用栈导出管理、各插件的联动管理、检测工具初始化等。
原文始发于微信公众号(山石网科安全技术研究院):PrivacySentry——隐私合规检测工具分析