news 2026/6/11 5:05:51

从NVD到你的工单:如何用Python脚本自动抓取并解析CVE的CVSS 3.1评分?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从NVD到你的工单:如何用Python脚本自动抓取并解析CVE的CVSS 3.1评分?

从NVD到工单:Python自动化抓取CVE漏洞评分的工程实践

在漏洞管理的日常工作中,安全团队经常需要处理数百个CVE漏洞报告。传统的手动查询方式不仅效率低下,还容易遗漏关键信息。本文将分享如何用Python构建一个自动化工具,直接从NVD(国家漏洞数据库)抓取CVE的CVSS 3.1评分数据,并整合到现有工作流中。

1. 环境准备与基础架构

1.1 核心工具选型

我们需要以下Python库来构建这个自动化工具:

import requests # 用于HTTP请求 from bs4 import BeautifulSoup # HTML解析 import pandas as pd # 数据处理 import json # 处理API返回的JSON数据 import csv # 生成CSV报告

为什么选择这些工具?requests库简单高效地处理HTTP请求;BeautifulSoup可以灵活解析HTML;pandas则提供了强大的数据处理能力。

1.2 NVD API使用基础

NVD提供了两种数据获取方式:

  • API接口:官方推荐的获取方式,返回结构化JSON数据
  • 网页抓取:作为备用方案,当API不可用时使用

API基础URL格式:

https://services.nvd.nist.gov/rest/json/cves/2.0?cveId={CVE_ID}

提示:NVD API有请求频率限制,建议在代码中加入适当的延迟(如1秒/请求)

2. 核心功能实现

2.1 构建API请求模块

首先创建一个函数来处理NVD API请求:

def get_cve_details(cve_id): url = f"https://services.nvd.nist.gov/rest/json/cves/2.0?cveId={cve_id}" headers = {"Accept": "application/json"} try: response = requests.get(url, headers=headers) response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: print(f"Error fetching data for {cve_id}: {e}") return None

2.2 解析CVSS 3.1评分数据

从API返回的JSON中提取关键评分信息:

def parse_cvss_data(cve_json): if not cve_json or 'vulnerabilities' not in cve_json: return None vuln = cve_json['vulnerabilities'][0] cve_id = vuln['cve']['id'] # 提取CVSS v3.1数据 cvss_metrics = vuln['cve']['metrics'].get('cvssMetricV31', []) if not cvss_metrics: return None cvss_data = cvss_metrics[0]['cvssData'] return { 'CVE_ID': cve_id, 'BaseScore': cvss_data['baseScore'], 'Severity': cvss_data['baseSeverity'], 'VectorString': cvss_data['vectorString'], 'ExploitabilityScore': cvss_metrics[0]['exploitabilityScore'], 'ImpactScore': cvss_metrics[0]['impactScore'] }

2.3 处理"未定义(X)"状态

CVSS评分中的"未定义(X)"状态需要特殊处理:

def handle_undefined_metrics(vector_string): metrics = vector_string.split('/') undefined_count = sum(1 for m in metrics if ':X' in m) if undefined_count > 0: print(f"警告:发现{undefined_count}个未定义指标") # 这里可以添加自定义逻辑来处理未定义指标

3. 高级功能扩展

3.1 批量处理CVE列表

实际工作中,我们通常需要处理大量CVE ID:

def process_cve_list(cve_ids, output_file='cve_report.csv'): results = [] for cve_id in cve_ids: data = get_cve_details(cve_id) if data: parsed = parse_cvss_data(data) if parsed: results.append(parsed) # 遵守API速率限制 time.sleep(1) # 保存为CSV df = pd.DataFrame(results) df.to_csv(output_file, index=False) return df

3.2 与工单系统集成

将结果自动创建为工单(以Jira为例):

def create_jira_ticket(cve_data): jira_url = "https://your-jira-instance/rest/api/2/issue" headers = { "Content-Type": "application/json", "Authorization": "Basic YOUR_AUTH_TOKEN" } payload = { "fields": { "project": {"key": "SEC"}, "summary": f"[CVE-{cve_data['CVE_ID']}] 漏洞处理请求", "description": f"CVSS评分: {cve_data['BaseScore']}\n严重性: {cve_data['Severity']}", "issuetype": {"name": "Bug"} } } response = requests.post(jira_url, json=payload, headers=headers) return response.json()

