import requests from bs4 import BeautifulSoup def get_cve_details(cve_id): url = f"https://security-tracker.debian.org/tracker/{cve_id}" response = requests.get(url) if response.status_code == 200: return response.text else: return None def check_debian_patch(cve_details, release_names): if not cve_details: return {release: ("vulnerable", None) for release in release_names} soup = BeautifulSoup(cve_details, "html.parser") table = soup.find_all("table")[ 1 ] # The second table contains the status information if not table: return {release: ("vulnerable", None) for release in release_names} results = {release: ("vulnerable", None) for release in release_names} for row in table.find_all("tr")[1:]: # Skip the header row columns = row.find_all("td") if len(columns) > 3: release_name = columns[1].text.strip().lower() for release in release_names: if release in release_name: status = columns[3].text.strip().lower() package_name = columns[0].text.strip() if "fixed" in status or "not vulnerable" in status: results[release] = ("fix", package_name) else: results[release] = ("vulnerable", package_name) return results if __name__ == "__main__": cve_ids = [ "CVE-2023-52425", "CVE-2024-38477", "CVE-2024-38472", "CVE-2024-38475", "CVE-2024-38476", "CVE-2024-38474", "CVE-2024-5171", "CVE-2024-29506", "CVE-2024-29509", "CVE-2022-25883", "CVE-2024-29415", "CVE-2024-28863", "PRISMA-2022-0168", "CVE-2024-6345", "CVE-2023-52425", ] release_names = ["bookworm", "bullseye"] for cve_id in cve_ids: cve_details = get_cve_details(cve_id) patch_statuses = check_debian_patch(cve_details, release_names) for release, (status, package_name) in patch_statuses.items(): print( f"{cve_id} status for Debian {release}: {status}, package: {package_name}" )