Page 124 - 《软件学报》2026年第7期
P. 124

徐美秋 等: CAnalyzer: 面向  C/C++源代码的软件成分分析技术                                         2809


                 a  multi-threshold  matching  strategy.  Additionally,  CAnalyzer  analyzes  dependency  directives  in  the  source  code  to  automatically  construct
                 dependencies  among  TPLs.  Experimental  results  show  that  CAnalyzer  achieves  a  precision  of  90.63%  and  a  recall  of  86.57%  in  TPL
                 detection,  outperforming  CENTRIS,  TPLite,  and  OSSFP  in  both  metrics.  In  TPL  dependency  detection,  CAnalyzer  achieves  a  recall  of
                 94.79%  and  a  precision  of  98.99%.  Currently,  CAnalyzer  has  been  adopted  by  the  OpenHarmony  community  and  has  identified  166
                 external components across 689 code repositories, demonstrating its practical value in open-source community management.
                 Key words:  open-source software reuse; software composition analysis (SCA); third-party library (TPL) dependency

                  1   引 言

                    随着开源生态的蓬勃发展, 第三方库 (third-party library, TPL) 被广泛应用于软件开发, 极大地提高了开发效
                 率  [1,2] . 然而, 被复用的第三方库可能引入安全漏洞, 从而带来潜在的安全隐患               [3−7] . 为应对这一问题, 软件成分分析
                 (software composition analysis, SCA) 技术应运而生. SCA  技术通过分析开源软件和商业软件中的源码、模块和框
                 架, 识别并枚举被复用的第三方库, 检测已知的安全漏洞、未修补的漏洞及许可证合规性风险等问题, 从而确保软
                 件供应链中第三方库的安全性与合规性. 本研究聚焦于针对                    C/C++语言软件的源到源 (source-to-source, S2S) 的
                 SCA  技术, 该技术基于源代码构建特征库, 匹配目标代码特征与已知                  TPL  代码特征的相似性来识别         TPL. 已提出
                 多种基于   S2S  的  SCA  技术  [5,8−15] , 然而, 随着软件开发复杂性的增加以及   C/C++语言生态中长期存在的         TPL  管理
                 碎片化问题, 现有的      SCA  技术仍面临以下限制.
                    (1) 基于单一   C/C++ TPL  托管仓库构建特征库导致漏报         TPL. 在  C/C++语言生态系统中, TPL    资源分布于多
                 个托管仓库 (如    Debian、Conan、GitLab  等), 本研究调查显示, 目前有超过      15  个活跃的托管仓库包含       C/C++ TPL.
                 然而, 现有的   SCA  技术  [13−15] 仅依赖单一托管仓库 (如  GitHub) 收集  TPL  资源, 由于无法全面覆盖所有      C/C++ TPL,
                 从而导致对实际项目成分分析时出现漏检. 近期对                CENTRIS  的大规模实际项目评估        [14] 结果显示, 当复用  TPL  的
                 阈值设置为    1%  时 (精确率仅为   17.7%), CENTRIS  仍漏报  30.7%  的  C/C++ TPL. 因此, 基于单一托管仓库构建的特
                 征库不足以实现全面覆盖         C/C++ TPL.
                    (2) 相似性计算粒度与成分报告粒度不匹配造成误报                 TPL. 现有  SCA  技术  [13−15] 通过逐一对比目标代码与已
                 知  TPL  中的函数相似性 (函数粒度计算相似性), 并基于相似函数的数量和占比 (相对于                     TPL  总函数数) 判断是否
                 报告复用   TPL. 然而, 基于整个    TPL  函数数量计算阈值未能考虑函数在           TPL  文件中的分布, 如果与目标代码匹配
                 的函数实际上来自       TPL  不同文件的常用函数, 会被误判为有效成分, 引发            SCA  误报  TPL.
                    (3) 缺乏  TPL  之间依赖关系的分析限制安全性和合规性检测的准确性. 现有的                    SCA  技术  [13−15] 主要关注  TPL
                 成分的识别, 但未深入分析        TPL  之间的依赖关系, 导致以下两个主要问题: (a) 难以全面了解漏洞在各个                  TPL  之间
                 的传播路径和影响范围, 限制了安全团队根据漏洞传播路径优先处理关键问题的能力                            [16−19] ; (b) 无法准确识别实际
                 依赖路径中的许可证冲突、许可证兼容性等合规性问题, 进而增加了软件合规性风险.
                    然而, 为了克服这些限制, 在构建全面覆盖            C/C++ TPL  的特征库、优化    TPL  检测和增强依赖关系分析的过程
                 中, 也伴随着新的技术挑战.
                    (1) 融合多个托管仓库构建       C/C++ TPL  特征库和不准确的函数诞生时间, 加剧了公共函数对                TPL  检测造成的
                 干扰. 构建全面的     C/C++ TPL  特征库的直接方法是收集并整合所有            C/C++ TPL  托管仓库中的   TPL. 然而, 若未经
                 处理将所有特征直接保存至特征库, 公共函数的干扰性将加剧. 本文所指的公共函数包括: TPL                           间复用引入的克隆
                 函数  [13] , 以及实现常见算法 (如排序、查找算法等) 的相似函数. 如果这些公共函数与目标代码匹配, SCA                       技术可
                 能错误地将包含这些函数的          TPL  判定为目标代码的有效成分. 为了减少公共函数引起的干扰, 已有研究引入了函
                 数诞生时间 (function birth time) [13,14] 帮助确定函数最早出现的库, 进而明确其原始       TPL  并排除误报   TPL. 然而, 在
                 融合多个托管仓库构建的特征库中, 函数诞生时间的准确性受到挑战: (a) 非                       Git 管理的托管仓库 (如通过       FTP
                 Server 发布源代码的   C/C++ TPL) 难以获取函数诞生时间; (b) Git 管理的托管仓库中约           20.0%  的  C/C++ TPL  缺乏
                 Release/Tag, 导致获取不准确的函数诞生时间; (c) C/C++ TPL      迁移至其他托管仓库时, 丢失历史版本的函数诞生
                 时间. 因此, 融合特征库中公共函数归属原始            TPL  的确认问题仍然是一个亟待解决的挑战.
   119   120   121   122   123   124   125   126   127   128   129