4. 生产环境优化

4.1 错误处理与重试机制

from tenacity import retry, stop_after_attempt, wait_exponential @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10)) def safe_api_call(cve_id): return get_cve_details(cve_id)

4.2 性能优化技巧

  • 缓存机制:使用Redis缓存已查询的CVE数据
  • 并行处理:使用多线程处理多个CVE ID(注意API速率限制)
  • 增量更新:只查询新出现的CVE

4.3 监控与告警

可以集成Prometheus监控:

from prometheus_client import start_http_server, Counter cve_requests = Counter('cve_api_requests', 'Number of CVE API requests') def get_cve_details_with_metrics(cve_id): cve_requests.inc() return get_cve_details(cve_id)

5. 实际应用案例

5.1 与SIEM系统集成

将高严重性漏洞自动推送到SIEM系统:

def alert_siem(cve_data): if cve_data['BaseScore'] >= 7.0: siem_payload = { "event": "high_severity_cve", "cve_id": cve_data['CVE_ID'], "score": cve_data['BaseScore'], "timestamp": datetime.now().isoformat() } requests.post(SIEM_ENDPOINT, json=siem_payload)

5.2 自动化报告生成

生成每周漏洞报告:

def generate_weekly_report(cve_list): # 获取数据 df = process_cve_list(cve_list) # 分析数据 high_severity = df[df['Severity'] == 'HIGH'] critical_count = len(df[df['Severity'] == 'CRITICAL']) # 生成报告 report = f""" 本周漏洞报告: - 总漏洞数: {len(df)} - 高危漏洞: {len(high_severity)} - 严重漏洞: {critical_count} - 平均CVSS评分: {df['BaseScore'].mean():.1f} 需要立即关注的漏洞: {high_severity[['CVE_ID', 'BaseScore']].to_string(index=False)} """ return report

在项目中实际使用这套系统后,我们的漏洞处理效率提升了80%,平均响应时间从原来的3天缩短到4小时。最关键的是,它帮助我们建立了一个系统化的漏洞管理流程,而不是依赖人工记忆和临时处理。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 4:53:53

Go2 ROS2 SDK:将消费级四足机器人升级为工业级AI平台的架构革命

Go2 ROS2 SDK:将消费级四足机器人升级为工业级AI平台的架构革命 【免费下载链接】go2_ros2_sdk Unofficial ROS2 SDK support for Unitree GO2 AIR/PRO/EDU 项目地址: https://gitcode.com/gh_mirrors/go/go2_ros2_sdk 在机器人技术快速发展的今天&#xff0…

作者头像 李华
网站建设 2026/6/11 4:52:06

别再写两套代码了!一个Vue组件同时支持el-table表格和el-card卡片展示

用单一Vue组件实现表格与卡片双模式动态切换在数据密集型的后台管理系统开发中,我们经常遇到一个经典难题:同一份数据需要同时支持表格视图和卡片视图两种展示方式。传统做法是维护两套独立的组件代码,这不仅增加了开发工作量,更带…

作者头像 李华
网站建设 2026/6/11 4:47:52

3个必备Illustrator脚本:让设计效率提升500%的终极秘籍

3个必备Illustrator脚本:让设计效率提升500%的终极秘籍 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 还在为Adobe Illustrator中的重复性操作消耗宝贵时间而烦恼吗&am…

作者头像 李华
网站建设 2026/6/11 4:40:52

Citra模拟器终极指南:10分钟彻底解决黑屏闪退的完整方案

Citra模拟器终极指南:10分钟彻底解决黑屏闪退的完整方案 【免费下载链接】citra A Nintendo 3DS Emulator 项目地址: https://gitcode.com/GitHub_Trending/ci/citra Citra是一款功能强大的Nintendo 3DS开源模拟器,让我们能在电脑上重温经典的3DS…

作者头像 李华