G.O.S.S.I.P 阅读推荐 2022-10-26 Dark Side

渗透技巧 2年前 (2022) admin
623 0 0

今天为大家介绍的论文名字听上去就很酷炫——The Dark Side of Native Code on Android,作者也许是《星球大战》的粉丝。

G.O.S.S.I.P 阅读推荐 2022-10-26 Dark Side

作为全球用户量最大的操作系统之一,Android一直以来都是安全人员与不法分子激烈交锋的前线。对于Android平台上的恶意软件分析,作者指出,以往的工作通常仅关注Java层的恶意行为,而很少有人关注使用JNI (Java Native Interface)与Java层进行通信的native层的恶意代码,也没有人系统地研究过Android平台上的恶意软件如何利用native层的功能来危害用户设备的安全。

因此,作者主要关注Android平台中利用native代码进行恶意操作的情况,为Android恶意软件分析以及native代码逆向工程提供了新的方法。在这篇文章中,作者做了以下贡献:

  • 提供了一种发现和分析Android app中可疑的native code的具体方法;

  • 开发了名为ANDani的静态分析工具,对native代码进行深入的行为分析;

  • 首次对Android平台的恶意软件进行纵向分析,尤其关注native代码,调查native代码的安全影响并了解其行为;

  • 在恶意软件和正常软件中发现了新颖的反分析技术;

  • 展示了ANDani工具添加的可疑标签的一个具体使用案例。

分析方法

作者首先定义了Android app中的可疑特征,即隐秘地使用native代码的Java代码(如经过混淆或存在反篡改逻辑)。作者认为这种特征虽然不能说明程序包含恶意操作,但这种方法可以帮助分析人员筛选出那些可疑的代码段来进行进一步的分析。当然,作者也总结了大量的经验特征:

G.O.S.S.I.P 阅读推荐 2022-10-26 Dark Side

如下图所示,作者将整个Android app以及JNI的加载和执行过程分为了7个主要步骤(其中步骤#6包含3个具体的步骤)。

G.O.S.S.I.P 阅读推荐 2022-10-26 Dark Side

  • #0:根据Manifest文件了解app中的组件(包括Activity, Service, Broadcast Receiver, Content Providers)及生命周期;

  • #1:Java代码通过load以及loadLibrary方法加载native库;

  • #2:JNI根据loadloadLibrary方法的参数加载正确的库文件;

  • #3:系统链接器执行库文件中的初始化函数(如.init_array),之后JNI自动执行库文件中的JNI_Onload函数;

  • #4:JNI_Onload函数通过RegisterNatives API动态地将某些JNI方法映射到对应的Java方法;

  • #5:Java代码调用native库文件中的函数;

  • #6A:native函数通过JNI提供的函数管理Java代码中的对象(如创建对象、执行方法以及修改成员变量);

  • #6B:在native库中通过dlopendlsym方法执行其它库文件中的函数;

  • #6C:在native函数中调用系统函数或读取系统敏感文件。

在#5中,Java代码可以调用的函数有两种:一种是#4中的API手动映射的函数;另一种是在native code中命名为Java_package_class_method,由JNI自动进行映射的函数。在下图的示例代码中,fun1方法对应Java_com_xmp_MainActivity_fun1函数的映射由JNI自动添加,而fun2方法对应sensitive函数的映射在JNI_Onload里手动注册。

G.O.S.S.I.P 阅读推荐 2022-10-26 Dark Side

分析框架

基于上述Android app以及JNI的加载和执行流程,作者开发了ANDani分析工具。该工具接收APK文件作为输入,递归提取其中所有的DEX、JAR以及ELF文件,并通过解析AndroidManifest.xml文件提取app的组件、权限、入口点等相关信息。然后,该工具为所有的Java和native代码创建程序间控制流图 (IPCFG, Inter-Procedural Control Flow Graph),分别使用基于Soot的Bytecode module和基于Ghidra的Native module对Java和native代码进行分析。

工具产生的IPCFG主要包含以下两种节点:

  1. code blocks:按照函数调用分割的传统的基本代码块;

  2. call blocks:表示函数调用或方法调用的调用块。

Bytecode module

该模块基于Soot进行开发,用于分析由Java代码产生的DEX和JAR文件,其分析主要包含以下四个步骤:

  1. 将字节码翻译成Soot使用的中间表示Jimple,并根据结果创建IPCFG;

  2. 根据IPCFG识别所有对load方法的调用,并通过污点分析来确定所加载的native库的文件名;

  3. 根据Manifest文件中的信息和提取出的Java方法确定app的入口点;

  4. 识别所有在Java代码中声明的native方法,并提取它们的签名。

Native module

该模块基于Ghidra API进行开发,用于分析APK中提取出的native库文件,其分析主要包含以下三个步骤:

  1. 提取ELF文件的基本信息以及JNI入口点(包括Java_JNI_开头的函数以及ELF初始化函数);

  2. 遍历所有入口点函数,根据Bytecode module收集的native方法签名确定各个函数的参数类型,对于那些手动注册映射的函数,该模块提取所有对RegisterNatives函数的调用,解析出其对应的Java方法并确定参数类型;

  3. 根据以上信息建立IPCFG,分析所有对JNI函数以及Android系统库函数的调用以及它们的参数。

可疑代码

完成以上分析后,该工具将各个文件的IPCFG合并成一个完整的控制流图,并找出所有符合之前定义的可疑特征的节点。工具会为这些可疑的节点添加可疑标签,标签内容包含它们的分类以及具体行为,在论文中作者用了一个大表来展示这些标签。

G.O.S.S.I.P 阅读推荐 2022-10-26 Dark Side

这些可疑标签主要有三个作用:

  1. 帮助分析人员判断程序的哪一部分需要特别关注;

  2. 为更耗时但更精确的自动分析工具提供分析范围;

  3. 协助恶意软件的自动识别工作。

实验及结果

作者从AndroZoo收集了97,829个包含native代码的恶意软件,从Google Play Store下载了27,665个非恶意软件并筛选出15,647个包含native代码的非恶意软件作为实验的数据集,并使用ANDani工具对这些软件进行分析。

之后作者使用工具的分析结果展示该分析的一个重要目的:使用可疑标签检测一个app是否为恶意软件。在这个分类测试中,作者使用了所有的15,647个非恶意软件以及相同数量的恶意软件作为测试集,使用工具提取出的可疑标签对app进行分类。结果表明,使用ANDani工具生成的可疑标签检测恶意软件的平均错误率为2.21%,F1-score为0.97。

具体的分类精确度数据如下图所示:

G.O.S.S.I.P 阅读推荐 2022-10-26 Dark Side

从以上结果可以看出,该分析工具的确对Android平台native层的恶意软件检测有很大帮助。


论文地址(欢迎访问IEEE自己的预印本网站TechrXiv):https://www.techrxiv.org/articles/preprint/The_Dark_Side_of_Native_Code_on_Android/21220247/1


原文始发于微信公众号(安全研究GoSSIP):G.O.S.S.I.P 阅读推荐 2022-10-26 Dark Side

版权声明:admin 发表于 2022年10月26日 下午8:39。
转载请注明:G.O.S.S.I.P 阅读推荐 2022-10-26 Dark Side | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...