共计 6421 个字符,预计需要花费 17 分钟才能阅读完成。
直击痛点:为什么须要同源检测
随着“数字中国”建设的一直提速,企业在数字化转型的翻新实际中一直加大对开源技术的利用,引入开源组件实现利用需要开发曾经成为了大多数研发工程师开发软件代码的次要伎俩。随之而来的一个痛点问题是:绝大多数的应用程序都蕴含开源组件危险。因此,可能帮忙治理和升高开源组件危险的 SCA 技术应运而生。
惯例的 SCA 软件成分剖析工具能够通过剖析组件版本及依赖,实现对援用的三方开源组件的查看,从而辨认已知的组件破绽以及受权许可危险。然而,组件破绽来源于代码编写存在的平安缺点,对于援用开源组件源码的局部代码片段,从而导致引入存在平安缺点代码的场景,则须要应用代码同源检测技术进行查看。代码同源检测是基于源代码文件的维度面向源代码进行成分剖析,次要用于代码溯源剖析、代码已知破绽剖析、恶意代码文件等,能够精确地剖析出援用的开源软件及其关联信息。本文将从代码同源检测技术原理、核心技术和常见利用场景三大方面对该技术进行解析。
原理浅析:同源检测技术原理介绍
同源检测即同源性剖析,指对应用程序或软件中的组成成分进行同源性剖析,依照剖析的精度划分,精度由低到高可将同源检测分为文件级、函数级和片段级。代码同源检测技术次要用于检测利用源代码中某个片段代码与我的项目中其余片段代码或开源代码存在的雷同代码成分,因而也被称为代码克隆检测。
代码克隆(Code Clone),是指本地代码库或开源代码库中存在多个以上雷同或者类似的源代码片段。应用克隆代码在代码开发过程中也是进步开发效率的一种形式,肯定水平上帮忙了软件系统的开发,但这种形式也可能意外引入代码片段自身存在的平安危险或受权许可危险等负面影响。随着软件在麻利开发的模式下一直迭代,代码克隆造成代码库的一直收缩,在未有良好的克隆治理的状况下,从而减少保护老本。软件缺陷也会因为代码克隆而在零碎中被流传,,升高了软件系统的可靠性。因而,使用代码克隆检测技术可实现满足 SCA 可能检测剖析应用程序中引入的开源组件、剖析开源组件是否有已知的安全漏洞、剖析应用程序或开源组件申明的开源许可证、对源代码进行溯源剖析等外围性能。
图 1 同源检测通用实现
1. 代码克隆四种类型
严格意义上的代码克隆则是指对原始代码片段或代码文件的整体克隆,代码开发者间接应用原始代码片段或文件,两者内容完全一致,未进行任何批改。但从理论利用需要看,通常将代码克隆的类型分为 4 类:
类型 1,齐全克隆:除正文与空白符外,两个代码片段完全相同。
类型 2,重命名克隆:对代码的变量、类型、文字和函数名进行批改,两个代码片段逻辑内容统一。
类型 3,增删改克隆:在类型 2 的根底上,对一些代码语句进行增加、删除或批改,以及批改源代码内容布局,两个代码片段内容类似。
类型 4,自实现克隆:两个代码片段的逻辑性能雷同,然而具体的编码实现形式不同,例如通过替换同类型函数或表达式实现,其工夫复杂度和输入输出统一。
对于检测办法而言,其中类型 1、类型 2、类型 3 次要通过文本相似性检测技术实现,类型 4 则须要通过性能相似性进行检测。类型越靠后,其检测难度越高。
图 2 四种类型代码克隆示例展现
2. 惯例代码克隆检测流程
为无效实现对代码克隆的检测,次要技术蕴含了代码格局转换和类似度确定。针对不同的代码克隆检测工具,实现的技术原理具备肯定的差异性,但其次要的执行流程大致相同,能够总结为以下流程:
图 3 代码同源检测流程
1)开源 / 闭源代码库:当作为代码克隆检测的次要知识库根据时,提前收集足够残缺的开源 / 闭源代码我的项目,利用特定算法造成知识库特色表汇合;当作为检测指标时,通过预处理移除无意义的代码片段并进行转换,执行特定的相似性比拟办法,取得克隆检测后果。
2)预处理与转换:针对软件供应链平安检测场景,须要对缺点代码、骨干外围代码进行预处理,去除无意义源代码局部,将代码进行标准化,可通过将源代码分为不同的片段,转换为可比拟的单元。比拟单元的转换方法蕴含多种,视其具体检测原理不同而定。
3)源代码表征:在这一步骤中,能够将源代码表征为文本,或者进一步利用符号进行表征,用于不便存储记录或后续进行比拟验证,更深刻的表征形式还包含将源代码转换成形象语法树(AST,Abstract Syntax Tree)等。
4)代码类似度比拟:在这一步骤中,每一个代码片段都会与其余代码片段进行比照来找到代码的克隆,比对的后果将以克隆对列表的形式出现。其中,类似比拟的算法很大水平上由源代码表征形式决定。如,将 AST 作为一种源代码表征形式,则这类源代码表征形式将决定选用何种适宜的类似度算法。
5)代码克隆后果整合:这一个步骤次要是将前几个步骤取得的代码克隆和原始的源代码关联起来并以适当的形式出现。将检测后果提交给需求方,且提供给源代码所有者参考,要求去除或整改。
3. 外围检测算法
01 基于文本的代码克隆检测办法
基于预处理的源代码(删除空格、正文等),应用文本类似度检测算法间接检测代码克隆。当文本类似度检测基于源码比拟时,基于文本的检测办法可能笼罩类型 1 齐全克隆和类型 2 重命名克隆的代码克隆检测。然而文本类似度检测并不局限于纯源码的比拟。因为源代码自身有意义,间接作为文本处理会失落大量信息,因而将源码提取特色指纹当前,也是两个字符串文本的比拟。再利用非凡的算法,可能实现对类型 3 增删改的笼罩。前期如果可能实现基于自然语言解决的类似度算法,实践上来讲类型 4 自实现克隆也是能够笼罩的,不过这一步可能须要较长的工夫。
02 基于令牌的代码克隆检测办法
应用词法分析器将源代码划分为令牌序列,而后在令牌序列中找到类似的子序列。基于令牌的检测办法对源代码进行词法剖析,符号序列更合乎编译准则,源代码信息失去了更充沛的利用。但它不足对代码语法和语义的剖析,对类型 3 和类型 4 代码克隆的检测成果并不现实。
03 基于树的代码克隆检测办法
是将源代码示意为形象语法树或代码解析树,而后应用树匹配算法找到类似或雷同的子树,从而检测克隆代码。该办法对源代码进行语法分析,进一步提高了对源代码信息的利用,能够更好地检测类型 3 代码克隆,进步检测精度。
04 基于度量的代码克隆检测办法
提取源代码特定索引指标(如代码的数量、变量的数量、循环的数量),将它们形象到特征向量,而后确定克隆基于特征向量之间的间隔,这种办法在速度上有很大的劣势。
05 基于图的代码克隆检测办法
将源代码转换为由数据流图和控制流图组成的程序依赖图(PDG,Program Dependence Graph),并通过寻找齐次子图来实现克隆检测。基于图的克隆代码检测办法不仅利用了源代码的语法结构,而且在肯定水平上思考了源代码的语义信息,因而该办法能够检测类型 4 代码克隆。然而,因为程序依赖图生成算法和同构程序依赖图子图匹配办法的时空复杂度较高,因而基于图的代码克隆检测办法不能利用于大型软件系统的代码克隆检测。
4. 代码克隆检测能力评估
不同的代码克隆检测办法实用于不同规模、编程语言和构造的软件系统。为了评估检测办法能力,个别采纳以下评估指标:
召回率:所有被检测到的代码克隆数量与代码克隆总数的比值。
召回率 = TP /(TP + FN)
检测精度:指克隆检测算法所检测到的代码克隆为实在代码克隆的比值。
检测精度 = TP /(TP + FP)
表达式阐明:TP 示意某种代码克隆检测办法检测到的克隆片段与实在代码克隆片段的交加,FP 示意代码克隆的汇合,FN 示意该检测办法未检测到的实在代码克隆片段的汇合。
相似于惯例的破绽检测工具,OWASP Benchmark 作为破绽扫描工具检测基准能力评估的靶场我的项目。对于代码克隆检测工具畛域,也具备对应的代码克隆检测有效性评估的靶场我的项目。比方:
1)公布于 2007 年的 Bellon’s benchmark:针对两个小型 C 程序和两个小型 Java 程序,运行六个不同的代码克隆工具,并对这些后果与实在代码克隆的主体进行比拟,以创立代码克隆的数据集。
2)公布于 2015 年的 BigCloneBench:是 IJaDataset-2.0(蕴含 25000 个开源 Java 零碎的大数据软件存储库)中的 800 万个通过验证的代码克隆的汇合。其我的项目内和我的项目间,蕴含了四种次要的代码克隆类型。
深度解析:同源检测核心技术
联合行业企业用户的痛点及需要,基于代码克隆检测底层技术实现的同源检测技术可分为代码溯源剖析、代码已知破绽剖析、恶意代码文件剖析三大类别。
1. 代码溯源剖析
在 SCA 中代码溯源剖析技术旨在通过检测指标代码,溯源指标代码援用的第三方开源我的项目的详细信息,包含匹配我的项目的文件及代码行,联合第三方开源我的项目申明的许可证,剖析开源代码的引入是否会有兼容性和合规性等知识产权危险。该技术基于类似哈希精准匹配等代码特征提取办法,对代码特色进行整合、计算后生成代码指纹信息,联合代码级大数据指纹库进行关联、匹配、剖析。
2. 代码已知破绽剖析
开发者在开发过程中引入的第三方开源代码,可能存在可被攻击者利用的已知破绽。据调查显示,超 80% 的破绽文件在开源我的项目内有同源文件,破绽文件影响的范畴在开源我的项目的流传下扩充了 54 倍,如图 4 所示。
图 4 破绽文件同源占比散布
通过同源检测技术辨认出与以后代码同源的开源我的项目,联合破绽库信息,能够检测以后代码是否来自有破绽开源我的项目、以后代码是否来自开源我的项目有破绽的版本、以后代码是否波及破绽相干的代码。
3. 恶意代码文件剖析
目前,越来越多的安全事件是因为攻击者无意在开源社区提交恶意代码并公布更新,或在开源我的项目中增加歹意依赖,或滥用软件包管理器来散发恶意软件等新型攻击方式导致的。如 NPM 包中,eslint-scope 因黑客盗用开发者账号而公布蕴含恶意代码的版本、event-stream 因黑客混入我的项目维护者中而后在我的项目中增加歹意依赖等事件。因而,检测并辨认源码中的恶意代码是满足 SCA 的一个必要性能。
SCA 是通过从源代码中提取敏感行为函数的特色数据,与提前收集的恶意代码特色数据进行比对来辨认源代码中的恶意代码。
同源检测技术是 SCA 技术的重要根底,源鉴 SCA 具备纵深代码同源检测外围能力,能够精准辨认利用开发过程中援用的第三方开源组件,通过利用组成剖析引警多维度提取开源组件特色,计算组件指纹信息,深度开掘组件中潜藏的各类安全漏洞及开源协定危险,全覆供应链平安审查、软件合规性审查、第三方组件平安管控等行业利用场景。
业务重塑:利用场景的跟踪与定位
1. 冗余代码检测
麻利模式开发的利用,因为不同研发人员负责不同微服务利用开发,往往不盲目存在雷同性能代码的实现。通过代码同源检测技术辨认同类型的冗余代码,不仅能够便于打消和治理代码复用,对于后续保护提供遍历,也可能在呈现代码缺点时,不便进行对立修复,进一步确保代码品质。
例如,当不同的研发人员在开发各自应用程序时,波及到对同样的性能进行重复编码实现。通过对代码进行相似性检测,能够把类似代码整合成为一个 SDK 包,除了能够对立保护,也可供应其余研发人员应用。
图 5 图片源自源鉴 SCA 工具
2. 片段代码危险检测
代码同源检测技术能够用于片段代码危险检测。片段代码危险检测次要是指在一个代码库或我的项目中,辨认出具备潜在平安危险或破绽的代码片段,以便进行修复或增强安全性。企业应用三方开源组件开发要害性能,往往不会间接应用,需依据业务须要对开源组件源代码进行二次开发。针对二次开发后的开源组件,惯例的 SCA 工具难以辨认其存在的危险,而代码同源检测技术可通过缺点代码片段表征,对二次开发后的开源组件以及短少版本特色的脚本型代码进行组件破绽关联。
例如,惯例的 SCA 技术对 jar 扩展名开源组件进行组件破绽关联时,次要通过其版本号和组件指纹标识进行判断,二次开发后的开源组件,毁坏了一部分指纹,可能导致无奈辨认。代码同源检测技术,可依据组件破绽相干的危险代码片段,辨认该类型组件是否存在对应组件破绽危险。
通过代码同源检测技术进行片段代码危险检测,能够疾速发现和修复潜在的平安问题,进步代码的安全性和可靠性。
3. 代码常识侵权审核
开源组件并非自在组件,开源组件的应用须要严格遵守开源许可协定,在违反开源我的项目作者受权志愿的状况下应用其克隆代码,依然会收到开源我的项目许可协定的束缚。代码常识侵权指的是在编写软件时,剽窃或复制了其他人的代码或算法,进犯了别人的知识产权。常见的代码常识侵权模式包含剽窃开源软件、复制其他人的代码、盗用算法等。企业对于本身商用软件,须要通过代码同源检测技术定期梳理查看开源组件代码应用状况,尤其是针对脚本型语言的应用,确保本身软件不存在开源许可协定危险。
例如,当高级研发人员在意识有余的状况下,应用了某些限度商业用途的开源代码的局部片段,从而导致利用存在了受权限度的危险,代码同源检测技术能够帮忙辨认这类型危险。代码同源检测技术能够用于辨认代码常识侵权审核,帮忙开发人员保护本人的知识产权,同时也能够防止进犯别人的知识产权,进步代码的合法性和可信度。
图 6 图片源自源鉴 SCA 工具
4. 平安编码执行溯源
平安开发体系建设过程中,平安编码标准是晋升编码品质的重要环节。对于规范平安编码的应用可通过代码同源检测技术进行审核,查看规范平安编码的利用状况,确保研发团队开发的利用具备根底的平安健壮性。
例如,在企业编制了规范的平安代码后,心愿研发人员尽可能在开发过程中应用。代码同源检测技术能够帮忙统计这部分规范代码的应用覆盖率,帮忙后续推广。
5. 代码自研率剖析
在国家对企业软件自主可控的大环境要求下,软件源代码自研率剖析将成为重要的参考指标,利用系统核心骨干程序开发须要严格遵循自主可控准则。源代码同源检测,不仅可能展现代码片段是否可能存在平安危险,还能在企业承受外包或合作开发代码时,帮助辨认交付利用源码自研率,进步验收规范。
图 7 图片源自源鉴 SCA 工具
6.AI 生成代码查看
随着 ChatGPT 的利用,研发人员逐步开始应用该技术自动生产可用代码。但因为 AI 自身收录样本学习的起因,其自动生产的代码可能存在局部代码克隆,并蕴含未恪守许可的危险。代码同源检测技术在代码生成时,能帮忙减少平安危险审计能力。
实际利用:供应链平安治理
同源检测技术次要价值体现于帮忙企业组织辨认和盘点开源软件的组件,并检测是否存在已知的代码破绽或恶意代码,从文件级、代码片段级上帮忙软件资产治理解决“看不清”和“摸不透”的次要痛点问题,帮忙确保企业组织中供应链组件的安全性和可靠性。
源鉴 SCA 联合使用丰盛的知识库样本、多种工夫压缩的代码片段级检测算法等本身技术劣势,最优化施展同源检测技术个性,可做到以下性能特色:
1)基于丰盛的知识库样本:知识库笼罩支流的代码托管平台 GitHub、GitLab、BitBucket、Gitee、Codeberg 等,笼罩的开源项目数超过 8KW+;
2)基于多种工夫压缩的代码片段级检测算法:千万级的代码片段数据,只有秒级别,靠近文件级的类似度检测时间;
3)精准定位:校验代码片段级算法的执行后果,可能清晰的定位到具体的开源我的项目地址、版本、文件门路名称和行号;
4)灵便的自适应:类似度阈值可调节,缩小误报的概率。
源鉴 SCA 在满足实现源码级同源检测技术的根底上,联合二进制 SCA 技术、运行时 SCA 技术及组件破绽热修复等技术,无效帮忙开发人员更好地治理和保护软件成分,进步软件的安全性和可靠性,助力企业建设并无效落地数字供应链平安治理体系,保障数字供应链平安。
GitHub:https://github.com/XmirrorSecurity/OpenSCA-cli/
Gitee:https://gitee.com/XmirrorSecurity/OpenSCA-cli/
OpenSCA 官网:https://opensca.xmirror.cn/