CN111400757B - 防止安卓第三方库中native代码泄露用户隐私的方法 - Google Patents
防止安卓第三方库中native代码泄露用户隐私的方法 Download PDFInfo
- Publication number
- CN111400757B CN111400757B CN202010177063.XA CN202010177063A CN111400757B CN 111400757 B CN111400757 B CN 111400757B CN 202010177063 A CN202010177063 A CN 202010177063A CN 111400757 B CN111400757 B CN 111400757B
- Authority
- CN
- China
- Prior art keywords
- native
- class
- file
- party library
- calling
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/60—Protecting data
- G06F21/62—Protecting access to data via a platform, e.g. using keys or access control rules
- G06F21/6218—Protecting access to data via a platform, e.g. using keys or access control rules to a system of files or objects, e.g. local or distributed file system or database
- G06F21/6245—Protecting personal data, e.g. for financial or medical purposes
Landscapes
- Engineering & Computer Science (AREA)
- Health & Medical Sciences (AREA)
- Bioethics (AREA)
- General Health & Medical Sciences (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Databases & Information Systems (AREA)
- Computer Security & Cryptography (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Medical Informatics (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种防止安卓第三方库中native代码泄露用户隐私的方法,包括第三方库字节码的预处理和隔离环境的搭建部署。字节码预处理是为了对Java代码中包含的native方法入口进行修改,从而将native方法导向隔离进程之中执行并进行行为分析。隔离环境搭建则是建立远程isolatedProcess Service作为安全可信任的执行环境并部署隐私行为侦听模块对native代码在运行时的隐私调用等敏感行为进行监控,同时满足权限策略的隐私调用将会被还原同步到客户端,不满足权限要求的隐私调用行为将会停留在无权限的隔离环境之中被系统沙箱特性阻绝,可用于保护用户及宿主应用的隐私安全。
Description
技术领域
本发明属于计算机科学与技术领域,涉及恶意软件的防护,具体是一种防止安卓第三方库中native代码泄露用户隐私的方法,可用于保护安卓用户以及应用的隐私安全。
背景技术
借助于第三方库,安卓开发人员可以在短时间内快速构建安卓应用程序,节省大量时间专注于应用的主体功能,而无需重复编写相同功能的代码或者在某些通用功能上投入不必要的精力和时间。另一方面,开发人员还可以通过集成某些类型的第三方库,例如广告库来获取收入。
正是由于第三方库的便捷和高效,使得开发人员常常不会关注第三方库可能带来的安全问题。首先,第三方库通常以jar以及so文件格式提供给开发者,而不是源代码。开发人员无法直接得到第三方库的源代码,也就很难去检查其中是否存在某些恶意操作。其次,由于第三方库在使用时直接集成到宿主应用中,编译之后应用中集成的第三方库将与宿主应用程序合并,运行在同一进程之中,共享宿主应用的所有权限。而问题在于当前安卓系统的权限控制机制是以进程为单元实现的,它无法区分开宿主应用程序与其内部第三方库的权限请求,导致某些恶意的第三方库可以借用宿主应用的名义,肆无忌惮地滥用宿主权限,侵犯用户的隐私。尤其是在某些第三方库(例如游戏和视频)中,会通过Jni的方式使用native代码来提高数据操作的效率。与Java层代码类似,native代码同样享有宿主进程的所有权限。通过使用JNIEnv结构体对象,native代码可以像Java代码那样任意调用权限相关的API获取用户隐私。更糟糕的是,由于native代码可以直接访问宿主应用程序的内存,所以它甚至能够操纵宿主应用进程的所有数据。毫无疑问,相比于Java代码,第三方库中的native代码对用户隐私的威胁有过之而无不及。
发明内容
本发明针对安卓第三方库中native代码的安全问题,提出了一种基于进程隔离的防止安卓第三方库native代码泄露用户隐私的方法,可用于保护用户及宿主应用的隐私安全。
为达到上述目的,本发明采用如下技术方案:
防止安卓第三方库中native代码泄露用户隐私的方法,包括第三方库代码预处理和隔离环境搭建及部署;
所述第三方库代码预处理包括以下步骤:
(1.1)获取第三方库jar文件中所有class文件名;
(1.2)对第三方库class文件中的所有native方法进行代理修改;
(1.3)添加相关辅助类class文件;
(1.4)将(1.2)修改后的第三方库class文件和(1.3)中的所有辅助class文件存放在同一目录,形成修改后的整体class文件夹,利用JDK中的jar工具对修改后的整体class文件夹进行打包,生成全新的jar文件;
所述隔离环境搭建及部署包括以下步骤:
(2.1)在宿主应用AndroidManifest.xml文件中添加Service标签并对相关属性进行设置;
(2.2)在服务初始化过程中加载第三方库原native代码so文件以及行为监控模块;
(2.3)实现通信接口,在通信接口中进行参数传递并调用native方法;
(2.4)通过JNIEnv hook对native调用Java方法行为进行监控和同步;
(2.5)通过PLT hook对敏感动态链接函数进行监控和同步;
(2.6)对native方法执行过程中的敏感调用之外的行为进行同步。
进一步地,步骤(1.1)具体包括:
(1.1.1)导入jar文件,生成JarFile对象;
(1.1.2)取出JarFile对象中包含jar包中所有文件信息的枚举类型对象;
(1.1.3)遍历枚举对象中的所有文件信息,以文件类型过滤出所有属于第三方库的class文件;
(1.1.4)将所有class文件名存储到同一List对象中。
进一步地,步骤(1.2)具体包括:
(1.2.1)集成第三方的字节码修改工具jar文件;
(1.2.2)生成ClassPool对象并将第三方库的jar文件导入ClassPool中;
(1.2.3)按照(1.1)中获取的jar包中所有class名依次对class文件执行(1.2.3.1)-(1.2.3.5):
(1.2.3.1)以class名获取当前class对应的CtClass对象;
(1.2.3.2)获取包含当前class中的所有方法的数组对象;
(1.2.3.3)从方法数组中取出一个方法对象,获取该方法描述符;
(1.2.3.4)通过方法描述符判断当前方法是不是native方法,如果方法属于native方法则对该方法执行(1.2.3.4.1)-(1.2.3.4.3),否则跳过该过程,执行(1.2.3.3)直到遍历完当前class的所有方法;
(1.2.3.4.1)记录native方法的方法名、参数列表和返回类型信息;
(1.2.3.4.2)对native方法描述符进行修改,将该native方法修改为普通方法;
(1.2.3.4.3)将native方法的方法体替换为对应的代理方法;
(1.2.3.5)返回(1.2.3.1)重复操作,直到将第三方库中的所有class文件中的所有native方法进行了代理替换,获得修改后的第三方库class文件。
进一步地,步骤(1.3)具体包括:
(1.3.1)读取预先设置的权限策略文件并生成权限类;
(1.3.2)根据(1.2.3.4.1)获取的native方法信息生成代理方法类;
(1.3.3)根据(1.2.3.4.1)获取的native方法信息生成通信接口和响应接口;
(1.3.4)实现客户端监听器中的响应接口;
(1.3.5)生成客户端类,包括绑定服务、通信方法及注册监听器。
进一步地,步骤(2.3)具体包括:
(2.3.1)声明jni方法;
(2.3.2)在jni方法底层调用对应native函数;
(2.3.3)根据so文件名获取并打开so文件;
(2.3.4)根据so文件句柄和native方法名获取函数指针;
(2.3.5)获取函数参数并调用函数指针获取返回值。
进一步地,步骤(2.4)具体包括:
(2.4.1)设置JNIEnv所在内存页访问权限为读写状态;
(2.4.2)定义与JNIEnv中需要拦截的函数对应的代理函数;
(2.4.3)在代理函数中对关键参数进行解析,过滤出隐私调用行为并根据(1.3.1)中的权限类进行权限判断,对满足权限要求的调用,利用客户端监听器中的响应接口进行调用还原并获取返回值,对不满足权限要求的调用进行拒绝操作;
(2.4.4)将JNIEnv中的函数指针替换为对应代理函数。
进一步地,步骤(2.5)具体包括:
(2.5.1)在isolatedProcess Service初始化过程中加载PLT hook工具相关文件;
(2.5.2)定义所需拦截敏感动态链接函数的代理函数;
(2.5.3)在代理函数中根据(1.3.1)中的权限类进行权限判断,对满足权限要求的调用,利用客户端监听器中的响应接口中进行调用还原并获取返回值,对不满足权限要求的调用进行拒绝操作;
(2.5.4)注册代理函数并对原函数进行hook替换。
与现有技术相比,本发明具有以下有益的技术效果:
(1)本发明针对的是第三方库中的native代码,是对传统意义上的Java字节码扫描分析方法的补充。通过将native隔离到独立进程中,本发明不仅对第三方库中的native代码做到了权限隔离,更是给予了native代码全新的进程环境,防止native代码读取或篡改宿主应用的内存数据。结合本发明和传统的字节码修改技术,可以全面实现第三方库中所有类型代码的隐私调用或敏感行为的控制。
(2)本发明工作在应用层,不涉及对安卓系统底层的修改,也不需要系统的root权限,部署方便。开发者利用本发明可以自动化地完成对第三方库中native代码的隔离,阻断其隐私泄露等潜在威胁。而且,本发明不会对第三方库的原有功能造成影响,开发者可以透明地按照原有第三方库使用规范集成使用第三方库。
(3)对实际安卓第三方库和标准benchmark应用的测试分析表明,本发明能够有效且高效地完成对安卓第三方库中native代码隐私行为的控制。
附图说明
图1是本发明总体流程图。
图2是字节码预处理流程图。
图3是隔离环境搭建及部署流程图。
具体实施方式
下面对本发明作进一步详细说明:
参见图1至图3,防止安卓第三方库中native代码泄露用户隐私的方法,包括:
(1)第三方库代码预处理
(1.1)获取第三方库jar文件中所有class文件名:
(1.1.1)导入jar文件,生成JarFile对象;
(1.1.2)取出JarFile对象中包含jar包中所有文件信息的枚举类型对象;
(1.1.3)遍历枚举对象中的所有文件信息,以文件类型过滤出所有属于第三方库的class文件;
(1.1.4)将所有class文件名存储到同一List对象中。
(1.2)对第三方库class文件中的所有native方法进行代理修改:
(1.2.1)集成第三方的字节码修改工具jar文件;
(1.2.2)生成ClassPool对象并将第三方库的jar文件导入ClassPool中;
(1.2.3)按照(1.1)中获取的jar包中所有class名依次对class文件执行(1.2.3.1)-(1.2.3.5):
(1.2.3.1)以class名获取当前class对应的CtClass对象;
(1.2.3.2)获取包含当前class中的所有方法的数组对象;
(1.2.3.3)从方法数组中取出一个方法对象,获取该方法描述符;
(1.2.3.4)通过方法描述符判断当前方法是不是native方法,如果方法属于native方法则对该方法执行(1.2.3.4.1)-(1.2.3.4.3),否则跳过该过程,执行(1.2.3.3)直到遍历完当前class的所有方法;
(1.2.3.4.1)记录native方法的方法名、参数列表和返回类型信息;
(1.2.3.4.2)对native方法描述符进行修改,将该native方法修改为普通方法;
(1.2.3.4.3)将native方法的方法体替换为对应的代理方法;
(1.2.3.5)返回(1.2.3.1)重复操作,直到将第三方库中的所有class文件中的所有native方法进行了代理替换,获得修改后的第三方库class文件
(1.3)添加相关辅助类class文件:
(1.3.1)读取预先设置的权限策略文件并生成权限类;
(1.3.2)根据(1.2.3.4.1)获取的native方法信息生成代理方法类;
(1.3.3)根据(1.2.3.4.1)获取的native方法信息生成通信接口和响应接口;
(1.3.4)实现客户端监听器中的响应接口;
(1.3.5)生成客户端类,包括绑定服务、通信方法、注册监听器等。
(1.4)利用JDK中的jar工具对(1.2k)中所说的修改后的整体class文件夹进行打包,生成全新的jar文件。
(2)隔离环境搭建及部署
(2.1)在宿主应用AndroidManifest.xml文件中添加Service标签并对相关属性进行设置;
(2.2)在服务初始化过程中加载第三方库原native代码so文件以及行为监控模块;
(2.3)实现通信接口,在通信接口中进行参数传递并调用native方法:
(2.3.1)声明jni方法;
(2.3.2)在jni方法底层调用对应native函数;
(2.3.3)根据so文件名获取并打开so文件;
(2.3.4)根据so文件句柄和native方法名获取函数指针;
(2.3.5)获取函数参数并调用函数指针获取返回值。
(2.4)通过JNIEnv hook对native调用Java方法行为进行监控:
(2.4.1)设置JNIEnv所在内存页访问权限为读写状态;
(2.4.2)定义与JNIEnv中需要拦截的函数对应的代理函数;
(2.4.3)在代理函数中对关键参数进行解析,过滤出隐私调用行为并根据(1.3.1)中的权限类进行权限判断,对满足权限要求的调用利用客户端监听器中的响应接口进行调用还原并获取返回值,对不满足权限要求的调用进行拒绝操作;
(2.4.4)将JNIEnv中的函数指针替换为对应代理函数。
(2.5)通过PLT hook对敏感动态链接函数进行监控:
(2.5.1)在isolatedProcess Service初始化过程中加载PLT hook工具(xhook)相关文件;
(2.5.2)定义所需拦截敏感动态链接函数的代理函数;
(2.5.3)在代理函数中根据(1.3.1)中的权限类进行权限判断,对满足权限要求的调用利用客户端监听器中的响应接口中进行调用还原并获取返回值,对不满足权限要求的调用进行拒绝操作;
(2.5.4)注册代理函数并对原函数进行hook替换;
(2.6)利用客户端的响应接口,对native方法执行过程中的敏感调用之外的行为进行同步。
下面结合附图及具体实施例对本发明作进一步详细描述:
参照图1,本发明主要包含两个过程,即对第三方库字节码的预处理和隔离环境的搭建部署。字节码预处理是为了对Java代码中包含的native方法入口进行修改,从而将native方法导向隔离进程之中执行并进行行为分析。隔离环境搭建则是建立远程isolatedProcess Service作为安全可信任的执行环境并部署隐私行为侦听模块对native代码在运行时的隐私调用等敏感行为进行监控,同时满足权限策略的隐私调用将会被还原同步到客户端,不满足权限要求的隐私调用行为将会停留在无权限的隔离环境之中被系统沙箱特性阻绝。下面对这两个过程进行详细阐述。
一、第三方库字节码预处理
参照图2,预处理工作的详细实现步骤如下:
步骤1,获取第三方库jar文件中所有class文件名。
(1a)导入jar文件,生成JarFile对象;
(1b)调用JarFile对象中的entries()方法取出包含jar包中所有文件信息的枚举类型对象;
(1c)遍历枚举对象中的所有文件信息,以文件类型过滤出所有属于第三方库的class文件;
枚举对象中的元素类型为JarEntry,依次调用JarEntry对象的getName方法获取所有对象的名称,然后通过文件名结尾是否是.class来找出所有的class文件并对名称进行裁剪获得最终的类名。
(1d)将所有class类名以字符串的形式存储到同一List对象中,用于后续对class文件的快速检索。
步骤2,对第三方库class文件中的native方法进行代理修改。
(2a)集成第三方字节码修改工具(Javassist)jar文件;
本发明使用了第三方的字节码修改工具Javassist,该字节码修改工具提供了许多API用于对字节码的自定义修改,包括对类的成员字段、方法体以及方法调用等。
(2b)生成ClassPool对象并将第三方库的jar文件导入ClassPool之中;
ClassPool是Javassist提供的class容器,用于存储CtClass也就是class对象。通过调用getDefault方法可以获取到默认的ClassPool对象,然后通过调用insertClassPath方法就可以导入第三方库jar中的所有class文件。
(2c)按照步骤1中获取的jar包中所有class名依次对单个class文件进行以下修改操作:
(2c1)以class名获取对应的CtClass对象;
(2c2)调用CtClass对象的getDeclaredMethods方法获取包含当前class中的所有方法的数组对象;
(2c3)遍历方法数组依次通过对CtMethod对象调用getModifiers方法获取所有方法的描述符;
(2c4)通过方法描述符判断当前方法是不是native方法,如果方法属于native方法则对该方法进行如下进一步操作,否则直接跳过,检查下一个方法;
(2c5)记录native方法的方法名、参数列表和返回类型信息;
(2c6)对native方法描述符进行修改,将该native方法修改为普通方法。通过对CtMethod对象调用setModifiers方法去除native关键字从而将native方法修改为普通方法。
(2c7)将native方法体替换为对应的代理方法;
通过对CtMethod对象调用setBody方法来设置方法体,在其中调用预先准备好的代理方法,从而完成对native方法的替换。
(2c8)返回(2c1)重复操作,直到将第三方库中的所有class文件中的所有native方法都进行了代理替换。
(2d)将修改后的class文件和步骤3中的所有辅助类class存放在同一目录,用于步骤4中的重打包。
步骤3,添加相关辅助类class文件:
(3a)读取预先设置的权限策略文件并生成权限类;
权限文件是用户可以直接接触设置的用于隐私API管理的权限策略文件,可以采取键值对的形式进行存储。比如API方法getDeviceID和对应的权限允许或拒绝作为一条权限策略,然后依次存储其他权限API和对应的权限策略。权限类则是对权限内容的进一步解析处理,API方法将会作为权限类的静态字段,API对应的权限则是字段内容。之所以要在静态处理阶段对权限策略文件进行预加载是为了减少在动态判断权限时所产生的时间延迟以提高系统整体性能。
(3b)根据获取的native方法信息生成代理方法类;
代理方法类包含了与native方法一一对应的代理方法,用于native方法的替换。代理方法需要保持返回值以及参数列表和原native方法一致,这样才能保证对上层的透明性,不会影响修改后的方法调用。
(3c)根据获取的native方法信息生成通信接口和响应接口;
通信接口是用于客户端代理方法内部对隔离服务端中原始native方法的调用和返回。响应接口则是用于方法执行过程中服务端对客户端的权限调用请求以及同步信息的传递。
(3d)实现客户端监听器中的响应接口,用于对服务端的请求响应;
客户端监听器的功能是接受隔离服务中传回的同步信息,在客户端执行服务端中未能执行的权限操作或者其他涉及到进程状态改变的操作。本发明中所使用的客户端监听器为RemoteCallbackList(android.os.RemoteCallbackList),用于实现在客户端监听来自服务端的请求,在客户端完成服务端传回的同步操作。同步内容主要分为三部分,对Java层调用行为、动态链接调用行为以及其余涉及到进程状态的操作。
(3e)生成客户端类,包括绑定服务、通信方法、注册监听器等。
客户端类主要负责为代理方法提供通信方法,实现向隔离服务的进一步跳转。客户端类在构造时需要对隔离服务进行初始化,包括绑定服务和向隔离服务注册监听器。这样当代理方法跳转到客户端类中的通信方法时,对服务端通信接口的调用才会生效。
步骤4,利用JDK中的jar工具对修改后的整体class文件夹进行打包,生成全新的jar文件。
二、隔离环境搭建及部署
本发明对native代码的威胁设定是其可能在native层调用隐私相关API进行隐私窃取或者通过动态链接调用一些内存相关的操作对隐私数据进行窃取,因此将native方法隔离到一个无权限的独立进程环境中执行是一种完备且安全的操作。隔离的安全性由安卓系统中进程之间的沙箱特性保证,即使第三方库突破了本发明的行为监控,其始终无法突破进程之间的隔离特性以及权限限制。在隔离进程中,native代码默认不具备任何权限且拥有独立于宿主应用进程之外的全新内存环境。通过将native方法进行隔离执行以及对返回值和内部行为的同步,本发明就做到了在保留native方法原始功能的前提下对native方法内部可能存在的隐私泄露行为进行了控制。
参照图3,我们来详细介绍隔离服务搭建和部署的详细过程:
步骤1,在宿主应用AndroidManifest.xml清单文件中添加Service标签及相关属性设置;
Service是安卓系统提供的四大组件之一,我们可以通过在应用的清单文件AndroidManifest.xml中添加service标签并进行相关属性设置就可以向应用中添加服务组件。本发明中用到的隔离服务需要将服务的isolatedProcess属性设置为true。通过设置该属性为true,系统将会将此服务置于一个特殊的进程中运行。此服务进程将不具备任何权限,只拥有基础的运行条件。更加严格的是此特殊进程和系统的其余部分是完全隔绝的,只能通过预先设置的通信接口与其进行通信。
步骤2,在隔离服务初始化过程中加载第三方库原native代码so文件以及步骤4和步骤5中的行为监控模块;
步骤3,实现通信接口,在通信接口中进行参数传递并调用native方法。
在隔离native代码后,我们需要对native函数参数进行跨进程传递,以保证原函数的正常执行。本发明使用的通信方式为安卓系统自带的Binder通信方式,支持多种基本类型以及可序列化的类型的跨进程传输。但是Binder通信方式无法对没有实现序列化接口的参数对象进行传输,特别是当遇到非静态方法时需要传输this对象。为了解决这个问题,本发明采用了一种深层复制的方式来传输这些不可序列化的对象。该方法的原理是尽管对象本身不能直接进行传输,但是对象的字段很有可能是可序列化的对象,因此我们可以将无法序列化的对象的字段进行分解打包,然后将所有字段整体传输到隔离进程之中。然后在隔离进程端,原始对象就可以通过构造函数来重建并且通过反射的方式来填充构造对象的成员字段。通过这样的间接传输我们就把非可序列化的参数对象传输到了隔离进程之中。得到方法的所有参数后,我们就可以在隔离进程中执行原native方法对应的底层函数,具体过程如下:
(3a)在Java层声明jni接口方法;
(3b)在jni方法底层调用对应native函数;
jni接口方法的具体实现需要在底层用C/C++语言实现,具体如下:
(3c)根据so文件名获取并打开so文件;
根据上层提供的函数所在so文件名,第一步我们需要通过调用dlopen函数获取so文件的句柄。
(3d)根据so文件句柄和native方法名获取函数指针;
结合上一步所获得的的so文件句柄,通过函数名进一步调用dlsym函数可以获得so文件中的函数指针。
(3e)通过函数指针调用native函数并获取返回值。
步骤4,通过JNIEnv hook对native代码调用Java行为进行监控。
JNIEnv实际上是一个指向结构体JNInativeInterface的指针,该结构体包含许多可供native代码使用的函数指针,详细信息可以查阅jni.h头文件。比如通过CallObjectMethodV函数,native代码可以在底层调用Java方法。不仅如此,通过JNIEnv结构体native代码可以实现所有在Java代码操作,包括修改类字段,调用方法,构造对象等。显然,这些操作足够让第三方库在native层实现隐私窃取行为,因此需要对这类行为进行监控。相同进程中使用的JNIEnv环境是相同的,因此可以在so加载时对JNIEnv中的函数指针进行替换,这种技术就叫做JNIEnv hook,具体的流程如下:
(4a)设置JNIEnv所在内存页的访问权限为读写状态;
需要首先将JNIEnv所在内存设置为读写状态,否则后续在替换函数指针时会出现段错误。具体可以通过调用mprotect函数实现内存读写状态修改。
(4b)定义与JNIEnv中需要拦截的函数所对应的代理函数;
比如可以通过替换JNIEnv中的CallObjectMethodV函数来控制native代码对Java隐私API的调用。然后通过对函数参数中的jmethodid来判断其具体调用的方法执行(4c)中的权限判断。
(4c)在代理函数中对关键参数进行解析,并根据权限类中的权限进行权限判断。对满足权限要求的方法调用利用客户端监听器中的响应接口进行还原并获取返回值,对不满足权限要求的调用进行拒绝操作;
由于隔离进程与主进程并不拥有相同的内存和权限环境,因此部分操作无法在隔离进程中执行或者涉及到进程的状态改变,这些都需要以通信方式向主进程中的客户端响应器进行请求,完成权限调用或者状态同步。
(4d)将JNIEnv中的函数指针替换为对应代理函数;
通过赋值操作完成对函数指针的替换,替换前需要对原始函数指针进行备份,用于其他正常调用的执行。
步骤5,通过PLT hook对敏感动态链接函数调用行为进行监控。
native代码so文件属于ELF文件格式,是一种行业标准的二进制数据封装格式,主要用于封装可执行文件、动态库等文件。而PLT就是其中一个比较重要的section。PLT是外部调用的跳板,主要用于支持延迟绑定方式的外部调用的重定位。这种重定位跳转属于一种松耦合的结构,因此可以作为hook点。通过将PLT中的某个外部函数地址替换为自制代理函数,进一步地在代理函数内部进行权限判断可实现对敏感动态链接调用的监控,同时对其中可能改变进程状态的函数调用进行同步。具体流程如下:
(5a)在isolatedProcess Servic隔离服务初始化过程中加载PLT hook工具(xhook)相关文件;
(5b)定义与所需拦截敏感动态链接函数对应的代理函数;
与(4b)类似的是,需要提前准备好用于替换的代理函数。比如通过生成代理dlopen函数替换dlopen外部函数可以实现对动态加载so行为的监控,同时可以在代理函数内部对参数进行检查并核实权限策略。
(5c)在代理函数中对参数进行解析并根据权限类中的权限定义进行权限判断。对满足权限要求的调用进行还原并获取返回值,对不满足权限要求的调用进行拒绝操作;
(5d)注册代理函数并对原函数进行hook替换;
步骤6,利用客户端的响应接口对native方法执行过程中敏感调用之外的行为进行同步。真实的native函数中敏感行为之外还有许多涉及到进程状态改变的普通行为需要进行同步以维持原函数功能,因此需要视具体函数要求添加步骤4和步骤5中的拦截函数并利用响应接口同步到客户端。
本发明的效果可以通过以下实验进一步说明:
1)实验条件
本发明是基于安卓6.0原生系统设计使用Java 8以及NDK实现,包含字节码改写应用程序以及一个隔离安卓应用。物理测试条件为一个装有原生Android 6.0操作系统的LGNexus 5手机。
2)实验内容
依据AppBrain网站给出的第三方库统计信息,共收集了12个有效带有native代码的热门第三方库以及每个库10个宿主应用作为测试样本,从功能和性能两个角度对本发明进行测试评估。为保证测试样本的多样性,这12个库涵盖了广告、游戏、音视频以及图像处理等多个领域。
首先通过对这12个第三方库的60个native方法的隔离以及在隔离服务中的行为监控,明确本发明对隐私调用等敏感行为拦截的有效性,同时通过对比这60个native方法在隔离前后隔离后的时间差异来得出性能损失,每个方法将会被测试10次得出平均值。最后使用标准的benchmark应用来对本发明的性能进行了测试。第三方性能测试工具原本是用于测试手机硬件性能,其测试代码包含了native方法的使用,因此可以用于本发明的性能测试。在隔离native方法之后,本发明引入的额外时间损耗会影响到测试工具给出的性能得分,由而可以通过比较原始性能得分与隔离后的性能得分来进一步分析出本发明所引入的性能损耗。每个性能测试工具的得分也会被测试10次取平均值。
3)结果分析
从表1可以看出native隔离功能测试中所测试的12个库共60个native方法都被成功隔离。此外,本发明还在native代码执行过程中监控到了许多涉及隐私调用的行为包括调用Java方法或者修改Java类字段以及动态链接调用行为。因此实验成功证明了本发明能够有效地对native代码中的隐私调用行为进行控制。
表1第三方库native代码隔离有效性测试结果
为了进一步测试本发明的性能,这12个带有native代码的真实第三方库的共60个native方法以及三个标准的benchmark应用还进行了性能测试来评估本发明对native方法隔离的性能开销。以ZBar库为例,从表2中可以看出native代码的进程隔离所产生的额外时间开销约等于native方法的原始执行时间。系统性能开销的主要原因在于宿主应用程序和隔离进程之间的通信,因此性能开销会随native方法的复杂性而变化。在某些复杂情况下,此开销可能会增加较多。例如,表中的setData方法使用到了数组参数,在同一进程中数组参数可以通过指针直接访问因此时间消耗很小。但是,在隔离之后数组参数需要在进程之间传输,从而导致了该方法在隔离之后产生大量开销。但在普遍情况下,native代码隔离的时间开销仍然维持在1ms左右。从表3中关于标准性能测试工具的性能测试可以看出从应用的整体性能来看本发明所带来的性能损失维持在5%以内,性能影响较小。
表2真实第三方库native方法隔离性能测试结果
表3标准benchmark性能测试工具测试结果
Claims (5)
1.防止安卓第三方库中native代码泄露用户隐私的方法,其特征在于,包括第三方库代码预处理和隔离环境搭建及部署;
所述第三方库代码预处理包括以下步骤:
(1.1)获取第三方库jar文件中所有class文件名;
步骤(1.1)具体包括:
(1.1.1)导入jar文件,生成JarFile对象;
(1.1.2)取出JarFile对象中包含jar包中所有文件信息的枚举类型对象;
(1.1.3)遍历枚举对象中的所有文件信息,以文件类型过滤出所有属于第三方库的class文件;
(1.1.4)将所有class文件名存储到同一List对象中;
(1.2)对第三方库class文件中的所有native方法进行代理修改;
步骤(1.2)具体包括:
(1.2.1)集成第三方的字节码修改工具jar文件;
(1.2.2)生成ClassPool对象并将第三方库的jar文件导入ClassPool中;
(1.2.3)按照(1.1)中获取的jar包中所有class名依次对class文件执行(1.2.3.1)-(1.2.3.5):
(1.2.3.1)以class名获取当前class对应的CtClass对象;
(1.2.3.2)获取包含当前class中的所有方法的数组对象;
(1.2.3.3)从方法数组中取出一个方法对象,获取该方法描述符;
(1.2.3.4)通过方法描述符判断当前方法是不是native方法,如果方法属于native方法则对该方法执行(1.2.3.4.1)-(1.2.3.4.3),否则跳过该过程,执行(1.2.3.3)直到遍历完当前class的所有方法;
(1.2.3.4.1)记录native方法的方法名、参数列表和返回类型信息;
(1.2.3.4.2)对native方法描述符进行修改,将该native方法修改为普通方法;
(1.2.3.4.3)将native方法的方法体替换为对应的代理方法;
(1.2.3.5)返回(1.2.3.1)重复操作,直到将第三方库中的所有class文件中的所有native方法进行了代理替换,获得修改后的第三方库class文件;
(1.3)添加相关辅助类class文件;
(1.4)将(1.2)修改后的第三方库class文件和(1.3)中的所有辅助class文件存放在同一目录,形成修改后的整体class文件夹,利用JDK中的jar工具对修改后的整体class文件夹进行打包,生成全新的jar文件;
所述隔离环境搭建及部署包括以下步骤:
(2.1)在宿主应用AndroidManifest.xml文件中添加Service标签并对相关属性进行设置;
(2.2)在服务初始化过程中加载第三方库原native代码so文件以及行为监控模块;
(2.3)实现通信接口,在通信接口中进行参数传递并调用native方法;
(2.4)通过JNIEnv hook对native调用Java方法行为进行监控和同步;
(2.5)通过PLT hook对敏感动态链接函数进行监控和同步;
(2.6)对native方法执行过程中的敏感调用之外的行为进行同步。
2.根据权利要求1所述的防止安卓第三方库中native代码泄露用户隐私的方法,其特征在于,步骤(1.3)具体包括:
(1.3.1)读取预先设置的权限策略文件并生成权限类;
(1.3.2)根据(1.2.3.4.1)获取的native方法信息生成代理方法类;
(1.3.3)根据(1.2.3.4.1)获取的native方法信息生成通信接口和响应接口;
(1.3.4)实现客户端监听器中的响应接口;
(1.3.5)生成客户端类,包括绑定服务、通信方法及注册监听器。
3.根据权利要求2所述的防止安卓第三方库中native代码泄露用户隐私的方法,其特征在于,步骤(2.3)具体包括:
(2.3.1)声明jni方法;
(2.3.2)在jni方法底层调用对应native函数;
(2.3.3)根据so文件名获取并打开so文件;
(2.3.4)根据so文件句柄和native方法名获取函数指针;
(2.3.5)获取函数参数并调用函数指针获取返回值。
4.根据权利要求3所述的防止安卓第三方库中native代码泄露用户隐私的方法,其特征在于,步骤(2.4)具体包括:
(2.4.1)设置JNIEnv所在内存页访问权限为读写状态;
(2.4.2)定义与JNIEnv中需要拦截的函数对应的代理函数;
(2.4.3)在代理函数中对关键参数进行解析,过滤出隐私调用行为并根据(1.3.1)中的权限类进行权限判断,对满足权限要求的调用,利用客户端监听器中的响应接口进行调用还原并获取返回值,对不满足权限要求的调用进行拒绝操作;
(2.4.4)将JNIEnv中的函数指针替换为对应代理函数。
5.根据权利要求3所述的防止安卓第三方库中native代码泄露用户隐私的方法,其特征在于,步骤(2.5)具体包括:
(2.5.1)在isolatedProcess Service初始化过程中加载PLT hook工具相关文件;
(2.5.2)定义所需拦截敏感动态链接函数的代理函数;
(2.5.3)在代理函数中根据(1.3.1)中的权限类进行权限判断,对满足权限要求的调用,利用客户端监听器中的响应接口中进行调用还原并获取返回值,对不满足权限要求的调用进行拒绝操作;
(2.5.4)注册代理函数并对原函数进行hook替换。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010177063.XA CN111400757B (zh) | 2020-03-13 | 2020-03-13 | 防止安卓第三方库中native代码泄露用户隐私的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010177063.XA CN111400757B (zh) | 2020-03-13 | 2020-03-13 | 防止安卓第三方库中native代码泄露用户隐私的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111400757A CN111400757A (zh) | 2020-07-10 |
CN111400757B true CN111400757B (zh) | 2022-09-27 |
Family
ID=71434763
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010177063.XA Active CN111400757B (zh) | 2020-03-13 | 2020-03-13 | 防止安卓第三方库中native代码泄露用户隐私的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111400757B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111930708B (zh) * | 2020-07-14 | 2023-07-11 | 上海德拓信息技术股份有限公司 | 基于Ceph对象存储的对象标签的扩展系统及方法 |
CN111966427B (zh) * | 2020-08-17 | 2022-06-21 | 四川长虹电器股份有限公司 | 一种Android native调用Java API的实现方法 |
CN112199151B (zh) * | 2020-09-07 | 2023-10-24 | 成都安易迅科技有限公司 | 一种应用程序的运行方法及装置 |
CN113485903A (zh) * | 2021-07-09 | 2021-10-08 | 郑州阿帕斯数云信息科技有限公司 | 一种基于hook的参数统计方法和装置 |
CN113641939B (zh) * | 2021-08-19 | 2024-04-12 | 阿里巴巴(中国)有限公司 | 数据安全处理方法、浏览器系统、电子设备及存储介质 |
CN114780952B (zh) * | 2022-03-09 | 2024-08-20 | 浙江吉利控股集团有限公司 | 敏感应用调用场景的检测方法、系统及存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103544447A (zh) * | 2013-05-30 | 2014-01-29 | Tcl集团股份有限公司 | 一种基于安卓系统的防止机密信息泄露的方法和终端 |
US8856869B1 (en) * | 2009-06-22 | 2014-10-07 | NexWavSec Software Inc. | Enforcement of same origin policy for sensitive data |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10776520B2 (en) * | 2015-09-14 | 2020-09-15 | Northwestern University | System and method for proxy-based data access mechanism in enterprise mobility management |
CN106446672B (zh) * | 2016-07-25 | 2020-10-16 | 中国科学院大学 | 一种Android第三方类库权限隔离方法及装置 |
CN108763924B (zh) * | 2018-04-26 | 2022-04-22 | 南京大学 | 一种安卓应用程序中不可信第三方库访问权限控制方法 |
CN108932427A (zh) * | 2018-05-18 | 2018-12-04 | 华中科技大学 | 一种Android应用多开环境中限制访问的控制方法及系统 |
CN109344616B (zh) * | 2018-09-13 | 2020-12-08 | 西安交通大学 | 一种移动应用程序动态加载行为监控方法及装置 |
CN109255235B (zh) * | 2018-09-17 | 2021-08-24 | 西安电子科技大学 | 基于用户态沙箱的移动应用第三方库隔离方法 |
-
2020
- 2020-03-13 CN CN202010177063.XA patent/CN111400757B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8856869B1 (en) * | 2009-06-22 | 2014-10-07 | NexWavSec Software Inc. | Enforcement of same origin policy for sensitive data |
CN103544447A (zh) * | 2013-05-30 | 2014-01-29 | Tcl集团股份有限公司 | 一种基于安卓系统的防止机密信息泄露的方法和终端 |
Non-Patent Citations (3)
Title |
---|
Android应用程序第三方库的恶意行为隔离技术综述;湛家伟等;《计算机应用与软件》;20171015(第10期);310-315+321 * |
IccTA: Detecting Inter-Component Privacy Leaks in Android Apps;Li Li et al.;《2015 IEEE/ACM 37th IEEE International Conference on Software Engineering》;20150817;全文 * |
NaClDroid:Native Code Isolation for Android Applications;Elias Athanasopoulos et al.;《European symposium on Research in Computer Security》;20160915;第9878卷;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN111400757A (zh) | 2020-07-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111400757B (zh) | 防止安卓第三方库中native代码泄露用户隐私的方法 | |
Seo et al. | FLEXDROID: Enforcing In-App Privilege Separation in Android. | |
US11550912B2 (en) | Detection of exploitative program code | |
Guo et al. | A study of the packer problem and its solutions | |
CN109255235B (zh) | 基于用户态沙箱的移动应用第三方库隔离方法 | |
CN105574411B (zh) | 一种动态脱壳方法、装置和设备 | |
US20080216071A1 (en) | Software Protection | |
US20070271446A1 (en) | Application Execution Device and Application Execution Device Application Execution Method | |
US20050268290A1 (en) | Method and system for metering execution of interpreted programs | |
WO2015178896A1 (en) | Point-wise protection of application using runtime agent and dynamic security analysis | |
CN109784039B (zh) | 移动终端安全运行空间的构建方法、电子设备、存储介质 | |
Ahmad et al. | StaDART: addressing the problem of dynamic code updates in the security analysis of android applications | |
US11947666B2 (en) | Systems and methods for exploit prevention and malicious code neutralization using non-predictable results for JavaScript-enabled applications | |
CN108763924B (zh) | 一种安卓应用程序中不可信第三方库访问权限控制方法 | |
CN110597496B (zh) | 应用程序的字节码文件获取方法及装置 | |
KR101557455B1 (ko) | 응용 프로그램 코드 분석 장치 및 그것을 이용한 코드 분석 방법 | |
Qiu et al. | Libcapsule: Complete confinement of third-party libraries in android applications | |
Dong et al. | What did you pack in my app? a systematic analysis of commercial android packers | |
Ruan et al. | Analyzing android application in real-time at kernel level | |
Bogad et al. | Harzer roller: Linker-based instrumentation for enhanced embedded security testing | |
US20220308991A1 (en) | Test processing method and information processing apparatus | |
Li et al. | Towards a generic framework for automating extensive analysis of android applications | |
US11899782B1 (en) | Preserving DLL hooks | |
Tchana et al. | Odile: A scalable tracing tool for non-rooted and on-device Android phones | |
Cai et al. | Enforcing ACL access control on android platform |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |