当前位置: 首页 > news >正文

从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小时。最关键的是,它帮助我们建立了一个系统化的漏洞管理流程,而不是依赖人工记忆和临时处理。

http://www.jsqmd.com/news/990095/

相关文章:

  • 计算机毕业设计之django基于计算机专业的考研志愿填报模拟系统
  • 华硕笔记本性能优化指南:5个技巧告别奥创中心卡顿
  • C#写的30个PPT式图片切换动画源码,拉幕旋转分块淡入全都有
  • STM32F103C8T6驱动TM1616数码管模块:从硬件连接到完整代码移植(附避坑点)
  • FPGA做FFT时,你的输入数据格式对了吗?手把手解决锯齿波分析的实部虚部拼接问题
  • 抖音无水印下载神器:批量保存视频、直播、音乐的全能解决方案
  • 正规的佛山老酒回收推荐:2026年本地市场格局与服务机构分析 - 优质品牌商家
  • 苹果CMS V10站长专用:萌芽采集Pro插件v10.7.3一键部署包(含后台入口+配置说明)
  • 2026免费抠图软件保姆级教程:电脑手机在线无水印,一篇搞定
  • 终极倒计时解决方案:jQuery.countdown完整使用指南
  • APA 7th Edition格式生成器:一键解决学术写作格式烦恼的终极方案
  • 怎样快速掌握macOS Big Sur图标设计:专业设计模板完全指南
  • 2026年 河南检验筛源头厂家推荐:304不锈钢标准筛/实验室检验筛/200检验筛精准之选! - 品牌发掘
  • VC++ 6.0环境下可直接编译运行的MD5哈希计算工具完整源码工程
  • 快速定位Windows热键冲突的终极解决方案:Hotkey Detective完全指南
  • 别再傻傻分不清了!用Python实战教你选X-Bar-S还是X-Bar-R控制图(附完整代码)
  • 告别数组模拟!用uthash在C语言里玩转结构体当Key的哈希表(附LeetCode实战)
  • ps aux讲解,结合国家超算中心 hpc apptainer
  • 如何实现B站UP主动态与直播的实时监控推送:终极自动化解决方案
  • AI专著写作高效秘诀:选对工具,20万字专著轻松生成!
  • 杀戮尖塔2Mod下载(皮肤+美化+功能)2026最新版
  • 企业级监控告警架构:Thanos与Alertmanager的深度集成实践
  • Vue3+ECharts大屏项目实战资源包:含12种图表源码、rem适配方案与全流程部署文档
  • JSON差异比较集成指南与工作流自动化
  • 【模型架构篇06】GPT系列架构演进:从GPT-1到GPT-5
  • 7.5万字长文《置身钉内》出圈:钉钉AI项目ONE为何失败,戳中谁的痛点?
  • 期货量化薄盘口假突破怎么过滤:天勤 quote 五档量与点差阈值
  • Blender四边形重构革命:QRemeshify插件让你的3D模型焕然一新
  • 手把手教你为山景BP1048芯片实现OTA升级(附完整代码解析与避坑指南)
  • 2026年靠谱的浙江冰袋定制/浙江注水冰袋/浙江冰袋/浙江一次性冰袋精选推荐公司 - 品牌宣传支持者