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  检测. 前者利用包结构特征的
                 稳定性来应对应用程序的混淆行为以提升混淆情形下的检测精度, 并利用包结构签名完成快速比对以识别候选
   300   301   302   303   304   305   306   307   308   309   310