Page 83 - 《软件学报》2025年第7期
P. 83
3004 软件学报 2025 年第 36 卷第 7 期
公司缩短开发周期, 降低开发成本, 但是不合规的代码复用也会给软件带来安全方面的风险. 根据奇安信发布的
《2022 中国软件供应链安全分析报告》, 在 2 254 个企业软件中, 平均每个项目使用了 127 个开源软件, 其中
86.4% 的项目存在已知的开源软件漏洞. 而源代码项目通过编译后, 通常会以二进制的形式发行以供公开使用. 由
于代码复用, 代码中潜在的安全问题常常会传递到下游的软件公司和使用者中. 例如由于对 OpenSSL 项目的代码
复用, 心脏流血 (heartbleed) 漏洞导致了超过 17% 的网站都面临着安全风险.
为了解决这些由代码复用所引入的问题, 二进制到源代码相似性检测方法 [1−11] 被提出并应用于包括代码搜索,
开源软件复用检测, 以及软件组成成分分析在内的多个领域. 函数作为二进制文件和源代码项目的基本组成部分,
其相似性检测结果决定了具体应用领域的效果. 通常, 二进制到源代码相似性检测方法会将待检测的二进制函数
定义为查询函数, 而可能会复用的源代码函数作为目标函数. 当查询函数与目标函数相似时, 相似性检测方法则会
认定为函数之间存在复用关系. 已有的方法通常认为复用函数之间包含了等价的函数语义, 因此通常使用一对一
的匹配方式来对函数进行比较.
然而, 复用函数之间并不一定总是承载着等价的函数语义. 当函数内联发生时, 一个二进制函数通常由两个或
者多个源代码函数编译生成. 此时, 若二进制函数在编译过程内联了源代码函数, 查询函数和目标函数之间的映射
关系将会从一对一转变为一对多. 我们先前的工作 [12] 发现函数内联广泛存在于二进制文件中, 当使用 O3 优化级
别时, 接近 40% 的二进制函数是通过内联生成的. 而现有的二进制到源代码相似性检测方法在处理含内联的二进
制函数时, 性能损失高达 30%. 因此急需解决函数内联带来的“一对多”的匹配问题.
针对上述问题, 本文提出了一种名为 O2NMatcher 的方法, 该方法采用了“一对多”的匹配机制来匹配二进制
函数与源代码函数. 图 1 展示了 O2NMatcher 的核心思想. 总体而言, 传统的“一对一”匹配方法通过比较二进制函
数和源代码函数得到复用结果, 而 O2NMatcher 旨在生成源代码函数集合, 用以补充源代码函数的缺失, 从而来与
内联的二进制函数进行对比. 源代码函数集合是一个由多个源代码函数组成的函数集合, 该源代码函数集合包含
了该二进制函数对应的源函数以及参与内联的其它源函数, 因此其语义等同于内联后的二进制函数. 从而
O2NMatcher 可以帮助现有技术在函数内联的情况下进行二进制到源代码函数相似性的匹配.
源代码函数
O2NMatcher 集合
开源软件 源代码
函数
二进制到源代码
相似性匹配
二进制 二进制 检测结果
函数 传统“一对一”的匹配过程
图 1 O2NMatcher 的“一对多”匹配思想
本文的主要工作和创新性贡献如下.
(1) 本文提出一种能够在函数内联场景下进行二进制到源代码函数相似性计算的检测方法 O2NMatcher, 该方
法通过生成源代码函数集合, 有效提升了现有二进制到源代码函数相似性检测方法在内联场景下的检测能力.
(2) 为了使 O2NMatcher 能够准确地生成源代码函数集合, 本文进行了一项实证研究, 分析了不同编译设置
下的内联关联性. 基于发现的内联规律, 将内联调用点的预测问题建模为一个多标签分类问题, 并提出了名为
ECOCCJ48 (ensemble of compiler optimization based classifier chains built with J48) 的模型.
(3) 通过对函数内联过程的观察, 提出了一种基于函数调用树的构建方法用于源代码函数集合的生成. 本文将
源代码函数集合生成的过程转化为包含根节点选择和边扩展的内联函数调用图的生成问题, 最终生成的源代码函
数集合能够有效地弥补源代码函数的缺失.
本文第 1 节介绍二进制到源代码相似性检测和函数内联的相关研究. 第 2 节介绍函数内联场景下的“一对

