{ "cells": [ { "cell_type": "markdown", "id": "4f034c95-5954-4aac-ac6e-6daf4348aab1", "metadata": {}, "source": [ "# CWE" ] }, { "cell_type": "markdown", "id": "166bea8a-75cf-4c87-8c88-eccac6c2efb4", "metadata": {}, "source": [ "**Common Weakness Enumeration (CWE™)** is a formal list or dictionary of common software and hardware weaknesses that can occur in architecture, design, code, or implementation that can lead to exploitable security vulnerabilities. CWE was created to serve as a common language for describing security weaknesses; serve as a standard measuring stick for security tools targeting these weaknesses; and to provide a common baseline standard for weakness identification, mitigation, and prevention efforts. “Weaknesses” are flaws, faults, bugs, and other errors in software and hardware design, architecture, code, or implementation that if left unaddressed could result in systems and networks, and hardware being vulnerable to attack\n", "\n", "> source: [cwe.mitre.org](https://cwe.mitre.org/about/faq.html#what_is_cwe_weakness_meaning)" ] }, { "cell_type": "markdown", "id": "565d190c-11e6-42c0-b9b0-1560e440fa3f", "metadata": {}, "source": [ "You can see this notebook directly via:\n", "- [GitHub](https://github.com/LimberDuck/limberduck.org/blob/master/docs/notebooks/cwe/cwe.ipynb)\n", "- [Jupter nbviewer](https://nbviewer.org/github/LimberDuck/limberduck.org/blob/master/docs/notebooks/cwe/cwe.ipynb)" ] }, { "cell_type": "markdown", "id": "976eafb3-02cb-4ad9-a716-70783e9a6434", "metadata": {}, "source": [ "## Generation time" ] }, { "cell_type": "code", "execution_count": 1, "id": "3cd59ed4-798a-4aae-b84a-56ad8a520c24", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2024-04-16 05:36:38 +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": "11ed7cf0-c8eb-4300-b084-4b7d18713ea9", "metadata": {}, "source": [ "## Creative Commons" ] }, { "cell_type": "markdown", "id": "02463631-dbdc-4d1b-9339-ad2f78729669", "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": "a360acfb-784e-41f6-a41d-59147352a07d", "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": "c2876bbe-8f68-44d3-a2b6-87b074a652fa", "metadata": {}, "source": [ "## CWE data downloading" ] }, { "cell_type": "markdown", "id": "1a8deaba-c660-4760-80fa-c5b239d8b654", "metadata": {}, "source": [ "All CWE IDs are taken from [cwe.mitre.org/data/downloads.html](https://cwe.mitre.org/data/downloads.html)" ] }, { "cell_type": "code", "execution_count": 3, "id": "1e8428da-eb78-4d60-be57-59bee6a7d5a4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "cwec_latest.xml.zip\n" ] } ], "source": [ "url = 'https://cwe.mitre.org/data/xml/cwec_latest.xml.zip'\n", "file_name = url.split(\"/\")[-1:][0]\n", "print(file_name)" ] }, { "cell_type": "code", "execution_count": 4, "id": "03ab49bf-14af-4668-ab9a-074e7775d304", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1720673" ] }, "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": "27240ec4-b81a-474e-ba33-ae4b3b4997bf", "metadata": {}, "outputs": [], "source": [ "import zipfile\n", "\n", "with zipfile.ZipFile(file_name, 'r') as zip_ref:\n", " zip_ref.extractall()" ] }, { "cell_type": "code", "execution_count": 13, "id": "ae4022a9-c4bf-40a5-9edc-1af6cb330341", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "cwec_v4.14.xml\n" ] } ], "source": [ "import glob\n", "\n", "file_name = glob.glob('*.xml')[-1]\n", "print(file_name)" ] }, { "cell_type": "markdown", "id": "f43928f0-26fc-4351-af46-f9abbba8f35c", "metadata": {}, "source": [ "## CWE data parsing" ] }, { "cell_type": "markdown", "id": "a3dc57d6", "metadata": {}, "source": [ "Updated to pars ``cwec_v4.14.xml``." ] }, { "cell_type": "code", "execution_count": 16, "id": "e1088dbd-1b57-4057-8d90-0278a7405013", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " number year\n", "0 1004 2017\n", "1 1007 2017\n", "2 102 2006\n", "3 1021 2017\n", "4 1022 2017\n", ".. ... ...\n", "958 95 2006\n", "959 96 2006\n", "960 97 2006\n", "961 98 2006\n", "962 99 2006\n", "\n", "[963 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", "if root.findall('{http://cwe.mitre.org/cwe-7}Weaknesses'):\n", " weeknesses = root.find('{http://cwe.mitre.org/cwe-7}Weaknesses')\n", " for weekness in weeknesses:\n", " weekness_id = weekness.get(\"ID\")\n", " weekness_content_history = weekness.find(\"{http://cwe.mitre.org/cwe-7}Content_History\")\n", " weekness_content_submission = weekness_content_history.find(\"{http://cwe.mitre.org/cwe-7}Submission\")\n", " weekness_content_submission_date = weekness_content_submission.find(\"{http://cwe.mitre.org/cwe-7}Submission_Date\").text\n", " weekness_content_submission_year = weekness_content_submission_date[0:4]\n", " \n", " rows.append({\"number\": weekness_id, \"year\": weekness_content_submission_year})\n", "\n", "df = pd.DataFrame(rows, columns = df_cols)\n", "\n", "print(df)" ] }, { "cell_type": "code", "execution_count": 17, "id": "a587e39c-fe69-4ece-ba2f-2b9d7bf32970", "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", "
 yearnumber
12006533
2200727
3200867
4200944
5201020
6201111
720125
8201314
920145
1020174
11201894
12201921
13202095
1420219
1520228
1620236
\n" ], "text/plain": [ "" ] }, "execution_count": 17, "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": "dbacf815-d8f7-46c4-90e6-a522138c654d", "metadata": {}, "source": [ "## CWE data saving" ] }, { "cell_type": "markdown", "id": "5878b673-ebef-4b6d-8ee6-a9b4bdccb726", "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/cwe/cwe-number-of-entries.csv)\n", "- [file directly](https://raw.githubusercontent.com/LimberDuck/limberduck.org/master/docs/notebooks/cwe/cwe-number-of-entries.csv)" ] }, { "cell_type": "code", "execution_count": 18, "id": "2492fb0a-724e-4957-9998-12c13b1ff847", "metadata": {}, "outputs": [], "source": [ "csv_filename = 'cwe-number-of-entries.csv'\n", "\n", "df.to_csv(csv_filename, index=False)" ] }, { "cell_type": "markdown", "id": "1f81d1a1-4974-4012-8712-25121a5928f1", "metadata": {}, "source": [ "## CWE data ploting" ] }, { "cell_type": "markdown", "id": "c9033a24-120b-49e8-819c-1624d7d22dca", "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/cwe/cwe-number-of-entries-bg-white.png)\n", "- [file via GitHub (transparent background)](https://github.com/LimberDuck/limberduck.org/blob/master/docs/notebooks/cwe/cwe-number-of-entries-bg-transparent.png)\n", "- [file directly (white background)](https://raw.githubusercontent.com/LimberDuck/limberduck.org/master/docs/notebooks/cwe/cwe-number-of-entries-bg-white.png)\n", "- [file directly (transparent background)](https://raw.githubusercontent.com/LimberDuck/limberduck.org/master/docs/notebooks/cwe/cwe-number-of-entries-bg-transparent.png)" ] }, { "cell_type": "code", "execution_count": 19, "id": "b7ca5ffc-ec65-409f-a276-6e1d8cb9713d", "metadata": {}, "outputs": [ { "data": { "image/png": "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lStXsr038O7XV7FiRSUmJurKlSs6d+6cVq5cqW+++cb+eGJiojp06JDhtBkJDAzUhx9+qGeffVaff/65fbmeO3dOiYmJaYp3SkqK/fkuXryoUaNGaceOHYqNjVVKSorc3d0zzQ3gn4s9nwBMNXnyZH3yySeKjIy0D0u9OOfGjRv2YX/88cffmk94eLj9+7i4OF29elUVKlSQj4+P2rdvr+joaPtXXFycPvzwQ/v4Npst0+etUKGCrl69qtjYWPuw8+fPy8vLK1u5HnroIX399dd/ebFOu3btdPjwYa1fv15t27aVJNWuXVvh4eFav369mjZtmm6P7L24e9mcP39eBQsWVJkyZeTj46OBAwemWTbx8fEKDg62j/9Xy0aSevXqpSNHjujYsWNat26d/XQHHx8fFS5cWFeuXLE/9/Xr13X8+HFJ0muvvSabzaajR4/q+vXr+vzzz2UYRprnzmreAP4ZKJ8ATOXr66snn3xS77//vn1Y2bJl5eXlpc8//1zJycn69NNP9euvv/6t+WzYsEE//PCDbt++rYkTJ6pFixby8fFR9+7d9csvv2jJkiVKTExUYmKifvzxx788TH03Hx8ftWrVSuPHj9etW7d05MgRLViwQAMGDMjW9GPGjNH169cVGBhovwgqMjJSY8aM0ZEjRyTdWUblypXTnDlz7OXTZrOpefPmmjNnzt8631OSPv/8c504cUI3btzQG2+8oYCAABUoUEADBgzQN998o2+//VbJycm6deuWQkNDFRERke3ndnFxUUBAgPr3769mzZrpgQcekHTnkHznzp318ssv6/r160pJSdGvv/5qP7QeGxsrNzc3lShRQpGRkZo+ffrfeo0ArIvyCcB0b7zxRpp7fkrSJ598ounTp6t06dI6fvy4WrVq9bfm0b9/f02ePFmlSpXSgQMH9Pnnn0uSihUrpu+++07Lli1ThQoVVL58eY0bN04JCQnZfu6lS5cqLCxMFSpU0GOPPabJkyfroYceyta0pUqV0q5du1SwYEE1b95cxYoVU6dOnVSiRAn5+vrax2vXrp0uX76s1q1b24e1bdtWly5dyrB8lixZMs19PmfNmpVphoEDB2rw4MEqX768bt26Zf9HwMfHR2vWrNE777yjsmXLysfHR9OnT7/nWyoFBgbq6NGjaU5lkO5c6HT79m3VqlVL7u7uCggIsJ+C8Oab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pgUEAABA/pHpns+qVavq6NGjat++vcLCwhQWFqb27dvryJEjfNQmAAAAciTTPZ+SVLhwYT399NM5euJbt26pXbt2SkhIUFJSkgICAjR58mT99ttv6tu3r6KiotS4cWMtWbJEhQoVUkJCggYNGqQDBw6odOnSWr58uSpVqpSjeQMAAMCaMt3z+XcVLlxYW7du1eHDh3Xo0CFt2rRJe/bs0bhx4zR69GidOXNG7u7uWrBggSRpwYIFcnd315kzZzR69GiNGzcur6IBAADAQfKsfNpsNrm5uUm6c3V8YmKibDabtm7dqoCAAElSYGCgVq9eLUlas2aNAgMDJUkBAQH6/vvvZRhGXsUDAACAA2RaPjt16iRJf2sPZHJysho0aCAPDw/5+/urSpUqKlmypJyd7xzt9/b2VmRkpCQpMjJSPj4+kiRnZ2eVKFEiw5vcAwAA4J/LZmSye7FWrVqaP3++hgwZoi+//DLdXshGjRpleybR0dF67LHHNGXKFA0ePFhnzpyRJIWHh6tLly46duyY6tSpo02bNsnb21uSVKVKFe3du1dlypRJ81whISEKCQmRJEVERGjZsmVZzv9oZEyW45QrIl28mfVrqetVIuuRcllcXJx9L7LVWDWbVXNJ1s1m1VwS2XLCqrkk62azai6JbDlh1VySdbPldq6xY8dq//796YZnesHRv/71L02ZMkUREREaM2ZMmsdSD59nV8mSJdWhQwft3r1b0dHRSkpKkrOzsyIiIuTl5SVJ8vLyUnh4uLy9vZWUlKSYmBiVLl063XMFBQUpKChIktSkSRP5+fllOf/BweuzHOflukmaefQvr7+SJIU9lfX8cltoaGi2XqcjWDWbVXNJ1s1m1VwS2XLCqrkk62azai6JbDlh1VySdbOZlSvTw+4BAQHauHGjXn31VW3bti3NV3aK5+XLlxUdHS1JunnzpjZv3qyaNWuqQ4cOWrVqlSRp0aJF6tmzpySpR48eWrRokSRp1apV6tixo2w22999fQAAALCQLHf1TZw4UWvXrtX27dslSX5+furevXuWT3zhwgUFBgYqOTlZKSkp6tOnj7p3765atWqpb9++mjBhgho2bKghQ4ZIkoYMGaKBAwfK19dXpUqVytbhdAAAAPyzZFk+x48fr3379umpp56SJM2ZM0e7du3SO++885fT1atXTwcPHkw3vHLlytq3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o7Fs2bJcma9hGEZycrL9+8DAwHTvj4zk5P1+93xy4/nMeK578VevzxE+/PBD48yZMxm+F3KSNaNtI4C/x93d3ZBk7Nu3zz7su+++M4oWLWrYbDajUKFChouLi7F8+XIjMTHRqFy5siHJKFKkiOHk5GQEBATYpzt48KAhyShRokSm8ytatKghKdO/D5Iy/MrIiRMnDEmGq6trtl9vzm7QZDGffPKJunTpoi5dukiSkpKSJElvv/22rly5otjYWL333nvq16+f/Pz8dOzYMY0ZM0YVK1bUm2++KcMwVKxYMb311luqXbu2Bg4cqK5du2rFihWKjo5W/fr11bJlS504cUKTJk3S2LFjNWXKFCUkJCg5OVmzZ8/W66+/LsMw9PPPP2vo0KH2bFFRUXrppZdUvHhx1atXT8OGDVPdunU1ePBgHThwQAsWLLBfJdamTRu1adNGktS7d28NGjRIX3/9tVauXKl169bpq6++0sCBA9WrVy9du3ZNY8eOVefOnbV79255enqmWy7nz59XYmKi3n//fb3yyisKDw9X+fLlNX/+fPuyutugQYPS7DY/ePCgdu7cqerVq6d7/gULFig4OFi1a9fWgAED1KFDB7m6uur27duqUKGCJGnx4sXy9vZWx44d9fHHH0uS+vXrJ0maMWOGypUrp4SEBJUvX143btzQ2LFj9e9//1uvvvqqJOm9997TmTNndPnyZQUEBGjAgAF68sknM3wPrFy5Ut26dbP//NFHH2np0qU6ceKEFixYID8/P9WpU0cvvviiBg4cqNu3b2drnNTDDD/88IMuXbqk/v376/bt23rzzTd16NAhTZkyRWXKlNG8efMUFRWlRx55RL169Uq3jlNNnTpVVatWVUJCgkJDQ1WsWDG98847Kly4cLr5HD9+XEeOHNH169c1e/Zs+9WGqeLi4nT58mWFhobqvffeU5UqVVSwYEEVKVJE+/fv18KFCyVJH374oVJSUtSyZUv1799fr7/+epr3brt27fToo4+qVatW+uijj/Tggw/q6NGjkqSAgACtWrVKp06d0rJlyzR69GiNHDlSZcqUUfv27e1ZFi5cqBs3buj555+3Dxs5cqScnZ2VlJSk999/X927d1erVq3UtGlTrVixQh4eHtq9e7fef//9NIeYli5dqm3btsnDw0Pjxo3TlClTdOXKFZUvX17jx49XUFCQihcvbv9d/fPryY3fxdDQUH366acqV66cxowZo3379umbb77RrVu3NGnSJP3www8qU6aMunfvrr59+2rZsmVq3bq1Hn30UXXs2FHz589XsWLFVLduXT322GPptjOBgYFatGiRPdu5c+c0YcIEeXh46LHHHtOnn36qBQsWqHPnznrzzTe1Z88ePfTQQ/r555+1Z88eXb9+XS+++KIaNGhgz5vZe+CPP/7QzZs307y3pk6dal8X+/btS7OdTD3va8+ePfr3v/8tSRoxYoRu3bql6dOnq3Xr1mrdurXmz5+vatWq6fDhw1q1alWGv5cAsif1RvFNmza1D+vcubMkaefOnSpbtqweeughxcfHq0WLFjp79qxmzpypJ554Qu+++26ai4FStwsxMTGZzu/GjRuSlOPD+3dLPWQfHx+f7WnyxQVHx48fV9OmTZWSkqKXXnpJL7zwgk6ePKnt27erRIkSKliwoE6ePCnpzgm0L7/8stavX68vv/xSN2/elLu7u86ePWsvTsHBwapataqSkpJUqlQprVixQnXq1FGtWrU0adIk7dixQ2FhYSpZsqTi4uIUERGhP/74Q9OmTVPLli3TZFu6dKmeeeYZzZs3T1u2bJEkeXt76+WXX1bLli116NChdK9n+vTpevrppyXJvhu9YsWKioiIsI/z1ltv6fnnn9fNmze1dOlSBQYGpnueyMhI+y73Bx54QBEREZoxY4ZGjhyZ6W0b7vbzzz+rZs2amjZtmtavX6+bN2/aH4uIiJCPj4+cnP73Fvr+++/16aefasOGDbp69aoGDRqkjh07SrpTqgICAuy/FAcOHNC4ceP0zDPPaPbs2SpatKj9D93t27f1/PPP6/vvv1e1atXUokULLViwQB07dtQjjzySJuPq1as1fPhw7d69W8OHD9e4ceMk3bkdhJOTk325peaVJA8PD0VFRWVrnFRt2rTRiBEj1KZNGyUlJWnixImaPHmy1q9fL2dnZyUkJKhcuXL64osvJGW8jidMmKAmTZqod+/e+vXXX1WvXj299NJL9uL55/l8++23mjdvnoYOHaqlS5f+5bpq3ry5Zs2apZ9++klvvvmm+vfvrx9++EGS1KdPH3344YdavXq1Nm/enOa9GxkZqaJFiyo4OFgxMTHy9/fX22+/LQ8Pjwzn88UXX2jAgAGaOXOmevToIUmaN2+eChYsmKZ4Hjt2TO7u7po1a5ZKly6tY8eOKSUlRa+++qrKly8vb29vvf322xmeZ9S5c2fNnDlTP/74o1JSUpSSkqLixYvrq6++kiT98ccf6tChg/r165fu9eTW72J4eLgqVqyoZ599Vp6enlq8eLHmz5+vt99+Wx999FGGyyZ1OV65ckVNmzbVzJkzNXjw4Ay3M3cXz9Rl+MYbb2jmzJlq06aNatWqpf3796tatWravn27jhw5onr16umDDz5QiRIl5OHhoX379mX7PSClfW+lrgtvb+8Mt5OSNHfuXIWEhCgkJETz5s2TJLVq1UqvvfaaPv74Y82fP1/Dhw/PcFkAyD2tWrVS1apVderUKT399NM6cOCApDt9xsfHR/PmzdOsWbMcnPLe5Is9n7Vr19aPP/6oLl26aPbs2QoICFBKSopq166tSZMm2cdzcXGRk5OTChYsqISEBKWkpKhbt272P6KS7Ddn3bBhg2rVqqVBgwapQ4cOkv5XBFNSUtS6dWuNHDlS0p3/LlL3kN1dJKQ7JejPRc/V1VWS7DnuNmvWLJUvX17du3dPM/z8+fPy9vaWYRgKDg5Wly5d1KhRI+3YsUPR0dF66aWXdPjwYe3Zs0cbNmxQYmKinnvuOXthDQ8PV69evXTo0CFdvHhR+/bt08cff6zq1atry5YtGjJkiOrWrZtmnt7e3jp//rykO39YExIS7HuGvL29FRERoeLFi9vHTy2i7u7uunXrVprnSt2r++ijj2rs2LGqXLmyXF1d5e7urtjY2DTjFipUSPPmzdOKFSu0Zs0aXb58WZMnT1a7du0UEBBgL+aS1KtXL/Xq1UuDBw9OUwqcnJyUkpJiX27e3t46fPiwJOny5csqXbp0tsb582tLXRbOzs7281yWLFmiHj16qHnz5urZs2em67hy5co6ceKEHnroIU2cOFGHDx/WK6+8oilTptjPk7l7PqlsNpuMLE7NTl0PpUuXls1my/A8ntQTwu9+70pKc0PiP7+PU/Ok/kebWtjvVqVKFR0/fjzNsLvf96n5U5fbnzNlxmaz6eDBg7LZbJoyZYq9SC1fvlzbtm3T4MGDNXDgwDz5XRw4cKBOnz5t357cnckwDBUuXNh+hCV12aQuxz8vo4y2M3/252n8/Pz09ttva9iwYdq0aZOcnJzk5OSkIkWKpNmm3S2r90BG7+GMtpMZLa/U99/d7xWbzZatf2IB5K3U7dI/6fcxX5TPZ599VmPHjtW6devk7OysJk2aqHbt2nJyctKYMWN08+ZNvfbaa+mmGzBggF544QXt2LFDt2/f1pw5c+yPNWzYUMHBwbpw4YKSk5MlSeXKlVNwcLAmTJigr7/+Wq+88oqio6M1d+5ceXp6aubMmdq5c6d8fX3tz9OvXz+NHj1aX331lb3EZmbt2rX66KOP1LFjR50/f16vv/66evXqpeeee043b97UvHnzNHfuXG3ZskUxMTE6c+aMhg8frrZt20q6szeyRYsWatGihf05CxYsqDFjxqhw4cLy8fHR8uXLJUmDBw/WsGHD5ObmZi+669at06JFi1SkSBG5ubmpffv2Wrp0qcaMGaPy5cun+RSDIUOGKDg4WM7Ozho6dKiuXbumUaNGycXFRaVKlVKFChX02WefycfHRx4eHgoJCVFycrIaN26sAgUK6KWXXtKwYcN0+/ZtTZgwQTdu3NDo0aP18ccfa9y4cbpx44auXbummTNn6vLly5o0aZK+/PJL+8nWWQkKCtLQoUOVmJioadOmydPTU19++aVGjRql+vXrq1ChQtkaJ1XTpk01ffp0PfPMM+nmlXq4eufOnRleDZjqmWee0Z49e/T+++/LxcVFp0+flpOTU5qSe/d8HnroIY0cOVLXrl3Te++9l63XnZHly5dr+fLl6tmzpx5++GENHz48zXs3lb+/v0aNGqXLly8rLCxMkvTwww/rtddeU2JiolxdXfXUU0/ppZde0ubNm+3vu0ceeUROTk4KDg7WCy+8oHnz5undd9/Vxx9/rFdeeUU3b95M849N3bp1NXfuXE2YMEGHDx+Wm5tbmrzffvutDh8+rCZNmsjX11eHDx/WjBkzdPnyZSUmJurll19WkSJFVK1atQxfT278Lq5atUp79uxRdHS0vL29NWDAAA0bNkw3btzQxIkT5ebmpldffVW//faboqOj00zbuXNnPf/88/rll19Ur169DLczAwcO1JIlS+zTjBgxQpMmTZKnp6f9H5kffvhBS5Ys0bfffms/YjBgwAAFBQWpSJEi6tatm2JiYlS4cOE0/wRmJqP3cEbbyffee0/jx4/XCy+8YN+zOWLECN2+fds+3fDhwzV06FBVqlQp3foDkLt27dolLy8vdejQQQMGDFCNGjV06tQpvfvuuxo0aJCWLVumnTt32o8O5YbWrVtr586d6YblFq52B2C6BQsW6PTp07p165Zmz57t6Di4R2fPntWnn36qixcvavDgwbn6Rwm4H5UoUULXr1/X3r171axZM0nS119/rf79+yshIcF+5Hbt2rVq3bq1fH19FRERIVdXV926dUvDhg2znx6TerslV1dXxcXFZTi/okWL6ubNmzp58qRq1KiR7vGUlJR0nxOfnJyc4dG53377TZUrV5aLi0ua0/P+CuUTAADAgc6fP6+KFSumu9XSuXPntGPHDklSp06d7Bf/xsfH22+11KhRIzVo0MB+2N3NzU3x8fE6c+aMqlSpkuH8Um+1VLhw4XSnyaX682H8zOpi6vzu5f6klE8AAAAHS73p+6FDh1S/fv0cPUfq/ULv5Sbzme39zE75jIyMlLe39z3fZD5fXO0OAADwT5Z6S8ImTZrYb4V0LxITE1W9enVJ0r/+9a8sx3///fclSfXr18/24fK73b592z6/N954456mZc8nAACABdSpU0fHjx+Xj4+PDh48mO7+zpmJiYlRq1atdOLECVWsWNF+0WhWateubZ/m4MGDcnd3tz+WejeQVHffxzMmJkbNmjXTL7/8ck/zS8WeTwAAAAs4ePCgfHx8FB4erqpVq+qbb76x33EnI8nJydqwYYOqVaumEydOyNPTM839erNy6NAhPfDAAzp37pyqVaum7777zn74/JdffknzJd25EGnLli2qVq2afvnll3ueXyr2fAIAAFjEjRs35O/vr927d8swDDVq1EiBgYFq1aqVypYtK+nOvah37dqlxYsX68CBA7LZbGrevLk2b958z7c/u3nzph566CH7/Fq3bq3AwEA1a9bMvuc1KipK+/bt06JFi+y3YGrevLm2bNmSo9utUT4BAAAsxDAMzZ07V++8844uXbpk/yCK1HtJ3759WykpKbLZbPaPHn7++eczvBVSduc3e/Zsvfvuu7py5YoMw1CBAgXsH9aR+hHGNptNZcqUUXBwsF566aUcz4/yCQAAYEGxsbFav3691qxZo+PHj9s/A7506dKqW7euevbsqS5duqQ7PzOnYmJitHbtWn3zzTc6efKk/UM03N3dVatWLT366KN69NFHs/XBFn+F8gkAAADTcMERAAAATEP5BAAAgGkonwAAADAN5RMAAACmoXwCAADANJRPAAAAmOb/ARLeV4ilctLCAAAAAElFTkSuQmCC", "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 CWE',\n", " kind='bar', \n", " title='Number of CWE per year')\n", "plt.tight_layout()\n", "plt.legend(['CWE'])\n", "plt.figtext(0.12, 0.02, f\"Generated on {generation_time} thanks to limberduck.org based on source: cwe.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('cwe-number-of-entries-bg-white.png', dpi = 300, facecolor = 'white')\n", "plt.savefig('cwe-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 }