当前位置: 首页 > 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.rkmt.cn/news/1501842.html

相关文章:

  • 计算机毕业设计之django基于计算机专业的考研志愿填报模拟系统
  • 终极倒计时解决方案:jQuery.countdown完整使用指南
  • STM32F103C8T6驱动TM1616数码管模块:从硬件连接到完整代码移植(附避坑点)
  • 正规的佛山老酒回收推荐:2026年本地市场格局与服务机构分析 - 优质品牌商家
  • 怎样快速掌握macOS Big Sur图标设计:专业设计模板完全指南
  • APA 7th Edition格式生成器:一键解决学术写作格式烦恼的终极方案
  • 2026年 河南检验筛源头厂家推荐:304不锈钢标准筛/实验室检验筛/200检验筛精准之选! - 品牌发掘
  • 别再傻傻分不清了!用Python实战教你选X-Bar-S还是X-Bar-R控制图(附完整代码)
  • ps aux讲解,结合国家超算中心 hpc apptainer
  • Vue3+ECharts大屏项目实战资源包:含12种图表源码、rem适配方案与全流程部署文档
  • JSON差异比较集成指南与工作流自动化
  • 7.5万字长文《置身钉内》出圈:钉钉AI项目ONE为何失败,戳中谁的痛点?
  • Blender四边形重构革命:QRemeshify插件让你的3D模型焕然一新
  • 2026年靠谱的浙江冰袋定制/浙江注水冰袋/浙江冰袋/浙江一次性冰袋精选推荐公司 - 品牌宣传支持者
  • 终极指南:如何在Mac上3步制作Windows启动U盘,轻松绕过硬件限制
  • Outfit字体:为你的品牌穿上最合适的“文字外衣“
  • STM32F405实战:手把手教你用SPI驱动麦歌恩MT6816磁编码器(附完整代码)
  • 告别Quartz!SpringBoot项目实战:将XXL-Job 2.3.1无缝集成到现有系统(含OpenGauss适配与单点登录改造)
  • DABL7689数据采集卡:200元出头的“入门神卡”,还要啥自行车?
  • 钛投标:全流程企业级AI标书解决方案,重构投标数字化生产力
  • 007、GPIO工程陷阱:浮空输入、漏电流、电平转换与PCB布局注意事项
  • 别再死记硬背了!用Verilog写移位寄存器,这3个实战场景帮你彻底搞懂
  • [智能体-348]:CaaS:大模型是企业数字化决策者;智能体是企业的数值化管理者和员工;工具是企业传统的数字化工具;智能体框架是企业的流程和制度框架。他们共同组建了AI原生的数字化公司
  • 如何三步解密Navicat数据库连接密码的完整解决方案
  • 怎么辨别正宗那曲虫草?
  • CANoe CAPL DLL进阶:从Demo到实战,如何封装自定义加密算法(以MD5为例)
  • 收藏!何小鹏160万年薪回母校抢AI人才,小白程序员抓住AI风口,改变命运的机遇就在眼前!
  • 别再用万年历了!手把手教你用STM32F103的RTC实现一个精准的Unix时间戳时钟
  • 分子图与LLM高效对齐:EDT-Former动态令牌技术解析
  • 大模型时代,小白也能抓住高薪机遇?收藏这份程序员跳槽指南!