{ "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_julio_7/blob/main/docs/notebooks/cwe/cwe.ipynb)\n", "- [Jupyter nbviewer](https://nbviewer.org/github/LimberDuck/limberduck_org_julio_7/blob/main/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": [ "2025-04-05 18:23:26 +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": [ "1779050" ] }, "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": 6, "id": "ae4022a9-c4bf-40a5-9edc-1af6cb330341", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "cwec_v4.17.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": "code", "execution_count": 7, "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", "963 95 2006\n", "964 96 2006\n", "965 97 2006\n", "966 98 2006\n", "967 99 2006\n", "\n", "[968 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": 8, "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", " \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
1520229
1620237
1720242
1820251
\n" ], "text/plain": [ "" ] }, "execution_count": 8, "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_julio_7/blob/main/docs/notebooks/cwe/cwe-number-of-entries.csv)\n", "- [file directly](https://raw.githubusercontent.com/LimberDuck/limberduck_org_julio_7/main/docs/notebooks/cwe/cwe-number-of-entries.csv)" ] }, { "cell_type": "code", "execution_count": 9, "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_julio_7/blob/main/docs/notebooks/cwe/cwe-number-of-entries-bg-white.png)\n", "- [file via GitHub (transparent background)](https://github.com/LimberDuck/limberduck_org_julio_7/blob/main/docs/notebooks/cwe/cwe-number-of-entries-bg-transparent.png)\n", "- [file directly (white background)](https://raw.githubusercontent.com/LimberDuck/limberduck_org_julio_7/main/docs/notebooks/cwe/cwe-number-of-entries-bg-white.png)\n", "- [file directly (transparent background)](https://raw.githubusercontent.com/LimberDuck/limberduck_org_julio_7/main/docs/notebooks/cwe/cwe-number-of-entries-bg-transparent.png)" ] }, { "cell_type": "code", "execution_count": 10, "id": "b7ca5ffc-ec65-409f-a276-6e1d8cb9713d", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7EAAAJTCAYAAADe2JFkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAgLFJREFUeJzt3QmcjfX7//HLvkeWLCWVCu0iVArRghZLC6WNFiJFpSxFskeLIktSshVaqVRSSVrIkqhIyp59353/4/35fe/zP3PMGTNjZs59z7yej8fhzH2263Pf97nPfd2fLVsoFAoZAAAAAAABkD3eAQAAAAAAkFwksQAAAACAwCCJBQAAAAAEBkksAAAAACAwSGIBAAAAAIFBEgsAAAAACAySWAAAAABAYJDEAgAAAAACgyQWAAAAABAYJLEAkAW98sorVqFCBXfr27dvos/xHn/qqacsnn788cdwLIo7iP7880+7++67rXLlynbRRRfZTTfdZFu3bk3yNYcOHbJJkybZXXfdZdWrV7fzzjvPatasaQ899JDNmjUrwXNvvPFGt34qVqxo27dvT/DYCy+8EF5/enzLli0JHu/du3f48dmzZydY38e6rV692oJg3Lhx4ZgbNGjg1m20b775Jvyc2rVr2+7du+MSKwDg2EhiASCLe/vtt+3333+PdxiZWrt27eyHH36wPXv22N69e23VqlVWpEiRmM/ftGmTNW/e3Lp16+aSym3bttnBgwdt48aNNmPGDLvvvvusV69e4edXrVrV/R8KhWzhwoUJ3uv7778P39fjP/30U4LHFyxY4P7PmTOnS7IzI63LCy+80N3/66+/bOzYsQke17qNvJjzzDPPWIECBTI8TgBA8pDEAkAWd/jwYevevbtLcJD2VPP5zz//uPuq5fvss8/snXfesWzZsiX6fCVUqm1dtGiR+/vmm292NbKffPKJ206FCxcOX3x4//33EySxEpnE7tixw3777bcE7x+ZxB44cMCWLl3q7p9zzjmWP3/+BM+95557XA1lrFvp0qUtCLJnz249e/Z0ibq8+uqrtnnz5gQ1tX///be7f+2119pVV10Vt1gBAMdGEgsAcLVxSqyQ9lTz6qlUqZKdfvrpdtZZZ8V8vhJTLxG98847XXPfCy64wMqXL2+33367vfzyy+HnTpkyxf1fpUqVo2pWRbW/R44ccfcLFix4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c6UCAJAa1MQCAAAAAAKDJBYAAAAAEBgksQAAAACAwKBPLAAAAAAgMKiJBQAAAAAEBkksAAAAACAwskwSe+TIEduzZ4/7HwAAAAAQTFkmid23b58tXbrU/Q8AAAAACKYsk8QCAAAAAIKPJBYAAAAAEBgksQAAAACAwCCJBQAAAAAEBkksAAAAACAwSGIBAAAAAIFBEgsAAAAACAySWAAAAABAYJDEAgAAAAACI2e8A0DiXnrpJXv33XctR44c7u/cuXPbjBkzbPLkyfbmm2/ajh07rFKlSta5c2c77bTT3HOSegwAAAAAMgNqYn3qzz//tN69e9usWbPcTQns/PnzbeTIkTZkyBD7+uuv7eKLL7ZevXq55yf1GAAAAABkFtTE+tSyZcvsrLPOSrCscuXK9v7771v+/Plt7969tmvXLitcuPAxHwMAAACAzIIk1oc2bdpk27dvtxdeeMEWLVpkp5xyij322GN2/vnnuyRVNbP6u0CBAjZixIjw65J6DAAAAEA6aJUtYz9vVChVL1N+8dprr9nnn39umzdvtjJlythtt91md911lz333HP2119/2ZgxY8LPV0vPZs2aWePGja1fv37h5R9++KFrMfrDDz9Yly5dXEVaYtq1a2cPP/ywpQeSWB/atm2bValSxe655x7Xt3XatGn26KOP2pQpU6xIkSJWvXp1mz17tuv/2qFDB7fj5MqVy702qccAAAAAZD1bt251CetJJ53kElBVkv36668ueV21apVVrVrVPvroIzty5Ihlz/5/PU5//PFH93z9H2nBggXu+d7z6tevb127dj3qM1XBll7oE+tDZ555prtKcsEFF7gEtFGjRla8eHFbuHBheJAnLW/VqpXt3LnTli9fHn5tUo8BAAAAyHoGDRrk8oRRo0bZpZdeamXLlrUGDRq4hHbcuHFWokQJ1x1xxYoV4dcoeb377rttw4YNLtGNTGKrVasW/jtv3rzu9dE3tQxNLySxPqQdQyMNRzp48KBLSnv06BFepislhw8ftkKFCtnUqVNjPgYAAAAgazpw4IBr2XnHHXdYnjx5EjxWp04d14Lzoosucomtame91/zyyy9Wt25dq1ixoms6LBp7RwPQXnLJJRZPJLE+pKskL7/8sktmDx06ZBMnTnQ70nnnnWdfffWV26GU1A4dOtTOPvtsO/nkk5N8DAAAAEDW9O+//9qePXvc+DrRsmXLZjVq1HD5h5oIazwe0f8nnHCCnX766a67opfEKsnNly+f6/IYT/SJ9aFzzjnHnnzySVezqkGelIxq3ljN+dqzZ083dY76zWpE4gEDBridL6nHAAAAAGRNO3bscP8fq4WmktgJEya4+0pavSbD+v+ZZ55JtD+sfPzxxzZ9+vSj3k+1vxo8Kj2QxPrU9ddf727Rateu7W6JSeoxAAAAAFmPBob1RidOipJTVaKpBaj6w95www3h5RrNWP1ilcRGNyW+6qqr7PHHHz/q/TQoVHqhOTEAAAAAZFKnnnqqq4X97bffEn28TZs29v3337uWnUp41WRYA8p6NbF6rfrFKoFVM+PoJFYDOJUrV+6oW86c6VdfShILAAAAAJlUzpw53UjEGoVYtayRNKaObl6tqab51BSdSmaV1HrUL/brr792fWvPPfdcizeaE2eliZJTOTEyAAAAgOB6+OGH7ZZbbnHTcOp+qVKlXJPh559/3u666y43xaeollXT8WhU4kiqle3QoYN7PEeOHAke27dvn23cuPGoz9RgUYULF06X8pDEAgAAAEAmrigqUaKEG7TplVdecf1XNRCsmhm3b9/emjdvHn6e+r+qtlU1r5G0XLW4iU2t8+mnn7pbNM1Hq+l70kO2UCjk/7WeBrQxli5d6oaDzp8/v/kSNbEAAAAAkCT6xAIAAAAAAoMkFgAAAAAQGCSxAAAAAIDAIIkFAAAAAAQGSSwAAAAAIDBIYgEAAAAAgUESCwAAAAAIDJJYAAAAAEBgkMQCAAAAAAKDJBYAAAAAEBgksQAAAACAwCCJBQAAAAAEBkksAAAAACAwSGIBAAAAAIFBEgsAAAAACAySWAAAAABAYJDEAgAAAAACgyQWAAAAABAYJLEAAAAAgMCIexL7xRdfWIUKFRLc2rdv7x5bsmSJ3XLLLXbhhRda06ZNbfHixQleO3XqVKtXr557vG3btrZly5Y4lQIAAAAAkCWS2OXLl1udOnXsu+++C9969eple/bssQceeMCqVq1q7733nlWuXNkefPBBt1wWLVpkXbt2tXbt2tk777xjO3bssM6dO8e7OAAAAACAzJzE/vXXX3b22WdbiRIlwrcTTjjBPvnkE8uTJ4916tTJypcv7xLWAgUK2GeffeZeN3bsWKtfv741atTIKlasaAMGDLBvvvnGVq1aFe8iAQAAAAAycxJ72mmnHbV84cKFVqVKFcuWLZv7W/9ffPHFtmDBgvDjqqX1lC5d2sqUKeOWAwAAAAAyp5zx/PBQKGR///23a0I8fPhwO3z4sF133XWuT+zGjRvtzDPPTPD8YsWK2bJly9z9//77z0466aSjHl+/fn2Sn3nkyBF38xJj3RSHbh5vufe841nulTM5yzPiikKGlyl79qPWb0qX+247USbKRJkoE2WiTJSJMlEmykSZLD3K5MXv2yR27dq1tnfvXsudO7e99NJLtnr1atcfdt++feHlkfT3gQMH3H09J6nHY9m8ebPrPyv58+e3IkWK2Pbt28N9baVQoULutnXrVtu/f394uZ6r12zatMkOHToUXl60aFHLmzevbdiwIcHGVNPoHDlyHJVYlypVyiXsStQ92lilLf1leJlKl3afFznoVs6cOd0FCG3jbdu2hZer+bguROzatct27twZXu677USZKBNlokyUiTJRJspEmSgTZbL0KFOuXLnsWLKFolPuDKaVVbhw4XDGPX36dHviiSesWrVqrq/r448/Hn7u888/75ofDxs2zC666CIbPHiwXXnlleHHNZJxgwYN7N577z3qc7SSly5d6kY/1or05dWR+3NYuhoV4ooPZaJMlIkyUSbKRJkoE2WiTJTJt2Xy4vdtTayXnUfSIE7K3pWFK2OPpL+9JsQlS5ZM9HG9LinaGLolZ2VFPy+1y2NtiORsoLQWjzLFWr9ptZwyUaZYyykTZUpN7JSJMlEmypSa5ZSJMlEmS7My+Xpgp1mzZln16tVd9bVHtaVKbDWo0/z588MZvv7/5Zdf3Jywov/nzZsXft26devczXscAAAAAJD5xDWJ1dyvam/drVs3W7FihZsiR1Pl3HfffW6AJ/Vd7d27t5tLVv8r2dW0OtK8eXP78MMPbdKkSfb777+7qXhq165tZcuWjWeRAAAAAADpKO59YjXacJ8+fdzUOZoHtlmzZta2bVtXPb1o0SLr3r276wervqzPPvusnXPOOeHXvvfee65frDoWX3755fbcc8/ZiSeemOjneH1iK1WqFO4T6zut0rl58ai4bmoAAAAACH4Sm1FIYkliAQAAAARfXJsTAwAAAACQEiSxAAAAAIDAIIkFAAAAAAQGSSwAAAAAIDBIYgEAAAAAgUESCwAAAAAIDJJYAAAAAEBgkMQCAAAAAAKD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Wvv27X05tQ4AAAAAIIslsR9++KFNnjzZOnToYJ06dUrwWMmSJW327NmuNnbixIn26aefplesAAAAAIAsLllJ7IQJE6xZs2b2wAMPWO7cuY96PEeOHNa2bVurX7++jR07Nj3iBAAAAAAgeUns33//bbVr1z7m85TE/vXXX2kRFwAAAAAAqUtiDx8+7Gpbj6VAgQJ28ODB5LwlAAAAAADpk8SedtpptmjRomM+b+HChVamTJmURwEAAAAAQFolsddff72NGTPGVq1aFfM5q1evds+pW7duct4SAAAAAID0SWJvv/12K1WqlN122232xhtv2IoVK+zAgQO2b98+1wd29OjRduutt1qhQoXsnnvuSXkUAAAAAAAkQ7ZQKBRKzhM3b97sptfRdDrZsmVL8Jje4sorr7Rnn33WSpcubX60Z88eW7p0qVWqVMny589vvtQq4XpNc6OStakBAAAAwLdyJveJxYoVs1GjRtnvv/9u3377ra1fv94N9nTyySdbzZo17cwzz0xVAP/884/17NnTfvnlFytcuLC1aNHC7rvvPveYmi8//fTTtmDBAtfXtkuXLu6zPN9//7316dPHPe/CCy+03r17W9myZVMVBwAAAAAgEyWxnooVK7pbWjhy5Iibe/b888+3999/3yW0HTt2tJIlS7p+uJp79uyzz7YpU6bYl19+ae3atbNPPvnEJbRr1651jz/88MN2xRVX2JAhQ+yhhx6yjz766KiaYgAAAABAFk1i09KmTZtc894ePXpYwYIF3SjIl156qc2bN8+KFy/ualgnTpzomv+WL1/e5syZ4xJaJa6TJk2y8847z1q2bOneq2/fvnb55ZfbTz/9ZNWrV49nsQAAAAAA8RzYKb2cdNJJ9tJLL7kEVv1qlbz+/PPPVq1aNTddzznnnJOg/2qVKlVc02LR41WrVg0/li9fPjv33HPDjwMAAAAAMp+41sRGuuqqq1wT4Tp16ti1117r+roqyY3ul6u+uLJx48YkH0+qCbNuombHuimBjhzfylvuPe94lkv02FmxlmfEFYUML1P27Eet35Qu9912okyUiTJRJspEmSgTZaJMlIkyWXqUyYv/uJNYNdFVv1XVdqaXwYMHu+bFalqspsF79+613LlzJ3iO/tbUPnKsx5MaZXnHjh3uvmp5ixQpYtu3b3ejF3s0VZBuW7dutf3794eX67l6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72QjR44c5qfvtNajprPxI23nNWvWuKl29Huq3xg/xvjPP/+4Wli/1nx5vy0nnnii5cqVy3r16uWOkX463uh4rdg2bNhgrVq1shtvvNH8xO+/LfLll1/axx9/bPfdd587B/USWb/sl37/XRF+WzL/70paC3QSmy9fPmvUqJH16NHD+vTpY//995+98cYbbp67rEDJu8o8YcIE9/fChQvtp59+cl+qiy++2Pzg4YcfdiNCK8YXX3zRpkyZ4qZC8tPBXT8+27Ztc1eudIAaNGiQq+FX0lixYkVfDGCmWLypL/QD1Lp1azt48KDddddd7nvgh1psrbOJEye6WLVvdu3a1a3XO++8M97huf1NP4b79u1zV8unTZvmlvlh+0bS+lOyrX1RF3zUyuLDDz+0mjVruu4T8aa4vIsBOtboe60TX+2LSnb8QgmD5gv/9ddfrX379m7+U13w8Uvzr+eee859T3RF36sJ8y5I+WE9arBEDYb47rvvhmcC+OOPP9wx2w/xySOPPGK7du2y9957z3r37m2fffaZS8D89Nvy/vvvh39bdPFR63P37t3uWFm2bNl4h+eOL9rOb775ptsfVdup5EbfkyZNmpgf+P23xVOgQAH7/vvvrUiRIu54qHMwvySyfv9dEX5bMv/vSnqI/695GjQlUhJ79913u6t0SpquueYaywqUHHrNQbTT6st/wQUXuJGZ77jjDnvggQfienVIJxX6/FGjRrm/y5cv75qJSLwP6tEDhHl9qHVg//bbb9261UHqtttus7Zt28Y1Pp1keImqN6VU9erV3UFf+7y2dbzt2LEjPBq4rqKq1l2x6URT/zdu3Diu8Wl/09XSUqVK2eWXX+4uBEydOtU95qdEVidrZ5xxhruvH0Sd6KqZn/r6++FkQycV3vrSOlTTNJ2Uq4l2u3btrHnz5vEO0W1nrSu11FHtoU7MtR++9tprtn///rifaHjf6RIlSrj7ujilROykk05yiaKaxuq4E087d+50NXOiBEfzsZcrV85t5zZt2lizZs3iGp9OcHVy6/22aOBGrzmx335bVPPl9dudNWuWO8lU7bES7nivR8VSunTp8Mm5xqw466yzXEWATn6vv/56ize//7Z4dC5Wp04dd+6gi/Ve6wU/JLKqvfbz74qoAsHvvy06//Lzb8umTZt8/buSLjTFDoJp586doRYtWoTefPPN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p56yAQMGhGs2VaPaokULu+2226xSpUquuXCOHDncY4cPH7adO3fa0qVLbeLEiTZu3DjbunVruOZTieYrr7ySpvE98sgj7j29+JSwKr5mzZrFjO/333938Y0dOzZBfErUhw4dmqbxufcmiQUAAACA9Pfggw/ayJEjwwnifffdZ71797YSJUq4pC8peo1qRp9++mkbMWJEeHnTpk1t8uTJaRLf7bffbhMmTAj/rabLffr0sZNOOilBfF780csU3zPPPGPDhw8PL2/SpIlNmTLF0hJJLAAAAACks549e1r37t3DTXPfffddl+AdK3mNFgqF7OOPP3bJ66FDh9wy1Xi+9tprxxXfE0884frAevGpZlXNlaPj+/HHH11NrZarb+7FF198VHxTp051ZUvL+CKRxAIAAABAOlqyZImdd9554RpMjfarkXyPx7x58+ySSy5x76mEcubMmVarVq1UvZdGHa5Ro0ay4suZM6drRuzdP3jwYLLimzFjhtWpU8fSAkksAAAAAKSjfPny2b59+9z98ePHp9mAR59//rlde+21x0wojyV37tzh16o5sfq/xhJdM5tUOhkZn/rRejWzxyt7mrwLAAAAAOAoSlq9BPbSSy9N0xF7r7nmGrvhhhvcfSWIL774Yorf44UXXggnsLVr104ygZXIeWCPNc2P4lOzZ1Ht7XPPPWdpgZpYAAAAAEgnqoH0pp85cOCA5cqV66jnJDZQUmKPJ/acI0eOhEcL1mORU90kh/q/eu+vZFY1uknFsHbtWnv77bfdZ2lOWA36lFTsxxtfYhKPEAAAAABwXJT4eUnbueeee1QCqzlWR40aZQsXLnSPqQ/p3XffHa7h1OvVP1WDQOm5GsX4hhtusAYNGoSTRiWhVatWtblz57rne31Qk0O1t15yWr169ZgJrDeyshLYSLNmzXL/n3baaW7e2sQoPvXV/eabb9xnqUbWS2pTLZTFHDp0KDR8+PBQw4YNQw0aNAhdffXVoQEDBoQOHDgQt5hatGiRouf/8MMPKX5Ncnz00Ueh66+/3t0eeuih0LZt29zy9evXu8+77rrrQnfeeWdo06ZNbvmWLVtCbdq0Cd1www3uNVOnTg2/16233urW8Y033uhuCxYsSPQzx4wZ495X22HixIlHPT527Ngky/rjjz+697/mmmtCzzzzTOjgwYNu+bfffhuqVq1a+POfeuqpmO/xxx9/uH0h0siRI11c9evXD73xxhuJvu67774LNW7c2JX/rrvuCq1evdotX7p0qSu/lit2b3mk/fv3h5588km33vTZo0ePDj82Y8YM977XXntt6LnnngulhPbjzp07u7j1vpHrPda6jrUOY233SAsXLnTfH5kyZYorU1rQ52o/T6nIeJJj1apVoTp16rj7L730UujLL79M9mv1Or0+LUTGkVJpGYffPi+9jnWILfJ7wLoHgOP39NNPK0N0tx07diR4bNGiRaHChQuHH/duJUuWDK1bt84959FHHw1ly5btqOc0btw4dOTIkfB77d69O/yYzueS67777gu/bs+ePUk+NzqG6FtS9u3bF37eI488kuz4YsYSymK6d+8eeuCBB0Jbt24Nr9D27duHnn/++bjFdPbZZ8f9xE4JyxVXXBHavHmz+/uFF14IJ1BKVN977z13f9KkSaEOHTq4+z169Ai98sor7v5///0Xuvzyy0MbN250iZTuHz58OMnP/O2331wSpy/dzp073f3ly5eHH1+2bJmLKVZZlQjWrl07tGLFCvcl7tSpU2jChAnusVdffTVBYhiLEq+aNWsmSCBWrlzp/tYXWbHpM7Qs+rMvu+wy99nyzjvvhFq3bu3uN2nSJDR79mx3f/z48aGOHTse9blKkpVsKu5du3a5RHHx4sWhf//918WjA5fWY/PmzUMzZ84MJZfK7CXsWn9KTJWUxlrXSa3DWNs9ev15iasfktiUxuCX5NEvcfjt80hi4yulv00AgKNlz549ZpKXO3dut1zP0bnr22+/HSpRokQoZ86c7jxM54bea2vVquXON72kuGTJkkeda3vPzZEjR7Lji0yQj+V4ktjI16u8xytLNSfesGGDvf/++/b1119bkSJF3LI8efK4CYO/+uor9/eePXtch+Pff//dVXXfeeeddsstt9h7773nqvJ37dplq1atskqVKtmAAQPcSF4ffvihvfXWW+75Z555pj377LNWsGBBVyV/wQUXuKp/zbPUt29f+/PPP23z5s3hKne9h2geJX3Gd999Zy+99JJ7r5IlS7r30v9artcr3tNPPz3R8m3atMm6du3qqvnVFEDzNl155ZVuHieV/d9//7U1a9a46nxNQhxJTQ40d1XRokXd3yqf5p9Su3jNBfXyyy+75Y0aNXITHmu53ltDhYuaNmidKgZ9lj5fkyNv2bLFdQ7XxMnRNAy4RivLnz+/+1v3P/30U2vXrp3rL6AYH3nkEfvggw8SLe+iRYvslFNOCa8PzWOlsurzfv31V9eBXq8tXbq0m5OrVKlSCV6/bds2ty+oM/uTTz4ZXq4mHyqfYvB4TSvuv/9+a9++vftMrWvvs7W+1Glf3nnnHfd8vY+2hdf5XcOKaz/ThNYXXnih1atXz633AgUK2Kmnnmrr1q1z61rNQ7xY1Tlf+1gsV111VXjf9dZp27Zt3X3ti9p35s+f74ZNT2xdayj1xNahOuDH2u5eM5itW7fa4MGD3XdG+3KZMmXcPnbXXXe5fb5ChQo2aNAgF7/K8f3339uOHTuscOHC7vnqP6HBDdQkRs1f9N7ax719yvsM9bVo1aqVGxigU6dO7jO03m677bYEAw9Ex/PQQw+5mPW5asZy44032gMPPBBzXT711FNWrVo1d2vTpo1bJzoOnHHGGW6QA+1L+gy991lnneVeM2TIEPccrRN9fypWrOj2ee27XnMb7c/aTlqvCxYscOtGxxR9jvYh0eui49AxwdvGY8aMcetLxyZtS+1fWifec0THJU2Y3qNHD7deI2mC8dGjR7v1pqZMOuZpv4s8RmmS9GHDhtm0adOsUKFCVr58eStbtqw9/PDDR62rxMqtY5vi0/rXMU7bTTeVuVevXq75kI5fuq91Gq9jnY4Lie1HSb2neOtBvwnapqLjt8ql47nWe7du3dx60Hp5/PHH3efHKqe+W9qm0YN76DjQuXNnF4++O3rfoUOHun2mbt26bt3rt0jHGa3r+vXru++9jteJ/Q5F0r6k53vNuXR8HTdunK1cudLNDXj99deH9z8dQyN/m6L3lbFjx7rP1HFOTd8Uc3QTNMWlsus52pe0rxQvXtzFcf7557t9SDHrGKb/dXzS91/Hgn79+iW67QEgaGL1/9y7d2/4XFPnGN7gTNddd52tXr3anSvq99ij80g1wdXvQd68ed15js5vEuNNf5Mc8RgeKS36xGapmtjPP//cVb0nZdCgQeHmo6q1atSokWseqhqeK6+80jUDUJNkvY+afao2q1mzZqG9e/e61wwdOjTUr1+/8FVsr0bup59+cldORDVeql347LPPws8T1YKqWadXS/zhhx+GHn744XCtn5q9SpcuXRKtnVCNsmr4RDV6Xs3o4MGDXe2g3ke1fqrp+/3332OuA9VAqnyqhVMNq2pDI+lv1dxGUlNiNVNVrd+cOXNcbaDWicqkZsXff//9UZ+j9fHuu++G/9b9bt26uft9+vQJTZ48OcmaGH3mY489Fv5btaWqeRTVKH7zzTfu/rhx40K33357imrBtA0rV67sbr179w4lRfuDave9WmlRubX+q1SpElqyZEmSr//5559DNWrUcM231fyjV69eoZYtW7raUtWIRzYViRYdt5ogR9Yaa/2omXisdR1rHSZ3u0fXxOo7orLryqD2OdUi6z11NVHryds2o0aNCu/73vdAtcjt2rVz97XN1aTx5ptvdt8D+eKLL8KPqyn7448/ftT6iIxHTdFVO659Uvt006ZNj6rVjtz2ep1er2WK69dff3XlqFevXmjgwIHuOdrG3v6g1w0ZMsTd//rrr0M33XSTu6+a9+nTp7v7Whd6vZpi63uomnWPtq+avYuuvkbHEbmNFZOOSzoeaD2q/Goyrlp1Pa59KNb3TN/1unXrhltZqAVFYseor776KnTLLbe4763Wl7afYo4Wq9zab73y6Phz0UUXufvqmqBjpUybNs0dV+J5rIu1HyX1npHrwWsloJuOD163C7Vc8fYN7fPqThCrnEl58MEHQ2+++Wa4qX+rVq1c6wivZYya9qtc+n3SetWxNqnfoeht5/2+6XXaH/X90Od42zFy/4usiY3cV2bNmuXWoV6r45OOJao9iKR9XutQ61K0br2yKw7veOTtn1pHej99Z9OqRQcA+EGsmkqd93jLY53rpaSWMzXPT+lr0qomNi1S0CxVExvdyVkdkQcOHOju66r37Nmz3VVzXRnxav9U8/rHH3+4+xdffHH4iohqYrZv325z5syxf/75x13N9zpH64qzp3Llyu5/XalWTaWueq9YscJd+dZV9Ejq0K1aAHXm9q5S6AqLPl9X7M8++2y3vHHjxuEaskg//PBDeNhqxaArOHpPUc2MrurrVq5cORd7YlTTpJq8c845x32OajUSE3nlRzXRzz//vL3++uvuSrxq93QTXSlS7Z5qPKNrhxK78qPto+3g1UaoNjAlV3G87du/f//wMtUCq7Z1586dCa5oxaJajsWLF7v9QzGq9vWTTz5xNaTRVKujGgzFos7uHtVoa19SjYdq9byrZ9FUS6jXq8ZSNZS6cqbP1X6imjJdZVPrgcgaN9UgebVC//33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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from matplotlib import ticker\n", "\n", "df = pd.read_csv(csv_filename)\n", "\n", "# Set style and colors\n", "plt.style.use('seaborn-v0_8-whitegrid')\n", "bar_color = '#FF6200'\n", "\n", "# Create figure and axes\n", "fig, ax = plt.subplots()\n", "\n", "bars = ax.bar(df['year'], df['number'], color=bar_color, width=0.6)\n", "\n", "# Add value labels above bars\n", "for bar in bars:\n", " height = bar.get_height()\n", " ax.text(bar.get_x() + bar.get_width() / 2,\n", " height,\n", " f'{int(height)}',\n", " ha='center', va='bottom',\n", " fontsize=9, fontweight='light', color='#333333')\n", "\n", "# Disable default x-axis ticks\n", "ax.set_xticks([])\n", "\n", "# Add labels below bars\n", "for bar, label in zip(bars, df['year']):\n", " ax.text(bar.get_x() + bar.get_width() / 2,\n", " 0,\n", " str(label),\n", " ha='center', va='top',\n", " rotation=45,\n", " fontsize=9, color='#333333')\n", "\n", "# Labels and title\n", "ax.set_xlabel('Year', fontsize=12, labelpad=30)\n", "ax.set_ylabel('Number of CWE', fontsize=12)\n", "ax.set_title('Number of CWE per Year', fontsize=14, fontweight='bold')\n", "\n", "# Tweak spines and grid\n", "ax.spines['top'].set_visible(False)\n", "ax.spines['right'].set_visible(False)\n", "ax.grid(axis='y', linestyle='--', alpha=0.5)\n", "\n", "# Format Y-axis with thousands separator\n", "ax.yaxis.set_major_formatter(ticker.FuncFormatter(lambda x, _: f'{int(x):,}'))\n", "\n", "# Adjust layout for rotated labels\n", "plt.subplots_adjust(bottom=0.15)\n", "plt.tight_layout()\n", "\n", "# Legend and footer\n", "plt.legend(['CWE'])\n", "plt.figtext(0.10, 0.02,\n", " f\"Generated on {generation_time} thanks to limberduck.org based on source: cwe.mitre.org\",\n", " ha=\"left\", fontsize=8)\n", "\n", "# Figure background\n", "fig.set_size_inches(10, 6)\n", "fig.patch.set_facecolor('white')\n", "\n", "# License icons\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", "\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", "# Save images\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": "jupyter", "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.13.2" } }, "nbformat": 4, "nbformat_minor": 5 }