Загрузка данных


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}")