概述:从 RedHat 获取 CVE 数据并保存到 json 文件

来源

主要是看到开源的漏扫工具,基本都用了类似的 API 接口来获取漏洞信息。参考 [【架构】[【架构】CVE扫描工具架构收集|CVE扫描工具架构收集

其中 cve-bin-tool 用了多个平台的数据  - Redhat  - Open Source Vulnerability Database (OSV)  - Gitlab Advisory Database (GAD)](https://advisories.Gitlab.com/),

选哪个平台的数据

我个人只看了 Redhat 平台的获取结果,感觉够用了,并且 Redhat 有一套自己的评分系统。

Redhat

API Documents

Documents

需求描述

从文件读取 CVE 列表,根据 CVE 命从 RedHat 获取相关信息并保存。

实现代码

逻辑比较简单,这里就不赘述了。

import requests
import sys
import json
import os
 
 
def read_CVE_list(filename):
    lines = open(filename, 'r').readlines()
    return [line.strip() for line in lines]
 
def request_CVE_json(cve_list):
    for cve in cve_list:
        # 获取 CVE JSON 并处理
        # 构建 GitHub API URL
        api_url = f'https://access.redhat.com/hydra/rest/securitydata/cve.json?ids={cve}'
 
        # 向 GitHub API 发起 GET 请求
        response = requests.get(api_url)
 
        if response.status_code != 200:
            print(f'Error: Failed to fetch repositories. Status code: {response.status_code}')
            continue
 
        # 解析 JSON 响应并保存到CVE目录下的同名文件中
        # 若 CVE 目录不存在,则创建
        if not os.path.exists('CVE'):
            os.makedirs('CVE')
        data = response.json()
        with open(f'CVE//{cve}.json', 'w') as f:
            json.dump(data, f, indent=2)
        print(f'Successfully fetched and saved {cve} data to {cve}.json')
 
# python main 函数
if __name__ == "__main__":
    # 检查命令行参数的数量  
    if len(sys.argv) < 2:  
        print(f"Usage: python {sys.argv[0]} filename")  
        sys.exit(1) 
 
    print(f"读取cve列表文件{sys.argv[1]}")
 
    filename = sys.argv[1]
 
    # 从文件读取 CVE 列表
    cve_list = read_CVE_list(filename)
 
    #保存到文件
    request_CVE_json(cve_list)