SecuritySDK

Introduction: Android 安全 SDK,提供基础的安全防护能力,如安全 webview、IPC 安全通信、应用和插件安全更新、威胁情报搜集等等
More: Author   ReportBugs   
Tags:

SecuritySDK是为 Android APP 提供一系列安全防护功能,包括但不限于:基础加固对抗防护、典型漏洞防护方案和代码、威胁情报收集等功能。其中 securitysdkcore 是项目核心功能代码,app 只是 securitysdkcore 的测试 demo apk。项目成员:daizy(daizhongyin@126.com)、张林(97615274@qq.com)、唐海洋(ffthy@qq.com)。如有任何问题,欢迎随时联系我们。

典型漏洞防护方案和代码包括:安全 webview、应用 IPC 通信安全、应用和插件更新安全、插件调用安全、ZIPFile 读取压缩文件的安全性、Intent Uri Scheme 安全、插件 plugin 调用安全、Jar 签名效验验证。

基础加固对抗防护包括:反调试、模拟器检测、重打包检测、进程注入检测、HOOK 框架检测。

威胁情报收集包括:当前设备上安装的所有包名+签名、连接 WIFI、是否 root、HOOK 框架检测、设备位置信息、基站信息。

SecuritySDK 的配置文件设置与使用

由于漏洞防护中的很多能力依赖于运行时拦截,所以配置文件的更新和获取是 SecuritySDK 的使用前提,配置文件格式和内容,可以参考示例,配置文件由 server 端生成,SecuritySDK 获取到本地后,反序列化后使用。

1)配置文件 config.json(通过 preferences 方式存储),是基于 json 格式的内容,它提供了 4 类拦截规则:webview 的拦截规则、intent uri 拦截规则、应用插件调用的过滤拦截规则。

2)通过 SecuritySDKInit.syncConfig(url, params)方法进行配置文件的更新,新版本的更新取决于设置的 time_out 和 version,当更新间隔时间到了,就回去服务器请求新的版本号,如果版本号大于本地版本号,就会进行规则更新;

3)获得拦截规则:先通过 SecuritySDKInit.getConfigStringValueByKey(key)获得本地存储的配置文件 json 内容,然后自己通过 fastjson 讲字符串在转换成 SecuritySDKConfig 中的相关拦截规则对象。示例代码如下:

    String str = SecuritySDKInit.getConfigStringValueByKey(SecuritySDKInit.WEBVIEWCONFIG);
    WebviewConfig webviewConfig = JSON.parseObject(str, WebviewConfig.class);

典型漏洞防护方案、代码和使用说明

  • 安全 webview——代码

    安全 webview 是针对 webview 常见的远程命令执行漏洞,file 域攻击、高危接口对外和中间人劫持,这几个高危漏洞设计的安全 webview,可以有效的解决上述几个高危漏洞。同时参考了微信、支付宝和 github 上的开源代码(JSBridge),做到了有效性、兼容性和安全性并存。

  • 应用 IPC 通信安全——代码

    IPC 通信安全是针对应用进程间,进行数据通信时设计的方案。应用 A 和应用 B 进行数据通信时,业务方需要使用 Binder 异步接口进行,不要使用开放端口,然后再每个开放的 Binder 通信接口中,调用 BinderSecurityUtil. checkClientSig()进行调用方的签名认证,签名认证可以在本地,也可以在云端进行。

  • 应用和插件安全更新——代码

    应用和插件安全更新功能提供:应用和插件安全更新的能力,防止应用或插件更新升级时,被劫持或者下载的 apk/zip 被串改,从而导致任意代码执行的漏洞。

  • ZIPFile 读取 APK 文件安全——代码

    为了保证 ZIPFile 读取 APK 文件的安全性,确保 ZipFile 文件内不包含../,并且只有一个 Dex(避免恶意代码加载执行漏洞),此外还需要确保 APK 中的签名和业务方提供的签名信息一致,防止签名绕过漏洞。

  • Intent Uri Scheme 安全——代码

    Uri scheme 类似 bainuo://web?url=http://aaa.bbb.com/xxx,其中参数容易被攻击者篡改以达到某种目的,为此,安全 sdk 定义 IntentUriSchemeFilter 类来提供 Uri Scheme 安全拦截的功能,作为临时补丁和恶意行为的拦截,类似 web 安全中的 WAF。

  • 插件 plugin 调用安全——代码

    插件调用安全是通过增加拦截类,根据配置文件(config)中的拦截规则,对恶意插件调用进行拦截;拦截规则提供了插件包名拦截、插件方法名拦截、调用的类名、方法参数和 Intent 数据的拦截.

  • jar 签名效验——代码

    JarSignatureVerifier 类是为了保证 JAR 签名和内容一致性,防止攻击者合法签名文件,但是.class 文件和签名信息不一致,从而绕过签名校验,导致任意代码执行。

