{ "cells": [ { "cell_type": "markdown", "id": "604150b3-255c-441f-8f67-c95b2f91158e", "metadata": {}, "source": [ "# CVE" ] }, { "cell_type": "markdown", "id": "9688bdc8-ceb9-4fb5-a43b-588a5f108d83", "metadata": {}, "source": [ "**Common Vulnerabilities and Exposures Identifier (CVE ID)** is a unique, alphanumeric identifier assigned by the CVE Program. Each identifier references a specific vulnerability. A CVE ID enables automation and multiple parties to discuss, share, and correlate information about a specific vulnerability, knowing they are referring to the same thing\n", "\n", "> source: [www.cve.org](https://www.cve.org/ResourcesSupport/Glossary?activeTerm=glossaryCVEID)" ] }, { "cell_type": "markdown", "id": "bb012dcd-8476-4501-8ca2-1008a08588e3", "metadata": {}, "source": [ "You can see this notebook directly via:\n", "- [GitHub](https://github.com/LimberDuck/limberduck.org/blob/master/docs/notebooks/cve/cve.ipynb)\n", "- [Jupter nbviewer](https://nbviewer.org/github/LimberDuck/limberduck.org/blob/master/docs/notebooks/cve/cve.ipynb)" ] }, { "cell_type": "markdown", "id": "f7c29080-90bd-4e34-bc6f-92511ed31595", "metadata": {}, "source": [ "## Generation time" ] }, { "cell_type": "code", "execution_count": 1, "id": "ff06696a-18c2-4c59-9cae-bc0dd8b7b308", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2024-04-16 05:31:46 +0000\n" ] } ], "source": [ "from datetime import datetime, timezone, timedelta\n", "\n", "timezone_offset = 0.0\n", "tzinfo = timezone(timedelta(hours=timezone_offset))\n", "generation_time = datetime.now(tzinfo).strftime('%Y-%m-%d %H:%M:%S %z')\n", "print(generation_time)" ] }, { "cell_type": "markdown", "id": "f3a4c46a-1ece-4601-9f72-90d64e12f888", "metadata": {}, "source": [ "## Creative Commons" ] }, { "cell_type": "markdown", "id": "33983601-bf85-4ba0-babc-5e3a69bc5ef4", "metadata": {}, "source": [ "This notebook and generated diagrams are released with [Creative Commons liecense (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/deed.en).\n", "\n", "\"CC" ] }, { "cell_type": "code", "execution_count": 2, "id": "17811d3a-f62b-4c35-9bad-75fcdc9e9cf5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "cc.xlarge.png\n", "by.xlarge.png\n" ] } ], "source": [ "import requests\n", "import urllib3\n", "\n", "urllib3.disable_warnings()\n", "\n", "urls = ['https://mirrors.creativecommons.org/presskit/icons/cc.xlarge.png',\n", " 'https://mirrors.creativecommons.org/presskit/icons/by.xlarge.png']\n", "for url in urls:\n", " file_name = url.split(\"/\")[-1:][0]\n", " print(file_name)\n", "\n", " file = requests.get(url, verify=False)\n", " open(file_name, 'wb').write(file.content)" ] }, { "cell_type": "markdown", "id": "f0d55e25-0b30-4377-95cf-20f471fcaf21", "metadata": {}, "source": [ "## CVE data downloading" ] }, { "cell_type": "markdown", "id": "b29a1112-344a-4015-91d1-c1ee0aa63629", "metadata": {}, "source": [ "All CVE IDs are taken from [cve.mitre.org/data/downloads/index.html](https://cve.mitre.org/data/downloads/index.html)" ] }, { "cell_type": "code", "execution_count": 3, "id": "239ee776-f15c-43d4-a8f5-d1ca251f0f37", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "allitems.xml.Z\n" ] } ], "source": [ "url = 'https://cve.mitre.org/data/downloads/allitems.xml.Z'\n", "file_name = url.split(\"/\")[-1:][0]\n", "print(file_name)" ] }, { "cell_type": "code", "execution_count": 4, "id": "50f24f67-75e2-4d85-bf23-47182cbf46f3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "69886215" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import requests\n", "import urllib3\n", "\n", "urllib3.disable_warnings()\n", "\n", "file = requests.get(url, verify=False)\n", "open(file_name, 'wb').write(file.content)" ] }, { "cell_type": "code", "execution_count": 5, "id": "e02dc4ee", "metadata": {}, "outputs": [], "source": [ "import unlzw3\n", "from pathlib import Path\n", "\n", "uncompressed_data = unlzw3.unlzw(Path(file_name))\n" ] }, { "cell_type": "code", "execution_count": 6, "id": "8b59663f", "metadata": {}, "outputs": [], "source": [ "with open(file_name[:-2], 'wb') as file:\n", " file.write(uncompressed_data)" ] }, { "cell_type": "code", "execution_count": 7, "id": "d2ff78a8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "allitems.xml\n" ] } ], "source": [ "import glob\n", "\n", "file_name = glob.glob('*.xml')[-1]\n", "print(file_name)" ] }, { "cell_type": "markdown", "id": "cb262f32-6398-44c9-a365-d5e1b47dfcd8", "metadata": {}, "source": [ "## CVE data parsing" ] }, { "cell_type": "code", "execution_count": 8, "id": "69608e9f-cbad-40db-85f2-48d25d1aa381", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " number year\n", "0 CVE-1999-0001 1999\n", "1 CVE-1999-0002 1999\n", "2 CVE-1999-0003 1999\n", "3 CVE-1999-0004 1999\n", "4 CVE-1999-0005 1999\n", "... ... ...\n", "311256 CVE-2024-30266 2024\n", "311257 CVE-2024-30267 2024\n", "311258 CVE-2024-30268 2024\n", "311259 CVE-2024-30269 2024\n", "311260 CVE-2024-30270 2024\n", "\n", "[311261 rows x 2 columns]\n" ] } ], "source": [ "import pandas as pd \n", "import xml.etree.ElementTree as et \n", "\n", "tree = et.parse(file_name)\n", "root = tree.getroot()\n", "df_cols = [\"number\", \"year\"]\n", "rows = []\n", "\n", "for item in root:\n", " item_name = item.attrib.get(\"name\")\n", " item_year = item_name[4:8]\n", " rows.append({\"number\": item_name, \"year\": item_year})\n", "\n", "df = pd.DataFrame(rows, columns = df_cols)\n", "\n", "print(df)" ] }, { "cell_type": "code", "execution_count": 9, "id": "ecbe6644-37e1-4747-b8cc-3181570bfb1e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 yearnumber
119991579
220001243
320011573
420022436
520031603
620042779
720054901
820067256
920076767
1020087325
1120095164
1220105351
1320115341
1420126739
1520137525
16201410562
1720159706
18201611367
19201719574
20201821931
21201921615
22202031397
23202131034
24202233547
25202339863
26202413083
\n" ], "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = df.groupby(['year'], as_index=False)[['number']].count()\n", "df.reset_index(drop=True, inplace=True)\n", "df.index += 1\n", "\n", "df.style.bar(subset=['number'], color='#FF6200')" ] }, { "cell_type": "markdown", "id": "c8f1485b-5641-4610-92ab-25ffb1493bea", "metadata": {}, "source": [ "## CVE data saving" ] }, { "cell_type": "markdown", "id": "5b3522c7-1d6e-46c0-8400-ea82dbbb645f", "metadata": {}, "source": [ "CSV file is available in GitHub repository, see:\n", "\n", "- [file via GitHub](https://github.com/LimberDuck/limberduck.org/blob/master/docs/notebooks/cve/cve-number-of-entries.csv)\n", "- [file directly](https://raw.githubusercontent.com/LimberDuck/limberduck.org/master/docs/notebooks/cve/cve-number-of-entries.csv)" ] }, { "cell_type": "code", "execution_count": 10, "id": "6c1d9ff7-d783-4362-9f8f-336abded29bb", "metadata": {}, "outputs": [], "source": [ "csv_filename = 'cve-number-of-entries.csv'\n", "\n", "df.to_csv(csv_filename, index=False)" ] }, { "cell_type": "markdown", "id": "8142803d-8e8f-4d65-81d1-cf54eeeeacfc", "metadata": {}, "source": [ "## CVE data ploting" ] }, { "cell_type": "markdown", "id": "2ee8dc00-a654-4c99-98fb-9a87fa96d2f0", "metadata": {}, "source": [ "PNG files are available in GitHub repository with two background versions, see: \n", "\n", "- [file via GitHub (white background)](https://github.com/LimberDuck/limberduck.org/blob/master/docs/notebooks/cve/cve-number-of-entries-bg-white.png)\n", "- [file via GitHub (transparent background)](https://github.com/LimberDuck/limberduck.org/blob/master/docs/notebooks/cve/cve-number-of-entries-bg-transparent.png)\n", "- [file directly (white background)](https://raw.githubusercontent.com/LimberDuck/limberduck.org/master/docs/notebooks/cve/cve-number-of-entries-bg-white.png)\n", "- [file directly (transparent background)](https://raw.githubusercontent.com/LimberDuck/limberduck.org/master/docs/notebooks/cve/cve-number-of-entries-bg-transparent.png)" ] }, { "cell_type": "code", "execution_count": 11, "id": "f49c7474-a160-468f-9930-365b66710970", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAApcAAAGmCAYAAAApoq8EAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAABgGElEQVR4nO3deVhV9fr+8fdGnHBAcEQgJxxxwAGH0kQNSVTUIsNMMTFKK1PzJKWmHjsOp+yoaSdJU7QSzWNhDqSllJlK5pCJFhaoEJrKoODEsH5/+HX/REBR9obI+3VdXOJnrXWvZ23Y8LBGk2EYBiIiIiIiFmBT0gWIiIiIyN+HmksRERERsRg1lyIiIiJiMWouRURERMRi1FyKiIiIiMWouRQRERERi1FzKSJ/eyNGjGDKlCklsm7DMHjmmWdwcHCgY8eOJVKDiEhxUnMpIsWufv361KpVi4yMDPPY0qVL8fLyKrmirOS7775j27ZtJCQkEB0dne88SUlJBAUF4eTkRJUqVWjWrBnTpk0jIyODZs2a8eGHH+ZZZsGCBXTo0AEALy8vKlSoQOXKlc0f/fv3t+p2iYgURM2liJSI7OxsFixYUNJl3LXs7Oy7mv/EiRPUr1+fSpUq5Ts9OTmZLl26cPnyZXbv3s3FixfZtm0bqamp/PbbbwQGBrJy5co8y61atYrAwEDz/xctWkR6err544svvri7DbsHWVlZVl/HX3HdInJ7ai5FpET84x//4O233yY1NTXPtPj4eEwmU64GwsvLi6VLlwKwYsUKHnroIcaPH0+1atVo2LAh33//PStWrMDV1ZVatWoRFhaWK/PcuXN4e3tTpUoVunfvzokTJ8zTjh07hre3N46OjjRt2pS1a9eap40YMYLRo0fj6+tLpUqV2LFjR556//jjD/z8/HB0dMTNzY0PPvgAgGXLljFq1Ch2795N5cqVmTZtWp5l33nnHapUqcJHH31E/fr1AXB1dWXBggW0bt2aYcOG8d133+WqNyYmhp9++okhQ4YU4pXO7cZr9+KLL2Jvb0+zZs34+uuvzdPT0tLMe1GdnZ2ZMmWKuaG++XWvXr0606dPz5V9+vRp7OzsOH/+vHls//791KxZk8zMTAA+/PBDmjdvjoODAz4+Prm26+WXX8bV1ZWqVavSvn17du7caZ42ffp0/P39efrpp6latSorVqy4620XkeKh5lJESkSHDh3w8vLi7bffvqfl9+7dS+vWrTl//jxPPfUUAQEB/PDDDxw/fpyPPvqIF198kfT0dPP8H3/8MVOnTuXcuXN4eHgwdOhQADIyMvD29uapp57izz//JDw8nDFjxhATE2Ne9pNPPmHy5MlcvHiRrl275qklICAAFxcX/vjjD9atW8frr7/O9u3bCQoK4v3336dLly6kp6czY8aMPMt+9dVXPPbYY9jY5P/j2MXFhR49erBq1Srz2KpVq/D19aVGjRr3/No1atSIc+fOMWPGDB577DGSk5OB6820ra0tx48f58CBA2zdutXc1N9YtmHDhpw5c4bJkyfnyq1Tpw5eXl65mvNVq1YREBBA2bJliYiIYNasWaxfv56zZ8/SrVu3XA2yp6cnBw8eJDk5maeeeoonnniCK1eumKdHRETg7+9Pamqq+esnIn9BhohIMatXr56xbds24/Dhw0bVqlWNP//80/jggw+M7t27G4ZhGHFxcQZgZGZmmpfp3r278cEHHxiGYRjLly833NzczNN++uknAzBOnz5tHnN0dDQOHDhgGIZhBAYGGk8++aR52sWLFw0bGxvj5MmTRnh4uNG1a9dc9QUHBxvTp083Lzts2LACt+XkyZOGjY2NceHCBfNYSEiIERgYaK71oYceKnB5Nzc347///W+B0w3DMFatWmU0adLEMAzDyM7ONlxdXY3169ebp3fv3t2oWLGiYW9vb/6YMmVKvlnLly83nJycjJycHPOYp6ensXLlSuP06dNGuXLljEuXLpmnffLJJ4aXl5d5WVdX19vWGh4ebjz44IOGYRhGVlaWUbt2bWPv3r2GYRjGo48+aixdutQ8b3Z2tlGxYkUjPj4+36xq1aoZBw8eNAzDMKZNm2Z069bttusWkb8G7bkUkRLTsmVL+vXrx5w5c+562dq1a5s/r1ixYr5jN++5dHV1NX9euXJlHB0d+eOPPzhx4gR79+6lWrVq5o+PP/6Y06dP57vsrf744w8cHR2pUqWKeaxevXokJiYWajuqV69OUlLSbed57LHHSEpKYs+ePURFRXHp0iX69u2ba56FCxeSmppq/pg5c2aBec7OzphMplz13ngtMjMzcXJyMr8Wzz33HH/++ad53tu9FgADBgwgJiaGuLg4tm3bhr29vfkq+RMnTvDyyy+bsx0dHTEMw/xavf322zRv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ssX8nG8RERERkZsVeEHP/Pnz6du3L2vXrqV9+/YA7Nu3j927d7Nx48ZiK1BERERESo8C91w2btyYw4cP0717d+Lj44mPj6d79+789NNPNGnSpDhrFBEREZFS4rZP6ClfvjzPPPNMcdUiIiIiIqXcbZ8tLiIiIiJyN9RcioiIiIjFFNhc9urVC4BJkyYVWzEiIiIiUroVeM5lUlIS33//PRs2bCAgIADDMHJNb9eundWLExEREZHSpcDm8p///CczZ84kISGBCRMm5JpmMpnYvn271YsTERERkdKlwObS398ff39/Zs6cydSpU4uzJhEREREppW57KyKAqVOnsmHDBr799lsAvLy86Nevn9ULExEREZHS545Xi7/22mssWLCAFi1a0KJFCxYsWMDrr79eHLWJiIiISClzxz2XmzZt4uDBg9jYXO9DAwMDadu2LbNmzbJ6cSIiIiJSutyxuQRITU3F0dERgLS0NKsWJCIiIvemfsimfMdfaZXFiHymxc/pa+2S5D50x+bytddeo23btvTo0QPDMPj222+ZM2dOcdQmIiIiIqXMHZvLIUOG4OXlxQ8//ADA3LlzqVOnjtULExERkb8O7RWVwirUYXEnJyf8/PysXYuIiIiIlHJ6triIiIiIWIyaSxERERGxmNs2l9nZ2TRr1qy4ahERERGRUu62zWWZMmVo2rQpJ0+eLK56RERERKQUu+MFPSkpKbi7u9OxY0cqVapkHt+wYYNVCxMRERGR0ueOzeXMmTOLow4RERER+Ru44wU93bt3p379+mRmZtK9e3c8PT1p167dHYNPnTpFjx49aNGiBe7u7ixYsACA5ORkvL29ady4Md7e3qSkpABgGAZjx47Fzc2N1q1bs3//fnNWWFgYjRs3pnHjxoSFhZnHf/zxR1q1aoWbmxtjx47FMIy7fgFERERExHLu2Fx+8MEH+Pv789xzzwGQmJjIwIED7xhsa2vLvHnziImJYc+ePSxevJiYmBjmzJlDr169iI2NpVevXuan/WzZsoXY2FhiY2MJDQ1l9OjRwPVmdMaMGezdu5fo6GhmzJhhbkhHjx7NBx98YF4uMjLyXl8HEREREbGAOzaXixcvZteuXVStWhWAxo0b8+eff94x2MnJybyHs0qVKjRv3pzExEQiIiIIDAwEIDAwkM8//xyAiIgIhg8fjslkonPnzqSmppKU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Mpnw9PQkJiaGyMhImjVrZpWLJocPH87KlSstnvvdd98RHR1Ny5Yt6d27d5Gy9u7dS/PmzalatSqXL19mzpw55vfk66+/jr29/T1nL1y4kEGDBuV6ypyl3Lg1X926dXnkkUf45JNP+P7772nevDnBwcGULVu2SPm///4769evz/W+fOqpp6hatWqRa9f7Mq/iel9a8j2pC3qKwcqVK5kxYwa9e/fG2dkZgISEBLZt28a0adMYPny4Vdb7wAMPcPLkyXtefu3atYwbN45atWqRmZnJihUr8PT0BKBdu3bs37//nrOXLFnCnDlzMAyDSZMmsWLFClq2bMl3333Hq6++SlBQ0D1njx07Ntf/DcNg1apV5td54cKF95w9cOBAPv/8cwAiIiIYN24cXl5efP/997z22muMGDHinrNbtmxJdHQ0dnZ2TJo0id9++42BAweyfft2AD788MN7yq1YsSKVKlWiT58+DBkyBB8fH8qUKXPPdd5s3LhxREdHk5WVhY+PD19//TV9+vThm2++oW3btrz11lv3nL127VrefvttWrduzY4dO3jwwQfJycnh8OHDfPzxx7Rq1eqes+fOncvq1asJCAjAxcUFuP6eDA8PJyAggJCQkHvOvp2ivicXLlzI4sWLad68OQcPHmTBggUMGDAAKPp7csaMGWzZsoWsrCy8vb3Zu3cvPXr0YNu2bfj4+DB58uR7zr71/sOGYbBjxw569uwJXP8D6F517NiR6OhoAD744AMWL17MoEGD2Lp1K/379y/S19Ld3Z1Dhw5ha2tLcHAwdnZ2+Pv78/XXX3Po0CHWr19/z9n29vZUqlSJRo0aMWTIEJ544gmLPXVl6NChZGVlcenSJapVq0Z6ejqPPfYYX3/9NYZhEBYWds/ZCxcuZOPGjTz88MNs3ryZtm3bUq1aNT777DPee+89vLy87jlb78u8rPW+tOZ78kag/J/t27cbL7zwguHn52cMGjTImDRpkhEbG1vk3CZNmhgpKSl5xpOTk43GjRsXKbt///75fvTr18+ws7MrUnabNm2MP/74wzAMw9i7d6/RtGlTY/369YZhGIaHh0eRslu2bGlkZGQY586dMypVqmQkJSUZhnH9NWnTpk2Rsl1cXIyhQ4caYWFhxooVK4wVK1YYNWrUMH9eFDdvd5cuXYzff//dMAzDOHv2rNG6desiZTdv3tz8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pkyZwjvvvMO6des4fvw4586dw9HRETs7u3zXU69ePV555RWSk5PNpxXciyVLlvDHH38watQoOnbsWOD3/JNPPsmUKVOIjo4mNTUVgNatWzNr1ix+++03unXrxpgxY5g+fTpOTk7mhm7kyJHs2bOHhQsX4unpyYEDBwgKCuL555/n8OHDuLq65vojxNvbm1GjRnH8+PE892MDWLNmDWvWrGHAgAF53odJSUnMmjWLMmXKmE/JuHV7li5dyvz58/McFXjuueeYOnUqdnZ25tMzChIaGkpsbCw2NjZUr16dRx55hLFjx5KSksJ//vMfEhISWLhwIe7u7nka/6FDhzJu3Di2bdtGt27dePHFF3n99ddxcnKiSpUqTJs2jWHDhpn3cgOMHz+eMWPGULt2bUaMGEGzZs3YvXs3AwcOBGDSpEm89NJL1K5dm/r16zNo0CAWL17M7Nmz7/j1b9KkCe+88465kb7h6aefJjg4mIoVK9K3b1/S0tIoX778bX9mPfnkk4wdO5avv/76jn/wiNxvvv/+e5ydnenRowdPP/00zZo149ixY8yePZvhw4cTHh7Orl27zKdhWcpDDz3Erl278oxZiq4WF5FSYd68eZw+fZqqVasyderUki5HCik7O5uZM2eSlpZGkyZNGD16dEmXJFKs7O3tuXDhAnv37qVjx47A9XP8n3rqKa5evWo+QrphwwYeeugh8znslSpV4sqVKzz33HPmnRk3bkdUqVIl0tPTC1ynnZ0dly9f5ujRo3lO94HrR0duPRqYnZ2d75GwuLg4GjZsSIUKFXKd6nY7ai5FRERErOTkyZPUq1cvz62ITpw4wc6dOwHo1auX+SLYjIwM862I2rVrh4eHh/mweOXKlcnIyOD48eM0atSowHXeuBVR+fLl85xydsOth9oLagdvrPNu7tGp5lJERETEim7c0PzgwYO0adPmnjJu3C/zbm+iXtDey8I0l4mJibi4uNz1TdTv26vFRURERIrDjXPgO3ToYL5N0N3IzMykadOmAPzzn/8s1DILFy4EoE2bNoU+nH2za9eumdf5xhtv3NWy2nMpIiIiYmUtW7bkyJEjuLq6cuDAAapXr16o5dLS0njwwQeJiYmhXr16xMfHF3qd7u7u5uUOHDiQ6+4Rt16wd/N9LNPS0ujYsSO//vrrXa8TtOdSRERExOoOHDiAq6srp06donHjxnzxxRfmO8vkJzs7m82bN9OkSRNiYmJwcnIy33+7sA4ePMgDDzzAiRMnaNKkCVu3bjUf3v71119zfcD1C32++uormjRpwq+//npP6wTtuRQREREpFpcuXcLb25vdu3djGAbt2rUjMDCQBx980HzP4bNnz/L999+zcuVKfvzxR0wmE506dWLbtm25nkxWWJcvX+aRRx4xr/Ohhx4iMDCQjh07mveenj9/nujoaMLCwsy3KOrUqRNfffXVPa1TzaWIiIhIMTEMg3fffZdZs2bx559/mh+icONhDteuXSMnJweTyUSdOnV47bXXeOGFF/K9TdDdrHP+/PnMnj2bc+fOYRgGZcqUMT844sajqU0mEzVq1CAkJIRx48bd8zrVXIqIiIgUs4sXL7Jp0yYiIiI4cuSI+Rnk1atXp1WrVgwYMIA+ffrkOTeyKNLS0tiwYQNffPEFR48eNT/8wsHBgRYtWtC/f3/69++f6yEW90LNpYiIiIhYjC7oERERERGLUXMpIiIiIhaj5lJERERELEbNpYiIiIhYjJpLEREREbEYNZciIiIiYjH/D5LrHijfNNVgAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import datetime\n", "\n", "df = pd.read_csv(csv_filename)\n", "\n", "df.plot(x='year', \n", " xlabel='Year',\n", " y='number', \n", " ylabel='Number of CVE',\n", " kind='bar', \n", " title='Number of CVE per year')\n", "plt.tight_layout()\n", "plt.legend(['CVE'])\n", "plt.figtext(0.15, 0.02, f\"Generated on {generation_time} thanks to limberduck.org based on source: cve.mitre.org\", ha=\"left\", fontsize=7)\n", "fig = plt.gcf()\n", "fig.set_size_inches(10,6)\n", "fig.patch.set_facecolor('white')\n", "plt.grid(True)\n", "\n", "img_cc = plt.imread('cc.xlarge.png')\n", "newax_cc = fig.add_axes([0.88, 0.0, 0.05, 0.05], anchor='NE', zorder=-1)\n", "newax_cc.imshow(img_cc)\n", "newax_cc.axis('off')\n", "img_by = plt.imread('by.xlarge.png')\n", "newax_by = fig.add_axes([0.92, 0.0, 0.05, 0.05], anchor='NE', zorder=-1)\n", "newax_by.imshow(img_by)\n", "newax_by.axis('off')\n", "\n", "plt.savefig('cve-number-of-entries-bg-white.png', dpi = 300, facecolor = 'white')\n", "plt.savefig('cve-number-of-entries-bg-transparent.png', dpi = 300, transparent = True)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.5" } }, "nbformat": 4, "nbformat_minor": 5 }