Page 321 - 《软件学报》2024年第6期
P. 321
徐建 等: LibPass: 基于包结构和签名的第三方库检测方法 2897
表 6 LibPass 方法中是否应用主模块识别的实验结果
性能 (%) 平均检测时间 (s)
是否集成主模块识别
recall FPR 主模块识别时间 两阶段检测时间
√ 100 11.39 1.48 15.47
× 100 11.38 - 23.68
δ d ”, 该阈
最后, 讨论主模块识别中涉及的阈值对于检测结果的影响. LibPass 仅涉及一个阈值“依赖强度阈值
值出现在主模块识别方法中, 用于判定两个子包是否存在依赖关系. 实验中将 LibPass 主模块识别模块中使用的
δ d 设置为 0.01, 一个比较小的值, 意味着确保任意两个子包容易存在依赖关系. 从表 5 和表 6 中关
依赖强度阈值
于主模块对 LibPass 的贡献分析结果可知, 主模块识别对 LibPass 的检测性能无影响, 对于检测效率有一定影响,
主模块识别仅是一个用于优化检测效率的可选组件. 因此, 依赖强度阈值对于 TPL 检测性能是没有影响的, 故这
里不再进行阈值变化对检测结果的影响分析.
3.4.2 基于包结构树的检测性能和效率分析
本节对 LibPass 中基于包结构树的检测组件进行评价, 特别是评估其对于 LibPass 解决方案效率方面的贡献.
实验在基准数据集 GTB-2 进行, 结果如表 7 所示. 从表中可以看出, 是否应用基于包结构树的检测方法对性能指
标 recall 和 FPR 也没有影响, 但是应用后的平均检测时间从 525.6 s 下降到 15.47 s, 节省 97.05% 的检测时间. 这
同样表明基于包结构树的检测组件的引入对效率提升有显著影响, 但对性能没有影响. 效率提升的原因在于基于
包结构树的检测方法提供了包级别匹配快速识别候选第三方库, 而不需要更耗时的类级别检测.
表 7 LibPass 方法中是否集成基于包结构树的检测方法的实验结果
性能 (%) 平均检测时间 (s)
是否集成基于包结构树的检测
recall FPR 基于包结构树的 基于多级签名的 两者之和
× 100 11.38 - 525.60 525.60
√ 100 11.39 2.74 12.73 15.47
进一步地, 效率提升的空间取决于待分析应用程序是否经过混淆. 为了估计效率提升的空间, 从豌豆荚、
个
应用, 对应用的混淆情况进行了统计分析, 结果如表
Google Store、F-Droid 上收集约 16 900 标志符混淆 所示, 从
Android
8
表中可以看出, 83.46% 的 APK 没有混淆, 这些 APK 包含的 ARP 个数占比 92.63%, 剩余的 7.37% ARP 中仅有
1.77% 应用了包重组混淆技术会导致基于包结构树的检测方法失效, 因此仅需对 1.77% 的 ARP 执行基于多级签
名的相似性比较, 而其他的 98.23% 的 ARP 可以通过基于包结构树的检测方法能对抗标识符混淆, 快速过滤到绝
大多数 TPL. 实验中统计基于包结构树的检测方法获得候选 TPL 个数平均值约为 70, 而 TPL 本地库规模为 140 000
个, 因此对于 98.23% 的 ARP 检测效率提升了 2 000 倍. 从上述分析结果可以得出基于包结构树的快速检测方法
对于 LibPass 的检测效率提升有显著贡献, 即使 TPL 规模的增大也不会对 LibPass 的检测效率带来不良影响.
表 8 收集的 APP 混淆情况
是否混淆 混淆类型 APK数 (占比(%)) ARP数 (占比(%))
× - 14 104 (83.46) 122 014 (92.63)
1 644 (9.72) 7 389 (5.60)
√
标志符混淆 & 包重组 1 152 (6.82) 2 325 (1.77)
3.4.3 检测能力评价
本节在 GTB-1 基准数据集上完成对 LibPass 的检测能力评价, 并与其他第三方库检测方法进行了对比分析,
实验结果如表 9 所示. 从表中可以看出, LibPass 的 precision 为 93.07%, 比最好的 LibD 低 0.61%; LibPass 的 recall
略低于 LibPecker 和 LibID-A, 分别低了 3.45% 和 0.09%; LibPass 的综合指标 F1-score 上显著优于其他对比方法,
比排名第 2 的 LibID-A 的对应值高 13.71%; 这表明 LibPass 的总体性能优于其他对比方法.