iridium-soda / VulnCodeCollector

A lightweight tool designed to automatically crawl CVE-related source code, with the capability to export content in a readable database format(i.e. 多维表格) for applications like Lark or Tencent Docs.
Apache License 2.0
0 stars 0 forks source link

VulnCodeCollector

A lightweight tool designed to automatically crawl CVE-related source code, with the capability to export content in a readable database format(i.e. 多维表格) for applications like Lark or Tencent Docs.

Description

通过nvd的API接口和GitHub的API,自动化获取给出的CVE漏洞的相关信息和源代码文件。

graph LR
A[CVE number input]-->NVD[NVD API]
A-->OpenCVE[OpenCVE]
OpenCVE-->|Vendor infos|MergedData
NVD-->|Basic infos| MergedData
MergedData-->|CVE infos|GitHub[GitHub API]
GitHub-->|Source codes|Local

获取的文件包括:

Install

Install dependencies

conda env create -f environment.yaml
conda activate vulnsrc

Get NVD API key

[!tip] 关于NVD API更多信息,参阅Official Doc

参考#4,NVD数据库对于无key的匿名访问限制每30秒最多5次,而使用API可以在30秒内访问50次。在该链接处请求一个API key,并执行下面的命令注册到本机上:

python3 main.py register nvd [yourKey]

[!caution] 本项目暂时明文存储token在.env,因此需要确保本地运行环境安全可信,以避免不必要的token泄漏。未来可能用某种方法加密存储credentials。

Get GitHub Token

[!tip] 关于GitHub提供的API更多信息,请参阅Official Doc。本项目的GitHub REST API基于当前最新的版本2022-11-28

GitHub的API需要提供Personal Access Token进行验证。请参考Official Doc生成个人使用的PAT以使用GitHub API。在token的作用域选择上,为保证token的最小权限,不需要选择任何额外的权限,因为本项目只访问公开的repo。

在获取到PAT后,运行下面的指令注册token到本机的环境变量中。Token将保存在.env中。

python3 main.py register github [yourPAT]

[!caution] 本项目暂时明文存储token在.env,因此需要确保本地运行环境安全可信,以避免不必要的token泄漏。未来可能用某种方法加密存储credentials。

Get OpenCVE Account

[!tip] 关于OpenCVE提供的API更多信息,请参阅Official Doc

OpenCVE的API需要通过基于用户名和密码的基本认证。OpenCVE为注册的免费用户提供1000qph的rate limit。在Official register URL注册账号,并通过类似的方法注册用户名和密码到本机的环境变量中。

python3 main.py register opencve [username] [password]

[!caution] 本项目暂时明文存储账户和密码在.env,因此需要确保本地运行环境安全可信,建议使用随机生成的密码和不重要的用户名。

Usage

TBD

TODO

目前支持的重定向URL

  1. Linux kernel git
  2. QEMU git
  3. FFmpeg

添加自定义parser的方法

parsers.py中创建一个BaseParser对象,并填入所有合法的regex pattern,随后调用register_parser手动注册。示例如下:

linux_parser = BaseParser("linux", "torvalds", "linux", [
                          r'http:\/\/git\.kernel\.org\/cgit\/linux\/kernel\/git\/torvalds\/linux\.git\/commit\/\?id=[0-9a-f]{40}', r'http:\/\/git\.kernel\.org\/\?p=linux\/kernel\/git\/torvalds\/linux-2\.6\.git;a=commit;h=[0-9a-f]{40}'])
register_parser("linux")(linux_parser)

[!tip] 目前支持的URL先决条件:最后应当以xx=[commit SHA]结尾。如果需要添加其他类型的pattern,应当在BaseParser基础上重写parse方法,并添加注册用装饰器@register_parser(name='ParserTwo')