基础加固对抗防护

NativeCoreUtil

提供 debugPresent(检测应用是否处于调试中)、runInEmulator(检测应用是否处于模拟器)、rePackage(重打包检查)、detectInject(检测应用是否被 xposed,substrate 等框架注入)、isExisSUAndExecute(是否被 root)、getRemoteAppSign(获取远程应用的签名)6 个函数

AndroidSo 加解密

核心加解密过程如下:

    1、首先获取.so 在内存中加载的基址

    2、因为 android 系统对于.so 的加载是基于段的,dynamic 段中包含了多个节区,有 hash,dynstr(函数的名字在该节区中),符号表

    3、由于 hash 表和 dynstr 表  节区 的类型不唯一,有可能是别的,所以在 dynamic 段中寻找

    4、hash 表中存储了符号表中对应的索引,通过函数名进行哈希运算得到索引,然后去符号表中,符号表的结构是 1、dynstr 中的索引 2、地址 3、大小

    5、通过符号表中的第一个字节获取 dynstr 中对应的字符串 ,然后比对,比对成功则进行加密解密

使用过程

    (1)业务方将解密的核心代码加入到自己的 native 代码中,指定 SO_NAME(生成的 SO 名称),FUNC_NAME(加密函数名),RCE_KEY(加密密钥),RC4_KEY_LEN(加密密钥的长度),生成 so
    注:密钥分发和保存

    (2)将 so 进行加密,指定加密的函数名、加密的密钥(此时加密 SO 的 RC4 密钥需要与解密的密钥一致),加密的 so 文件路径(EncodeSo 类中 RC4_KEY,funcName,so_path)

    (3)业务方在 Build.gradle 中指定加载 so 的方式,如 Jnilibs、libs 等等,将加密后的 so 放到指定的路径下即可

    (4)在需要调用 jni 的地方, static {
        System.loadLibrary("加密后的 so 库名称");
    }

参考:

    http://blog.csdn.net/jiangwei0910410003/article/details/49966719

    http://bbs.pediy.com/thread-191649.htm

sdk 各文件及其相关 API 说明

1、Rc4Util.h Rc4Util.cpp(RC4 加密算法的实现文件)

注:
    因为涉及到修改内存操作,目前暂考虑同位加密,为此选取了 RC4 加密算法,RC4 加密算法原理这里暂不介绍,请自行 google。

2、 getSign.cpp getSign.h(获取签名)

 通过 NativeCoreUtil 类中的 getRemoteAppSign 函数进行调用。传入上下文和包名,返回远程调用的签名。本地签名哈希暂时写在 getSign.cpp 文件中。

3、插件调用拦截。使用 PluginInvokeValidate 类中的 validate 函数进行拦截,初始化安全策略文件写在键 intercept_plugin_invoke 中。

4、安全通信 调用接口为 CryptAndHttps 类中的 getHttpsUrlConnection 函数。使用前 必须先配置服务器证书,证书文件放在 Assets 目录。具体使用时见 MainActivity 中的 Https 登录按钮。

威胁情报收集

todo
Apps
About Me
GitHub: Trinea
Facebook: Dev Tools