CVE 二进制工具:GSoC 最终报告
Google Summer of Code 2020 终于结束了,这是一次多么激动人心的体验!在这篇文章中,我将展示我的劳动成果。
上周我创建了一个示例 GitHub 操作工作流,这标志着我的 GSoC 项目的最后一个重要里程碑改进并发和输入功能。我很高兴我能够及时完成所有重要的里程碑。下面我将简要总结一下我的旅程。
关于项目
在进入细节之前,我想为外行做一个简单的项目介绍。如果您已经熟悉此部分,则可以跳过它。
我的项目是改进_CVE Binary Tool_的并发和输入功能。 CVE Binary Tool 扫描几个常见的、易受攻击的开源组件,例如 OpenSSL、libpng、libxml2 等,让您知道给定目录或二进制文件是否包含具有已知漏洞的常见库,称为 CVE (Common Vulnerabilities and Exposures)。它是用我最喜欢的语言 Python 编写的。它以 python 包的形式提供,您可以从PyPI获取它。您可以从GitHub 存储库查看源代码,它由Terri Oda和John Andersen维护。他们也是我这个项目的导师。
当我开始做这个项目时,_CVE Binary Tool_在Windows平台下有一些bug由于我主要使用Windows,我已经修复了社区绑定期间的所有Windows bug。我还编写了更快的原生 python 解决方案来替换 c-strings 扩展模块和重构整个检查器模块以使用面向对象设计来减少社区绑定期间的代码重复。由于我们在上一个版本中删除了对 Python2 的支持,因此我还针对 Python3 优化了旧版 Python2 代码。
第一个里程碑:改进测试套件
我想改进 CVE Binary Tool 的测试,因为 CI 运行时间太长,并且当我们在本地运行测试时缺少初始化导致测试失败。
我已从测试套件](https://github.com/intel/cve-bin-tool/pull/716)中删除了[编译器依赖项,以支持本机 python 解决方案。我还通过研究和了解错误的起源,修复了棘手的pytest 初始化错误。我还逐步改进了每个模块的测试套件,将其从标准 unittest 迁移到 pytest 并使用pytest-xdist优化运行时。 (例如: test_json](https://github.com/intel/cve-bin-tool/pull/772)的[并行化。
第二个里程碑:提升并发
以前,CVE Binary Tool 使用多处理来下载NVD 数据馈送。由于下载是一个 IO-bound 任务,我建议asyncio将是这个用例的更好选择。
我已经重构了几乎所有 IO 绑定模块以使用_asyncio_。我还为各种模块开发了许多async-utilities。以下是关于我改进工具并发性工作的所有拉取请求。
-
异步提取模块
-
异步字符串模块
-
异步文件模块
-
异步cvedb模块
主要的性能提升是切换到 asyncio 后下载时间减少了 50%。
第三个里程碑:改进输入功能
CVE Binary Tool 有一个名为 csv2cve 的命令,用于从 CSV 格式的输入中获取 CVE。我的目标是用可以支持各种输入类型的通用 InputEngine 模块替换它。目前,它支持 CSV 和 JSON 作为有效的输入数据类型。我还添加了对指定 CVE 分类数据的支持,例如备注(例如:缓解、忽略等)、评论、自定义严重性等。
由于 CVE Binary Tool 有几个命令行参数,我决定添加对配置文件的支持,这样用户就不必在每次扫描目录时重复指定这些参数。它在 CI/CD 管道等自动化环境中也很有帮助。下面是我与此里程碑相关的拉取请求列表。
-
添加了带有备注功能的 InputEngine
-
InputEngine:评论和自定义严重性支持
-
修复 InputEngine 的路径问题并降低 CVEScanner 的复杂性
-
添加了对配置文件的支持
-
配置文件和输入文件的记录使用情况
最后的里程碑:提升用户体验
我们很幸运有Anthony(用户)愿意参加我们的每周例会。他提出了许多对他和其他用户有帮助的特性和文档。我为不同的用例贡献了个操作指南(本质上是一本食谱食谱)。
我还创建了一个错误处理程序模块,使用丰富的库提供漂亮的回溯,并根据异常设置自定义退出代码,以便用户知道程序在安静模式或自动化脚本下终止的原因。
这是我与此目标相关的所有拉取请求的列表。
-
文档:添加指南
-
在 github 操作中运行 CVE 二进制工具的示例 yml 工作流
-
在 cli、input_engine 和 cvedb 中使用漂亮的跟踪和退出代码改进了错误处理
-
改进了提取器的错误处理和可读性
-
OutputEngine:现代化错误处理
-
OutputEngine:修复生成_filename args 签名
未来工作
我最初的提案很大,由于时间有限,我必须根据用户要求优先考虑我的目标。我已经完全完成了改进输入功能和用户体验的核心目标,但我仍然对项目的并发方面有很多优化。因此,我将继续在上改进 CVE 二进制工具的性能。我还想优化长测试的运行时间,因为运行所有测试需要 30 分钟,我相信我们可以通过缓存和/或减少需要下载进行测试的测试数据来显着优化它。我还想为该工具创建一个随时可用的 GitHub 操作,以便开发人员可以轻松地将其集成为他们的 CI/CD 管道的一部分。
GSoC 的收获
我与 Terri Oda 和 John Andersen 一起使用 CVE Binary Tool 获得的经验是无法估量的。我的两位导师都很善良,乐于助人,而且非常有才华。他们给了我很多建议和建议,从低级语言工作到编写好代码的最佳实践。
Terri Oda 通过推荐有关最佳实践的文章帮助我提高了 PR(拉取请求)质量。她还帮助我了解应该优先考虑哪些任务。虽然 John Andersen 帮助我解决了很多关于 python 的一般问题,比如元类、异步、上下文管理器等。
在 GSoC 之前,我只知道基本的 git 命令,但现在我可以自信地说我已经掌握了 git。我对编程语言的工作原理、何时以及如何选择第三方库、如何有效地引用文档、如何编写干净、可读和可维护的代码、如何有效地记录和测试代码、如何正确构建拉取请求,最重要的是_practical_编程是如何工作的,否则我不会知道。
开源现在已经成为我的爱好,因为作为开源社区的一员,我了解到作为开源贡献者除了进行代码贡献之外,我还可以分类和解决用户问题并审查其他贡献者的拉取请求。我还可以指导和激励新的贡献者。如果我只是做我的个人项目,我不会得到这种经验。
所有这些课程对我来说都是无价的,我坚信这对我的整个职业生涯都会有所帮助。
更多推荐


所有评论(0)