Android-隐私合规检测SDK-二期

3,580 阅读2分钟

背景

从去年开始,工信部对APP个人隐私要求越来越多,之后各大应用市场也开始要求,有违规情况的会导致APP下架或者无法上架。

三期已更新,请移步 传送门

 - 三期采用编译期注解+hook方案
 - 支持业务方自定义配置拦截,支持游客模式
 

更新日志

2022-1-18
    1. 编译期注解+hook方案
    2. 支持业务方自定义配置拦截,支持游客模式

2021-12-26
    1. Transform+Asm修改字节码,hook敏感函数
    
2021-12-02
    1. 支持多进程
    2. 日志加上时间戳,方便阅读
    3. 优化文件分时段写入
    4. pms增加部分hook方法

技术方案简介

一期是动态代理+反射hook系统服务,二期是Transform+Asm,拦截方法调用堆栈产出Excel结果. 按需自取

项目地址

支持的hook函数列表

e8724899619d00e56fb57e7f53de3b3a.png 传送门

接入方式

    1. 在根目录的build.gralde下添加
	allprojects {
		repositories {
			...
			maven { url 'https://jitpack.io' }
		}
	}
	
	buildscript {
	     dependencies {
	         // 添加插件依赖
	         classpath 'com.github.allenymt.PrivacySentry:plugin-sentry:1.0.0'
	     }
	}
    2. 在项目中的build.gralde下添加
        // 在主项目里添加插件依赖
        apply plugin: 'privacy-sentry-plugin'
        
        dependencies {
            // aar依赖
            def privacyVersion = "1.0.0"
            implementation "com.github.allenymt.PrivacySentry:hook-sentry:$privacyVersion"
            implementation "com.github.allenymt.PrivacySentry:base:$privacyVersion"
            implementation "com.github.allenymt.PrivacySentry:plugin-proxy:$privacyVersion"
        }
        
        // 黑名单配置,可以设置这部分包名不会被修改字节码
        privacy {
            blackList = []
        }

    初始化方法最好在attachBaseContext中第一个调用!!!
    3. 简易版初始化
    在代码中调用,越早越好,建议在application中调用
    // runtime-hook初始化
    kotlin:PrivacySentry.Privacy.init(this)
    java:PrivacySentry.Privacy.INSTANCE.init(this);
    
    // transform初始化,需要搭配privacy-sentry-plugin使用
    kotlin:PrivacySentry.Privacy.initTransform(this)
    java:PrivacySentry.Privacy.INSTANCE.initTransform(this);
    4. 完成功能的初始化
     // 完整版配置
        var builder = PrivacySentryBuilder()
            // 自定义文件结果的输出名
            .configResultFileName("demo_test")
            .configPrivacyType(PrivacySentryBuilder.PrivacyType.TRANSFORM)
            // TRANSFORM or RUNTIME
            //.configPrivacyType(PrivacySentryBuilder.PrivacyType.RUNTIME)
            //自定义检测时间,也支持主动停止检测 PrivacySentry.Privacy.stopWatch()
            .configWatchTime(5 * 60 * 1000)
            // 文件输出后的回调
            .configResultCallBack(object : PrivacyResultCallBack {
                override fun onResultCallBack(filePath: String) {
                    PrivacyLog.i("result file patch is $filePath")
                }
            })
        PrivacySentry.Privacy.init(this, PrivacySentry.Privacy.defaultConfigHookBuilder(builder))
        
        
        java
         // 完整版配置
        PrivacySentryBuilder builder = new PrivacySentryBuilder()
                // 自定义文件结果的输出名
                .configResultFileName("buyer_privacy")
                 .configPrivacyType(PrivacySentryBuilder.PrivacyType.TRANSFORM)
                // TRANSFORM or RUNTIME
                //.configPrivacyType(PrivacySentryBuilder.PrivacyType.RUNTIME)
                //自定义检测时间,也支持主动停止检测 PrivacySentry.Privacy.stopWatch()
                .configWatchTime(30 * 1000)
                // 文件输出后的回调
                .configResultCallBack(new PrivacyResultCallBack() {

                    @Override
                    public void onResultCallBack(@NonNull String s) {

                    }
                });
        PrivacySentry.Privacy.INSTANCE.init(this, PrivacySentry.Privacy.INSTANCE.defaultConfigHookBuilder(builder));
    5. 在隐私协议确认的时候调用,这一步非常重要!,一定要加
    kotlin:PrivacySentry.Privacy.updatePrivacyShow()
    java:PrivacySentry.Privacy.INSTANCE.updatePrivacyShow();
    6.支持多进程,多进程产出的文件名前缀默认增加进程名
传送门

结果查看

1. 默认拦截隐私方法时间为3分钟,支持自定义设置时间排查结果可参考目录下的demo_result.xls
2. 排查结果支持两个维度查看,第一是结合隐私协议的展示时机和敏感方法的调用时机,第二是统计所有敏感函数的调用次数
3. 排查结果可观察日志,结果文件会在 /storage/emulated/0/Android/data/yourPackgeName/files/privacy/yourFileName.xls,需要手动执行下adb pull
传送门

隐私函数调用结果截图更新,隐私确认和隐私函数调用顺序一目了然

结果.png

结语

在引入SDK时,注意不要把代码带到线上
本SDK检测结果只做参考~