import requests
from dataclasses import dataclass
from typing import Optional
TOKEN = ""
CVE_ID = "CVE-2026-54420"
@dataclass
class CveInfo:
cve_id: str
description: Optional[str] = None
base_score: Optional[float] = None
severity: Optional[str] = None
attack_vector: Optional[str] = None
attack_complexity: Optional[str] = None
vector_string: Optional[str] = None
references: list[str] = None
assigner: Optional[str] = None
published: Optional[str] = None
last_modified: Optional[str] = None
affected_products: list[str] = None
def __post_init__(self):
if self.references is None:
self.references = []
if self.affected_products is None:
self.affected_products = []
def fetch_cve(cve_id: str) -> CveInfo:
url = "https://api.vulncheck.com/v3/index/nist-nvd"
headers = {
"Accept": "application/json",
"Authorization": f"Bearer {TOKEN}",
}
params = {"cve": cve_id}
proxies = {
}
r = requests.get(url, headers=headers, params=params, timeout=30, proxies=proxies)
r.raise_for_status()
data = r.json()
item = data["data"][0]
cve = item.get("cve", item)
description = None
desc_data = cve.get("description", {}).get("description_data", [])
for d in desc_data:
if d.get("lang") == "en":
description = d.get("value")
break
impact = item.get("impact", {})
base_metric = impact.get("baseMetricV3", {})
cvss_data = base_metric.get("cvssV3", {})
raw_refs = cve.get("references", {}).get("reference_data", [])
refs = [ref.get("url") for ref in raw_refs if ref.get("url")]
configs = item.get("configurations", {})
nodes = configs.get("nodes", [])
products = set()
for node in nodes:
for match in node.get("cpe_match", []):
cpe = match.get("cpe23Uri", "")
if cpe:
parts = cpe.split(":")
if len(parts) >= 5:
vendor = parts[3]
product = parts[4]
products.add(f"{vendor}/{product}")
return CveInfo(
cve_id=cve_id,
description=description,
base_score=cvss_data.get("baseScore"),
severity=cvss_data.get("baseSeverity"),
attack_vector=cvss_data.get("attackVector"),
attack_complexity=cvss_data.get("attackComplexity"),
vector_string=cvss_data.get("vectorString"),
references=refs,
assigner=cve.get("CVE_data_meta", {}).get("ASSIGNER"),
published=item.get("publishedDate"),
last_modified=item.get("lastModifiedDate"),
affected_products=sorted(products),
)
if __name__ == "__main__":
info = fetch_cve(CVE_ID)
print(f"CVE ID: {info.cve_id}")
print(f"Description: {info.description}")
print(f"CVSS Score: {info.base_score} ({info.severity})")
print(f"Attack Vector: {info.attack_vector}")
print(f"Attack Complexity: {info.attack_complexity}")
print(f"Vector: {info.vector_string}")
print(f"Published: {info.published}")
print(f"Last Modified: {info.last_modified}")
print(f"Affected Products:")
for p in info.affected_products:
print(f" - {p}")
print(f"References:")
for ref in info.references:
print(f" - {ref}")