Page 315 - 《软件学报》2024年第6期
P. 315
徐建 等: LibPass: 基于包结构和签名的第三方库检测方法 2891
定义 6. 包结构相似度 (package structure similarity). 对于给定的待分析包对 < arp,lrp > , 其包结构相似度是指
两个根包对应的包结构树中相同子包的个数的两倍与两棵包结构树中所有子包数目之和的比值,
NumofMatchedSubpackages(arp,lrp)×2
sim pss (arp,lrp) = (1)
NumofSubpackages(arp)+NumofSubpackages(lrp)
其中, 函数 NumofSubpackages () 统计包结构树中除根节点之外的节点数目, 函数 NumofMatchedSubpackages() 统计
两棵包结构树中具有相同包名的子包个数.
若两个根包的相似性值大于 0, 则将 lrp 加入候选列表. 没有引入非零阈值作为更严格筛选条件的原因有两
个, 一是避免漏检, 故将所有可能的 TPL 都纳入细粒度检测范围, 虽然增加了一定的检测时间开销, 但是实际测试
中发现能排除绝大部分 TPL, 设计的相似性度量是具有较好的区分性; 二是无需先验知识来设定阈值. 最后, 算法
第 11 行对候选按照相似性降序排序得到最终的候选清单.
2.3 基于多级签名的细粒度检测方法
基于包结构树的快速检测方法仅能确定候选范围, 并不能直接确定引入的 TPL, 仍然需要对 APP 与每个候选
进行细粒度的成对比较, 因此提升比较效率和性能对于 LibPass 的实用性是至关重要的. APP 和 TPL 中根包、子
LibScout 和
包、类、属性和方法的层次组织方式决定了低层次的信息量丰富, 比较精度高同时比较代价也高, 而高层次的信
息粒度粗, 比较精度低且代价低. 为了提升检测精度, 同时兼顾效率, 提出了一种基于多级签名的细粒度检测方法,
如图 4 所示. 在签名构建过程中, 以类为对象, 生成类的基本签名、属性签名和方法签名, 而后生成类签名; 在比较
过程中, 以根包作为比较对象, 采用递归的思想将根包的比较分解为根包内子包的比较, 子包的比较分解为子包内
类签名相似性度量, 类签名相似性比较分解为基本签名、属性签名和方法签名的相似性比较.
根包
比
子包 ··· 子包 较
顺
序
类签名 ··· 类签名
构
建
顺 基本签名 属性签名 方法签名
序
访问 类依赖 访问 属性依赖 访问 方法依赖
标志 签名 标志 签名 标志 签名
图 4 签名生成和比较模型
在相似性比较中类签名相似性比较是核心, 旨在通过类签名层面的分析提高第三方库及其版本识别的准确
性. 现有的基于相似性比较的第三方库检测方法, 如 LibPecker [15] , 采用哈希方式为类中所有方法描述
符构成的字符串生成类签名, 具有对抗标志符混淆的能力, 但若在混淆过程中将类中没有使用的方法移除, 则会增
加误匹配可能性, 尤其是在类中包含的方法较少的情形下, 导致第三库检测准确率下降. 针对这一问题, 本文提出
了一种基于依赖关系的类签名方法, 引入类依赖关系是在混淆情形下仍能得以保持的这一稳定特性提升类签名抗
混淆能力. 下面详细描述基于依赖关系的类签名方法, 如算法 3 所示. 给定类 Class A , 其类签名由基本签名、属性
签名和方法签名的组合生成, 其中:
● 基本签名, Sig , 是类申明中的访问标志和继承依赖拼接成的字符串映射成的哈希值. 这里类继承依赖仅考
b
虑声明中的类继承关系, 若类 Class A 继承自类 Class B , 则说 Class A 继承依赖于 Class B .
● 属性签名, Sig , 是类中申明的属性的访问标志和属性依赖组成的字符串映射成的哈希值. 若类 Class A 中定
a