Page 319 - 《软件学报》2024年第6期
P. 319
徐建 等: LibPass: 基于包结构和签名的第三方库检测方法 2895
通过上述 3 种不同策略构建的基准数据集对于第三方库检测能力评价提供了不同的支撑, 差异之处可以概括
如表 4 所示.
表 4 不同基准数据集在第三方检测能力评价上的差异
检测能力
基准数据集 规模 抗混淆能力 检测效率 主模块分析
precision recall
GTB-1 10 000 APKs √ √ × × ×
GTB-2 1 000 APKs × √ × √ √
GTB-3 [200, 282] APKs √ √ √ × ×
3.2 TPL 本地库
TPL 本地库的完整性也是影响基于相似性比较的 TPL 检测方法准确性和效率的一个重要因素. 然而,
Android 社区并没有统一的 TPL 发布平台和规范. 开发者使用的 TPL 主要来源于 GitHub 或者 Maven 等代码托管
仓库, 因此存在版本不完整、新 TPL 或新版本上线后不能及时更新等问题, 进而导致 TPL 检测方法精度下降, 检
测过程中因发起实时 TPL 搜索、获取和分析而导致检测时间成本显著增加. 为了有效应对上述问题, 本文采用面
向代码仓库搜索和 APK 反向分离相结合的方法构建较大规模的 TPL 库, 并借助于 LibPass 中的主模块识别、组
件签名等完成对 TPL 的预处理, 以提升检测精度和效率.
首先, 面向 Maven 自动搜索 TPL. Maven 代码托管仓库中不仅存有面向 Android 平台的大量第三方库, 而且
还有大量面向其他平台或开发语言的 TPL. 因此, 在自动获取面向 Android 平台的 TPL 之前, 首先需要预先给出一
个待收集的 TPL 清单, 以过滤掉其他不相关的 TPL. 为了定制 TPL 清单, 分析了 Android 应用开源社区“F-Droid”中
所有的项目, 提取每一个项目的 gradle 文件中所包含的 TPL 清单加以合并去重, 并且采用三元组 GAV=<Groupname,
Artifactld, Versionpairs>唯一地标识每一个 TPL. 一旦确定了待收集的 TPL 清单, 即可利用爬虫程序根据清单中的
每一个 GAV 爬取相关的第三方库 jar/aar 文件. 值得注意的是, APK 以汇编索引代码 (二进制形式代码) 形式存在,
因此需要借助于转换工具, 如 dextojar 工具等, 将下载的 TPL TPL
文件后存入
jar/aar 文件中所有的类打包编译为
dex
本地库.
其次, 通过 APK 反向分离发现 TPL. 尽管原型库构建可以通过 Maven/Gradle 从网上爬取 TPL 原型, 但是
Maven 上并不能收集到所有的 TPL, 包括一些过期的 TPL 版本. 而每个 Android 应用中都有多个 TPL, 因此, 可以
通过分析大量 Android 应用从中抽取其 TPL 原型使原型库更完备. smali 提供反汇编功能的同时, 也提供了打包反
汇编代码重新生成 dex 的功能. 基于这一特点, 在抽取 TPL 的过程中, 先将大量 APK 文件反编译成 smali 分析, 随
后对其进行模块解析操作, 将 APK 拆分成多个模块, 再把每个非混淆模块重打包生成 DEX 文件存入 TPL 原型库
中, 可得到大量的 TPL 原型, Maven 存储库中缺少的 TPL 原型都可以从 APK 中找到. 本文分析了 10 000 个从
Google play 中下载下来的 Android 应用, 把其中所有未被混淆过的、且本地原型库中缺少的 TPL 其 smali 文件提
取出来打包成 DEX 文件, 存入本地原型库中.
综上两种 TPL 抽取方式创建了包含 140 000 个 的本地库, 其中包括从 maven 中爬取的 12 648 个 TPL,
以及从 10 000 个 APK 中分离出的 127 352 个 TPL.
3.3 实验设置
为了验证提出的第三方库检测方法的性能和效率, 并且与其他领域知名的检测方法进行对比分析, 开展了一
组实验并进行深入分析. 实验采用的服务器配置为 Windows 10 专业版 64 位操作系统, Intel(R) Xeon(R) CPU E5-
2678 v3 处理器, 主频 @ 2.50 GHz , 内存 64 GB. 在实验中采用了前文构建的 3 种不同能力的基准数据集作为实验
[9]
对象, 选取了本领域先进的、公开源码的方法, 如 LibScout [14] 、LibRadar 、LibD [10] 、LibPecker [15] 、LibID-S [16] 和
LibID-A [16] 作为对比方法. LibPass 主模块识别模块中使用的依赖强度阈值 δ d 设置为 0.01, 确保任意两个子包存在
依赖关系即可. 实验中使用召回率 (recall), 精确率 (precision), 假阳率 (false positive ratio, FPR) 以及假阴率 (false