大规模检测代码抄袭:Vendetect工具解析
无人谈论的代码复用问题
在安全评估中,我们经常遇到包含其他项目复制粘贴代码的代码库。有时是合法的代码复用,但往往并非如此。问题比许可证违规更严重:
- 安全债务悄然累积:当开发者从OpenSSL复用函数或复制OpenZeppelin的智能合约工具时,他们会继承代码中的潜在漏洞。但若不跟踪源版本,在CVE发布时无法确定是否受影响。
- 归属信息消失:我们看到过专有代码库包含整个开源库但删除了版权声明。无论恶意还是意外,都会产生法律责任。
- 更新从未发生:复用的代码停滞不前。原始项目修复漏洞和添加功能,但复制版本却逐渐腐化。
Vendetect的工作原理
Vendetect实现了Winnowing算法,与斯坦福MOSS抄袭检测器相同,但在实际软件工程需求上进行了适配。
算法通过创建代码的语义指纹来工作,即使表面发生变化也能保持稳定。简化流程如下:
- 使用语言感知词法分析器(通过Pygments)对代码进行标记化
- 从标记流生成k-gram
- 哈希k-gram并使用滑动窗口选择子集
- 比较文件间的指纹以找到匹配
这种方法即使当有人进行以下操作时也能检测到复制代码:
- 重命名所有变量和函数
- 删除注释和文档
- 重新格式化或重构代码
- 将制表符改为空格(确实如此)
Vendetect采用模块化架构;Winnowing实现只是一个检测后端。该工具可以轻松集成其他方法,如JPlag的基于标记的匹配或基于AST的相似性检测。我们使用Python copydetect包进行核心Winnowing实现,兼顾速度和可靠性。
版本控制感知改变一切
这是Vendetect与学术抄袭检测器的不同之处:它能理解git历史。
假设您正在审计代码库并发现可疑的加密实现。Vendetect不仅告诉您它与某些OpenSSL代码匹配,还能识别复制的确切提交。现在您可以检查该版本是否存在Heartbleed漏洞或之后修复的数十个内存损坏错误。
此功能在评估中证明非常宝贵。我们发现:
- 包含已知错误版本OpenZeppelin代码的智能合约
- 从包含弱点的预披露提交复制的加密库
- 从带有硬编码后门的教程提取的身份验证代码
该工具自动克隆和分析存储库历史,比较目标代码库与多个版本以找到最可能的源提交。
实际检测案例
在Cheating-Daddy/Glass案例上运行Vendetect,在笔记本电脑上耗时约10秒:
|
|
结果清晰显示尽管Glass试图通过删除注释和重新格式化来隐藏来源,但多个文件存在高度相似性的大规模复制。
在智能合约评估中,代码复用检测更为关键。以太坊开发者通常从成熟项目复制实用函数、数学库和安全模式。虽然通常合法,但这种做法会创建隐藏依赖。
实际使用Vendetect
安装简单:
|
|
基本用法比较两个存储库:
|
|
默认丰富输出显示并排代码比较与相似百分比。JSON输出可轻松集成到CI/CD管道中,用于自动许可证合规或安全检查。
超越抄袭检测
我们构建Vendetect是为了解决安全评估中遇到的实际问题,但其应用超出抓取代码窃贼:
- 供应链安全:识别代码库中所有复用的依赖项,特别是传统依赖管理器未跟踪的项。
- 许可证合规:自动验证复用代码是否保持适当归属和兼容许可。
- 安全补丁跟踪:当CVE发布时,通过比较修补版本快速检查复用的代码是否受影响。
- 代码考古:在文档缺失或不正确时追踪遗留代码的谱系。
扩展Vendetect
Vendetect的模块化架构便于试验不同的检测算法。如果您实现了自己的相似性检测方法,无论是基于AST分析、机器学习嵌入还是新颖算法,我们都希望听到您的声音。该工具提供了添加新检测后端的清晰接口:
|
|
我们特别关注可以改进特定领域检测的方法,例如智能合约或嵌入式系统,传统基于文本的匹配在这些领域失败。
亲自尝试
下次您怀疑代码被复制时,无论您是调查许可证合规性、追踪漏洞来源,还是仅仅对代码出处好奇,都可以尝试Vendetect。
该工具可在GitHub和PyPI上获得。如果您实现了新的检测后端或发现了有趣的用例,请联系我们。我们始终根据实际需求改进工具。
代码复用不会消失。但通过适当的工具,我们至少可以使其可见、可追踪和可管理。因为当您甚至不知道安全债务存在时,它积累得最快。