Page 305 - 《软件学报》2024年第6期
P. 305
徐建 等: LibPass: 基于包结构和签名的第三方库检测方法 2881
to evaluate different detection capabilities, and experiments are conducted on these datasets. The experimental results are deeply analyzed
in terms of detection performance, detection efficiency, and obfuscation resistance, and it is found that LibPass has high detection accuracy
and efficiency and can deal with various common obfuscation operations.
Key words: third-party library; code obfuscation; security analysis; signature
市场调研机构 IDC 公布的研报显示 2019 年 Android 智能手机占据 85.9% 的市场份额. 大量开发人员借助于
软件复用技术便捷地在 Android 应用 (application, APP) 中集成所需的多样化的功能, 实现快速开发, 使得第三方
库 (third-party library, TPL) 俨然成为 APP 开发中必不可少的组成部分. 目前, 开发者使用的 TPL 要么来自于开源
平台, 要么来自于特定的企业发布, 缺乏一个统一的 TPL 安全认证和管理平台, 这使得 TPL 的广泛应用带来了很
多安全隐患. 例如, TPL 被用于收集位置信息和 UDID 来追踪用户 [1] , 收集用户的电子邮件地址 [2] , 读取联系人信
息 [3] 等来谋取商业利益. 更有甚者, 恶意攻击者在原始 TPL 中植入恶意代码 [4] , 将其重新打包伪装成正常的 TPL,
最后被开发者集成到应用中, 对 APP 和 TPL 开发者的名誉造成损害, 对用户造成隐私泄露. 因此, TPL 检测已经成
为 Android 应用安全分析领域的热点问题之一. Android 应用安全分析人员在分析过程中, 借助于 TPL 检测方法
识别 APP 中集成的 TPL 并进而对其开展深入分析, 或移除, 或确定是否为恶意第三方库, 从而协助应用安全分析
法的实用性. 同时, 应用发布前的混淆操作, 可能使得导入的
人员完成下游的安全分析任务, 如恶意应用检测、重打包检测等. 所以, 有必要开展 TPL 检测工作, 从 APP 中分离
出引入的 TPL, 并对其进行安全性分析.
目前, TPL 检测面临着的诸多挑战. 第 1 个挑战是在字节码级别无法区分实现应用业务功能的主程序和引入
的 TPL. 虽然在 APP 开发阶段主程序与 TPL 之间有明显的界限, 但是将源代码和引入的 TPL 编译成 Dalvik 字节
码后则难以确定它们之间的界限. 第 2 个挑战是混淆技术在 APP 发布阶段被广泛应用, 这增加了 TPL 检测的难
度, 并限制了检测精度. 表现在常见的标识符混淆技术使得基于包名、类名等的匹配方式失效; 代码压缩和优化、
包重组等混淆技术使得 APP 中引入的 TPL 的代码结构与原始 TPL 的结构大相径庭, 导致误检、漏检等现象激增.
第 3 个挑战是尚缺乏完备的 TPL 原型库. 若 APP 中引入的 TPL 没有出现在 TPL 原型库, 则该 TPL 不可能被正确
识别出. 最后一个挑战是低的检测效率. 特别是在采用成对比较思路的检测方法中, 需要将 APP 与 TPL 原型库中
的每个 TPL 进行比较, 而 TPL 包含包、类等不同粒度的比较对象, 且粒度越小所需的计算代价增加, 难以满足快
速检测需求.
研究人员提出了多种类型的方法来应对上述挑战. 最早提出的是基于白名单的检测方法 [5−8] , 代表性的工作
[6]
有 DroidMoss 和 [5] Juxtapp . 该方法通过标识符来识别 TPL, 虽然不需要建立 TPL 原型库, 但是仍然需要预先构建
尽可能完备的 TPL 白名单, 因此不能识别未在名单上的 TPL. 此外, 该方法也无法应对常用的标识符混淆技术. 针
对上述不足, 研究人员随后提出了基于机器学习的检测方法 [9−13] , 代表性的工作有 LibRadar 以及 LibD [10] . 该方法
[9]
通过特征工程提取刻画 TPL 的特征, 进而使用分类或聚类算法建立识别模型发现 TPL, 具备一定的抗混淆能力和
发现新 TPL 的能力. 但是, 该方法需要建立在收集大量的 APP 作为训练样本的基础上, 且对于使用频率较低的
TPL 误检率较高. 此外, 大部分工作都是面向广告类型的 TPL 检测, 特征工程提取的特征不能直接迁移用于其它
类型 TPL 检测. 最近的工作是基于签名的检测方法 [14−16] , 代表性的方法有 LibScout [14] 、LibPecker [15] 和 LibID [16] .
该方法为待分析的 APP 和 TPL 中的比较对象, 如包、类、方法等生成签名, 通过成对比较签名相似性识别 TPL.
基于成对比较的方法不可避免面临着检测效率低的困扰, 且会随着 TPL 规模扩充而日益严重, 进而影响了检测方
TPL 与其原型有很大差异, 虽然在签名设计时融入了
抗混淆的元素使得方法能抵御常用的标识符混淆和优化操作, 但对于面对更复杂的混淆操作, 如代码压缩和包重
组等, 还是容易出现较高的误检和漏检, 从而影响了检测方法的精度.
为了提升检测效率和精度, 本文以待分析的 APP 和 TPL 对的多粒度签名为研究对象, 采用成对比较的思想,
提出了一种基于包结构树和签名的 TPL 检测方法, 命名为 LibPass. 首先, 提出主模块识别方法准确地区分主程序
和引入的 TPL, 降低成对比较的次数以提升检测效率. 在此基础上, 提出了一种基于签名的两阶段检测方法, 即通
过基于包结构树的快速检测和基于多级签名的细粒度检测相结合的方法实现 TPL 检测. 前者利用包结构特征的
稳定性来应对应用程序的混淆行为以提升混淆情形下的检测精度, 并利用包结构签名完成快速比对以识别候选