{ "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": 6, "id": "ff06696a-18c2-4c59-9cae-bc0dd8b7b308", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2023-03-30 19:45:42 +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": 7, "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": 10, "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": 11, "id": "50f24f67-75e2-4d85-bf23-47182cbf46f3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "60619173" ] }, "execution_count": 11, "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": 14, "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": 18, "id": "8b59663f", "metadata": {}, "outputs": [], "source": [ "with open(file_name[:-2], 'wb') as file:\n", " file.write(uncompressed_data)" ] }, { "cell_type": "code", "execution_count": 19, "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": 20, "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", "268000 CVE-2023-29055 2023\n", "268001 CVE-2023-29056 2023\n", "268002 CVE-2023-29057 2023\n", "268003 CVE-2023-29058 2023\n", "268004 CVE-2023-29059 2023\n", "\n", "[268005 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": 21, "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", "
 yearnumber
119991579
220001243
320011573
420022436
520031603
620042779
720054900
820067256
920076766
1020087325
1120095163
1220105349
1320115339
1420126731
1520137517
16201410546
1720159670
18201611357
19201719567
20201821914
21201921541
22202031262
23202130602
24202233267
25202310720
\n" ], "text/plain": [ "" ] }, "execution_count": 21, "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": 22, "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": 23, "id": "f49c7474-a160-468f-9930-365b66710970", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAApcAAAGmCAYAAAApoq8EAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAABaUElEQVR4nO3deVxN+f8H8NdNqGi1JNUgZWsRym7KkKaQZULWKLJ+jW1GYxkaM+Q7w2CY7whDMsT4ImPJ3oyxNZZsMRNTUrK2UGj9/P7w63ylG+WeW27zej4ePeRzznmd97l1691ZFUIIASIiIiIiGWhVdAFEREREVHmwuSQiIiIi2bC5JCIiIiLZsLkkIiIiItmwuSQiIiIi2bC5JCIiIiLZsLkkokpv5MiRmDNnToWsWwiBUaNGwdjYGG3btq2QGoiIyhObSyIqdw0bNkTdunWRlZUlja1duxaurq4VV5Sa/P777zh06BCSkpIQHR2tdJ6UlBT4+/vDzMwM+vr6aNasGebNm4esrCw0a9YMP/74Y7Flli9fDicnJwCAq6srdHR0ULNmTemjd+/eat0uIqKSsLkkogqRn5+P5cuXV3QZZZafn1+m+W/duoWGDRuiRo0aSqenpqaiQ4cOePbsGU6dOoUnT57g0KFDSE9Px82bN+Hr64uNGzcWWy4sLAy+vr7S/1euXInMzEzp45dffinbhr2FvLw8ta/jXVw3Eb0em0siqhCffPIJvvnmG6SnpxeblpCQAIVCUaSBcHV1xdq1awEAGzZsQKdOnTB16lQYGRnBysoKJ0+exIYNG2BpaYm6desiNDS0SObDhw/h5uYGfX19uLi44NatW9K069evw83NDSYmJmjatCm2bdsmTRs5ciTGjx8PT09P1KhRA8eOHStW7507d+Dl5QUTExNYW1tjzZo1AIB169Zh9OjROHXqFGrWrIl58+YVW3bp0qXQ19fHpk2b0LBhQwCApaUlli9fDgcHBwwfPhy///57kXpjY2Nx6dIlDB48uBSvdFGFr92kSZNgaGiIZs2a4ciRI9L0jIwMaS+qubk55syZIzXUL7/utWrVwvz584tk3717F3p6enj06JE0dv78edSpUwe5ubkAgB9//BHNmzeHsbEx3N3di2zXxx9/DEtLSxgYGKBNmzY4fvy4NG3+/Pnw9vbGsGHDYGBggA0bNpR524mofLC5JKIK4eTkBFdXV3zzzTdvtfyZM2fg4OCAR48eYciQIfDx8cEff/yBGzduYNOmTZg0aRIyMzOl+X/66SfMnTsXDx8+hKOjI4YOHQoAyMrKgpubG4YMGYL79+8jPDwcEyZMQGxsrLTs5s2bMXv2bDx58gSdO3cuVouPjw8sLCxw584dbN++HbNmzcLRo0fh7++PH374AR06dEBmZiaCgoKKLXv48GH0798fWlrKfxxbWFiga9euCAsLk8bCwsLg6emJ2rVrv/Vr17hxYzx8+BBBQUHo378/UlNTAbxoprW1tXHjxg1cuHABBw8elJr6wmWtrKxw7949zJ49u0huvXr14OrqWqQ5DwsLg4+PD6pWrYqIiAgsXLgQO3bswIMHD9ClS5ciDbKzszNiYmKQmpqKIUOGYMCAAXj+/Lk0PSIiAt7e3khPT5e+fkT0DhJEROWsQYMG4tChQ+Ly5cvCwMBA3L9/X6xZs0a4uLgIIYSIj48XAERubq60jIuLi1izZo0QQoj169cLa2tradqlS5cEAHH37l1pzMTERFy4cEEIIYSvr68YNGiQNO3JkydCS0tLJCYmivDwcNG5c+ci9QUEBIj58+dLyw4fPrzEbUlMTBRaWlri8ePH0lhgYKDw9fWVau3UqVOJy1tbW4v//Oc/JU4XQoiwsDDRpEkTIYQQ+fn5wtLSUuzYsUOa7uLiInR1dYWhoaH0MWfOHKVZ69evF2ZmZqKgoEAac3Z2Fhs3bhR3794V1apVE0+fPpWmbd68Wbi6ukrLWlpavrbW8PBw0bFjRyGEEHl5ecLU1FScOXNGCCHEhx9+KNauXSvNm5+fL3R1dUVCQoLSLCMjIxETEyOEEGLevHmiS5cur103Eb0buOeSiCqMnZ0devXqheDg4DIva2pqKn2uq6urdOzlPZeWlpbS5zVr1oSJiQnu3LmDW7du4cyZMzAyMpI+fvrpJ9y9e1fpsq+6c+cOTExMoK+vL401aNAAycnJpdqOWrVqISUl5bXz9O/fHykpKTh9+jSioqLw9OlT9OzZs8g8K1asQHp6uvSxYMGCEvPMzc2hUCiK1Fv4WuTm5sLMzEx6LcaOHYv79+9L877utQCAPn36IDY2FvHx8Th06BAMDQ2lq+Rv3bqFjz/+WMo2MTGBEEJ6rb755hs0b94choaGMDIyQkZGBh4+fFjqdRPRu0G7ogsgon+2oKAgtG7dGtOnT5fGCi9+efr0KQwMDACgSLP3Nm7fvi19npmZidTUVNSvXx+WlpZwcXHBoUOHSlz25UbsVfXr10dqaiqePHkiNZiJiYkwNzcvVV3du3fHzp07MW/evBIPjevp6cHb2xsbN27Es2fP4OPjg2rVqpUqX5nk5GQIIaTtSkxMhJeXFywtLVG9enU8fPgQ2trKfz287rUAAB0dHQwcOBCbNm3C9evXMXz4cGmapaUlZs+erfSQ9vHjx/Hvf/8bR44cga2tLbS0tGBsbAwhRKnXTUTvBu65JKIKZW1tjUGDBmHFihXSWJ06dWBubo5NmzYhPz8fP/74I27evKnSevbt24fff/8dOTk5mDt3Ltq3bw9LS0v06tULf/31F8LCwpCbm4vc3Fz88ccfuHbtWqlyLS0t0bFjR3z22Wd4/vw5Ll26hHXr1mHYsGGlWn7atGl4/PgxfH19pYtbkpOTMW3aNFy6dEmaz9fXF1u3bsV///vfIleJv4379+9jxYoVyM3Nxc8//4xr167B09MTZmZm6NGjB6ZPn47Hjx+joKAAN2/exK+//lqm/BEjRmDDhg3YvXt3keZy3LhxWLRoEa5evQrgxcVDP//8MwDgyZMn0NbWRp06dZCXl4cvvvgCjx8/Vmk7iahisLkkogr3+eefF7nnJQCsWbMGX3/9NWrVqoWrV6+iY8eOKq1jyJAhCAoKgomJCc6dO4dNmzYBAPT19XHw4EGEh4ejfv36qFevHmbOnIns7OxSZ2/ZsgUJCQmoX78++vXrh6CgIHTv3r1Uy5qYmODkyZOoWrUq2rVrB319fXTr1g2GhoawtraW5nv//fdhaGgICwsLODs7F8uZNGlSkftctmnTpsR1tmvXDnFxcahduzZmz56N7du3o1atWgCAjRs3IicnBy1atICxsTG8vb3feNj+VZ06dYKWlhZat26NBg0aSOP9+vXDzJkz4ePjAwMDA9jZ2WH//v0AAHd3d3z44Ydo0qQJGjRoAB0dHR4GJ9JQCvHyMQciIqrUNmzYgLVr1+L3339X63o++OADDBkyBKNHj1breojo3cNzLomISFZ//PEHzp8/j4iIiIouhYgqAA+LExGRbHx9fdG9e3csW7asyBX0RPTPwcPiRERERCQb7rkkIiIiItmwuSQiIiIi2fzjLuipXbs2GjZsWOr5s7KypBs6y02d2cxn/rucr8m1M79y52ty7cyv3PnvWu0JCQlFnqBVRAU+erJCtGnTpkzzHzt2TD2FqDmb+cx/l/M1uXbmV+58Ta6d+ZU7/12r/XX9FA+LExEREZFs2FwSERERkWzYXBIRERGRbP5xF/Qok5ubi6SkJDx//rzYNENDQ1y7dk0t61VndmF+fHw8LCwsULVqVbWth4iIiKgQm0sASUlJ0NfXR8OGDaFQKIpMe/LkidqeMqHObAB4/PgxcnJykJSUhEaNGqltPURERESFeFgcwPPnz1GrVq1ijaWmUygUqFWrltI9skRERETqwOby/1W2xrJQZd0uIiIiejexuXxH3L17Fz4+PmjcuDHatGkDT09PaGlp4c8//ywy35QpU7B48WJERUXB0NAQjo6O0sfhw4crqHoiIiKiF3jOpRINA/fKmpcQ3PO104UQ6NevH3x9fREeHg4AuHjxIp49e4bw8HDMmzcPAFBQUIDt27fjxIkTiI+PR5cuXbBnzx5ZayUiIiJSBfdcvgOOHTuGqlWrYty4cdJYy5YtsWLFCmzdulUa++2339CgQQM0aNCgIsokIiIieiM2l++AK1euoE2bNsXG7e3toaWlhYsXLwIAwsPDMXjwYGn68ePHixwWv3nzZrnVTERERKQMD4u/4wYPHozw8HDY2tpi165dCAoKkqbxsDgRERG9a7jn8h1ga2uLc+fOKZ3m4+ODbdu24fDhw3BwcICpqWk5V0dERERUetxz+Q744IMPMGvWLISEhCAgIAAAcOnSJWRkZKBLly6oXbs2AgMD8fHHH1dwpURERKROJV1UPN0+DyOVTHvTRcMVgXsu3wEKhQI7d+7E4cOH0bhxY9ja2uKzzz5DvXr1ALw4NH79+nX079+/yHKvnnO5ffv2iiifiIiISMI9l0q8/FeAuh/RWKh+/frYtm2b0mlTpkzBlClTioy5uroiIyND7XURERERlQX3XBIRERGRbNhcEhEREZFs2FwSERERkWzYXP4/IURFl6AWlXW7iIiI6N3E5hKAjo4OHj16VOkaMSEEHj16BB0dnYouhYiIiP4heLU4AAsLCyQlJeHBgwfFpj1//lxtzZk6swvzjYyMYGFhobZ1EBEREb2MzSWAqlWrolGjRkqnRUVFoVWrVmpZrzqzyyOfiIiI6FU8LE5EREREsmFzSURERESyYXNJRERERLJhc0lEREREsmFzSURERESyYXNJRERERLJhc0lEREREsuF9LomIiKhSaRi4V+n4dPs8jFQyLSG4p7pL+kfhnksiIiIikg2bSyIiIiKSDZtLIiIiIpINm0siIiIikg2bSyIiIiKSDa8WJyIiIioDXo3+emrbc/n8+XO0bdsWLVu2hK2tLebNmwcAiI+PR7t27WBtbY1BgwYhJycHAJCdnY1BgwbB2toa7dq1Q0JCgpS1aNEiWFtbo2nTpjhw4IA0HhkZiaZNm8La2hrBwcHq2hQiIiIiKiW1NZfVq1fH0aNHcfHiRcTExCAyMhKnT5/GzJkzMXXqVNy4cQPGxsZYt24dAGDdunUwNjbGjRs3MHXqVMycORMAEBsbi/DwcFy9ehWRkZGYMGEC8vPzkZ+fj4kTJ2L//v2IjY3Fli1bEBsbq67NISIiIqJSUFtzqVAoULNmTQBAbm4ucnNzoVAocPToUXh7ewMAfH19sWvXLgBAREQEfH19AQDe3t44cuQIhBCIiIiAj48PqlevjkaNGsHa2hrR0dGIjo6GtbU1rKysUK1aNfj4+CAiIkJdm0NEREREpaDWC3ry8/Ph6OiIunXrws3NDY0bN4aRkRG0tV+c6mlhYYHk5GQAQHJyMiwtLQEA2traMDQ0xKNHj4qMv7xMSeNEREREVHHUekFPlSpVEBMTg/T0dPTr1w/Xr19X5+pKFBISgpCQEABAUlISoqKiSr1sZmZmmeYvC3VmM5/573K+JtfO/Mqdr8m1M/9/ptvnKR031VU+razrVGe+umsviZxf23K5WtzIyAhdu3bFqVOnkJ6ejry8PGhrayMpKQnm5uYAAHNzc9y+fRsWFhbIy8tDRkYGatWqJY0XenmZksZfFRAQgICAAACAk5MTXF1dS117VFRUmeYvC3VmM5/573K+JtfO/Mqdr8m1M/9/lF2xDbxozpZcLt76JAwt2zrVma/u2ksi59dWbYfFHzx4gPT0dADAs2fPcOjQITRv3hxdu3bF9u3bAQChoaHo06cPAMDLywuhoaEAgO3bt+ODDz6AQqGAl5cXwsPDkZ2djfj4eMTFxaFt27ZwdnZGXFwc4uPjkZOTg/DwcHh5ealrc4iIiIioFNS25zIlJQW+vr7Iz89HQUEBBg4ciF69eqFFixbw8fHBnDlz0KpVK/j7+wMA/P39MXz4cFhbW8PExATh4eEAAFtbWwwcOBAtWrSAtrY2Vq1ahSpVqgAAVq5cCXd3d+Tn58PPzw+2trbq2hwiIiIiKgW1NZcODg64cOFCsXErKytER0cXG9fR0cHPP/+sNGv27NmYPXt2sXFPT094enqqXiwRERERyYKPfyQiIiIi2bC5JCIiIiLZsLkkIiIiItmwuSQiIiIi2bC5JCIiIiLZsLkkIiIiItmwuSQiIiIi2bC5JCIiIiLZsLkkIiIiItmwuSQiIiIi2bC5JCIiIiLZsLkkIiIiItmwuSQiIiIi2bC5JCIiIiLZsLkkIiIiItmwuSQiIiIi2bC5JCIiIiLZsLkkIiIiItmwuSQiIiIi2bC5JCIiIiLZsLkkIiIiItmwuSQiIiIi2bC5JCIiIiLZsLkkIiIiItmwuSQiIiIi2bC5JCIiIiLZsLkkIiIiItmwuSQiIiIi2bC5JCIiIiLZsLkkIiIiItmwuSQiIiIi2bC5JCIiIiLZsLkkIiIiItmwuSQiIiIi2bC5JCIiIiLZqK25vH37Nrp27YoWLVrA1tYWy5cvBwDMnz8f5ubmcHR0hKOjI/bt2ycts2jRIlhbW6Np06Y4cOCANB4ZGYmmTZvC2toawcHB0nh8fDzatWsHa2trDBo0CDk5OeraHCIiIiIqBbU1l9ra2liyZAliY2Nx+vRprFq1CrGxsQCAqVOnIiYmBjExMfD09AQAxMbGIjw8HFevXkVkZCQmTJiA/Px85OfnY+LEidi/fz9iY2OxZcsWKWfmzJmYOnUqbty4AWNjY6xbt05dm0NEREREpaC25tLMzAytW7cGAOjr66N58+ZITk4ucf6IiAj4+PigevXqaNSoEaytrREdHY3o6GhYW1vDysoK1apVg4+PDyIiIiCEwNGjR+Ht7Q0A8PX1xa5du9S1OURERERUCuVyzmVCQgIuXLiAdu3aAQBWrlwJBwcH+Pn5IS0tDQCQnJwMS0tLaRkLCwskJyeXOP7o0SMYGRlBW1u7yDgRERERVRyFEEKocwWZmZlwcXHB7Nmz0b9/f9y7dw+1a9eGQqHA3LlzkZKSgh9//BGTJk1C+/btMWzYMACAv78/PDw8ALw453Lt2rUAgLCwMJw5cwbz589H+/btcePGDQAvzvH08PDAlStXitUQEhKCkJAQAEBSUhLCw8PLVH/NmjVVeg0qIpv5zH+X8zW5duZX7nxNrp35/3M5OUPpuKkucO9Z8XF7c8N3Jl/dtZekrK/9jBkzcPbsWaXTtGWpqAS5ubn46KOPMHToUPTv3x8AYGpqKk0fM2YMevXqBQAwNzfH7du3pWlJSUkwNzcHAKXjtWrVQnp6OvLy8qCtrV1k/lcFBAQgICAAAODk5ARXV9dSb0NUVFSZ5i8LdWYzn/nvcr4m1878yp2vybUz/39GBu5VOj7dPg9LLhdvfRKGlm2d6sxXd+0lkfNrq7bD4kII+Pv7o3nz5pg2bZo0npKSIn2+c+dO2NnZAQC8vLwQHh6O7OxsxMfHIy4uDm3btoWzszPi4uIQHx+PnJwchIeHw8vLCwqFAl27dsX27dsBAKGhoejTp4+6NoeIiIiISkFtey5PnDiBsLAw2Nvbw9HREQCwcOFCbNmyBTExMVAoFGjYsCFWr14NALC1tcXAgQPRokULaGtrY9WqVahSpQqAF+douru7Iz8/H35+frC1tQUALF68GD4+PpgzZw5atWoFf39/dW0OEREREZWC2prLzp07Q9npnIW3HlJm9uzZmD17ttJllC1nZWWF6Oho1QolIiIiItnwCT1EREREJBs2l0REREQkGzaXRERERCQbNpdEREREJBs2l0REREQkGzaXRERERCQbNpdEREREJBs2l0REREQkGzaXRERERCQbNpdEREREJBs2l0REREQkGzaXRERERCQbNpdEREREJBs2l0REREQkGzaXRERERCQbNpdEREREJBs2l0REREQkGzaXRERERCQbNpdEREREJBs2l0REREQkGzaXRERERCQbNpdEREREJBvtii6AiIiI3i0NA/cqHZ9un4eRSqYlBPdUd0mkQbjnkoiIiIhkU2Jzef36denz7OzsItNOnz6tvoqIiIiISGOVeFh8yJAhOH/+PACgQ4cO0ucAMGHChCL/JyIiIiotHnav3ErccymEUPq5sv8TEREREQGvaS4VCoXSz5X9n4iIiIgIeM1h8aSkJEyePBlCCOlz4MVey+Tk5HIrkIiIiIg0R4nN5ddffy197uTkVGTaq/8nIiIiIgJe01zq6emhd+/e0NHRKc96iIiIiEiDlXjO5ebNm/Hee+9h+PDh2LdvH/Lz88uzLiIiIiLSQCU2lzt37sSNGzfQvXt3fPfdd7CwsMC4cePw66+/lmd9RERERKRBXvuEHgMDA/j6+mL//v24cuUKWrVq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", "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 }