{ "cells": [ { "cell_type": "markdown", "id": "6c06000b-f238-478b-ab60-672e511358bd", "metadata": {}, "source": [ "# CPE" ] }, { "cell_type": "markdown", "id": "f86bac1a-41aa-470f-8d6a-99d89703de66", "metadata": {}, "source": [ "**Common Platform Enumeration (CPE)** is a structured naming scheme for information technology systems, software, and packages. Based upon the generic syntax for Uniform Resource Identifiers (URI), CPE includes a formal name format, a method for checking names against a system, and a description format for binding text and tests to a name. This method of naming is known as a well-formed CPE name (WFN)\n", "\n", "> source: [cpe.mitre.org/specification](https://cpe.mitre.org/specification/)\n", "\n" ] }, { "cell_type": "markdown", "id": "e905d329-eb7e-4552-94ce-1c8985f6e966", "metadata": {}, "source": [ "You can see this notebook directly via:\n", "- [GitHub](https://github.com/LimberDuck/limberduck.org/blob/master/docs/notebooks/cpe/cpe.ipynb)\n", "- [Jupter nbviewer](https://nbviewer.org/github/LimberDuck/limberduck.org/blob/master/docs/notebooks/cpe/cpe.ipynb)" ] }, { "cell_type": "markdown", "id": "d18ea856-b88a-4144-a015-c621bf1f208a", "metadata": { "tags": [] }, "source": [ "## Generation time" ] }, { "cell_type": "code", "execution_count": 1, "id": "0b6493e1-214a-475c-aff7-84e76f802de7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2024-04-16 05:54:00 +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": "e4a65b9b-d993-495b-92f4-463d544f9ca1", "metadata": {}, "source": [ "## Creative Commons" ] }, { "cell_type": "markdown", "id": "ae373a12-06be-41be-bea8-c01904517c0b", "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": "f660068b-6834-49b7-9dd5-ed149a4ed2d2", "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": "7af4b2f4-d6ed-4327-89ed-f0080ff9e88c", "metadata": {}, "source": [ "## CPE data downloading\n", "\n", "All CPE stats are taken from [nvd.nist.gov/products/cpe/statistics](https://nvd.nist.gov/products/cpe/statistics)" ] }, { "cell_type": "code", "execution_count": 3, "id": "d46bff47-b63d-4d2d-b634-21cac2b2c254", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "16\n" ] } ], "source": [ "from urllib.request import urlopen\n", "import ssl\n", "from bs4 import BeautifulSoup, SoupStrainer\n", "\n", "def get_data(url):\n", "\n", " ctx = ssl.create_default_context()\n", " ctx.check_hostname = False\n", " ctx.verify_mode = ssl.CERT_NONE\n", "\n", " page = urlopen(url, context=ctx)\n", " html = page.read().decode(\"utf-8\")\n", " \n", " product = SoupStrainer('table')\n", " soup = BeautifulSoup(html, \"html.parser\", parse_only=product)\n", " \n", " return soup\n", "\n", "url = \"https://nvd.nist.gov/products/cpe/statistics\"\n", "data = get_data(url)\n", "\n", "print(len(data))" ] }, { "cell_type": "markdown", "id": "9974ad6b-3ee7-483c-9226-370d241bd3ac", "metadata": {}, "source": [ "## New CPE entries" ] }, { "cell_type": "markdown", "id": "44f06c78-39e5-40cf-a298-16f7c84bcbc6", "metadata": {}, "source": [ "### CPE data parsing" ] }, { "cell_type": "code", "execution_count": 4, "id": "bae10707-ccbc-4683-9090-5da17daf9506", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 YearSummaryJanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDecember
1200957861814228306396122092411103301021960150
220101109499023450911068038864261252707133610261819
3201192637029255832252818682430390423470737851
420122323511481003162225013228225931242887158318301110940
52013156711460110511381271932989162313591140194113271386
6201416714155211511644210321751447160688688526013801625
72015650375865484983842973644656481216144788
8201611074245053587169973214713217629794526961106
92017186507468881070193514941210136418891516159625852357
1020185650922732404157125251048951603707389537221086265643337
1120192723226810719710466129791318132837454592376347195267172273122987
12202017168115960186682015916306141571125010659144591307710921929316772
132021189565112531496918562154761399718730207911653114022161641716011910
142022175793112991212513566104101026214432136521825114397155601488826951
152023223030182971648322071142621759119858189292094316827213441829618129
1620243973720260162202058119900000000
\n" ], "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "def pars(data):\n", " data_table = []\n", " \n", " for table in data:\n", " table_id = table['id']\n", " table_year = table_id[-4:]\n", " table_rows = table.find_all(\"tr\")\n", " number_of_new_cpe_entries_yearly = 0\n", " number_of_new_cpe_entries_list = []\n", " data_row = []\n", " for table_row in table_rows:\n", " data = table_row.find_all(\"td\")\n", " \n", " if data:\n", " number_of_new_cpe_entries = int(data[1].string.replace(\",\",\"\"))\n", " \n", " number_of_new_cpe_entries_list.append(number_of_new_cpe_entries)\n", " \n", " number_of_new_cpe_entries_yearly += number_of_new_cpe_entries\n", " \n", " while len(number_of_new_cpe_entries_list) < 12:\n", " number_of_new_cpe_entries_list.append(0)\n", "\n", " data_row.append(table_year)\n", " data_row.append(number_of_new_cpe_entries_yearly)\n", " data_row = data_row + number_of_new_cpe_entries_list\n", "\n", " data_table.append(data_row)\n", " \n", " data_columns = ['Year', 'Summary', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\n", " df = pd.DataFrame (data_table, columns = data_columns)\n", " df.sort_values(by=['Year'], inplace=True) \n", " df.reset_index(drop=True, inplace=True)\n", " df.index += 1\n", " return df\n", " \n", "parsed_data = pars(data)\n", "\n", "parsed_data.style.bar(subset=['Summary'], color='#FF6200')" ] }, { "cell_type": "markdown", "id": "eaef190d-2e0c-475f-b1d6-fa441d5b3e4a", "metadata": {}, "source": [ "### CPE data saving" ] }, { "cell_type": "markdown", "id": "93f11ea7-2207-4082-8cba-6ad1e3defd4a", "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/cpe/cpe-number-of-new-entries.csv)\n", "- [file directly](https://raw.githubusercontent.com/LimberDuck/limberduck.org/master/docs/notebooks/cpe/cpe-number-of-new-entries.csv)" ] }, { "cell_type": "code", "execution_count": 5, "id": "2ae932f3-8efb-488f-b622-258f17610704", "metadata": {}, "outputs": [], "source": [ "csv_filename = 'cpe-number-of-new-entries.csv'\n", "\n", "parsed_data.to_csv(csv_filename, index=False)" ] }, { "cell_type": "markdown", "id": "19290881-0ba4-44fb-b73c-fa906c122998", "metadata": {}, "source": [ "### CPE data ploting" ] }, { "cell_type": "markdown", "id": "9cf9d5fc-54c5-42ba-a644-a2e858ad03ad", "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/cpe/cpe-number-of-new-entries-bg-white.png)\n", "- [file via GitHub (transparent background)](https://github.com/LimberDuck/limberduck.org/blob/master/docs/notebooks/cpe/cpe-number-of-new-entries-bg-transparent.png)\n", "- [file directly (white background)](https://raw.githubusercontent.com/LimberDuck/limberduck.org/master/docs/notebooks/cpe/cpe-number-of-new-entries-bg-white.png)\n", "- [file directly (transparent background)](https://raw.githubusercontent.com/LimberDuck/limberduck.org/master/docs/notebooks/cpe/cpe-number-of-new-entries-bg-transparent.png)" ] }, { "cell_type": "code", "execution_count": 6, "id": "72c404e4-64ab-405a-84f7-49d890f71429", "metadata": {}, "outputs": [ { "data": { "image/png": "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jtatW2PQoEFYv349nJycsH37dgBAjx49sH//fqjValSvXh0bNmwAAFhbWyM4OBitW7cGAHz88cewtrYGAHz99dcYNWoUsrOz4efnBz8/P30vJhEREdFrQe/FpIuLCy5evFis3cbGBkePHi3WrlKpsGbNmhLnNXr0aIwePbpYu6enJ65cufLiYYmIiIjomRTzaCAiIiIievmwmCQiIiIi2VhMEhEREZFsLCaJiIiISDYWk0REREQkG4tJIiIiIpLNIN+AQ0REREQvxlnHb+Up69t74kJ6vlAOHpkkIiIiItlYTBIRERGRbCwmiYiIiEg2FpNEREREJBuLSSIiIiKSjcUkEREREcnGYpKIiIiIZGMxSURERESysZgkIiIiItlYTBIRERGRbCwmiYiIiEg2FpNEREREJBuLSSIiIiKSjcUkEREREcnGYpKIiIiIZGMxSURERESyGRs6AFFFcw76ucxxZnrkY1QZ48WF9CyvSERERK8MHpkkIiIiItlYTBIRERGRbCwmiYiIiEg2FpNEREREJBtvwCEieknx5jIiUgIemSQiIiIi2XhkkojK7QgXwKNcRESvGxaTRAbA05NERPSq4GluIiIiIpKNxSQRERERycZikoiIiIhkYzFJRERERLLxBpyXHG/kINIfvt+IiIrjkUkiIiIiko1HJqlc6XLkBuDRGyIiolcFj0wSERERkWwsJomIiIhINp7mJiJF4s0uREQvBxaTz4F/3IiIiIi08TQ3EREREcn2yhaTERERaNiwIdRqNUJCQgwdh4iIiOiV9EoWkwUFBZg0aRIOHDiA6OhobN26FdHR0YaORURERPTKeSWLybNnz0KtVsPFxQUmJibw9/fHnj17DB2LiIiI6JXzShaTCQkJcHR0lH53cHBAQkKCARMRERERvZpUQghh6BDlbceOHYiIiMC3334LANi8eTPOnDmD1atXa40XGhqK0NBQAMD169fRqFGjF+77/v37qFWr1gvPpzwxU9mUlgdQXial5QGYSRdKywMwky6UlgdQXial5QFe7UxxcXF48OBBicNeyUcD2dvbIz4+Xvpdo9HA3t6+2HiBgYEIDAws1749PT1x7ty5cp3ni2KmsiktD6C8TErLAzCTLpSWB2AmXSgtD6C8TErLA7y+mV7J09ytW7dGTEwMYmNjkZubi/DwcPTu3dvQsYiIiIheOa/k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oKCgACtWrMD8+fMhhMCff/6JsWPHStmSk5Mxbdo0WFhYoGnTphg3bhw8PDwwatQonD9/HuvXr5fuuurYsSM6duwIABgwYABGjhyJXbt24YcffsBPP/2EnTt3YsSIEejbty9SU1Mxa9YsdO3aFadOnYKdnV2x9XL79m3k5eXhq6++wocffoj4+HjUqVMH3377rbSunjZy5Eitw+IXLlzAiRMn0LBhw2LzX79+PYKCguDu7o7hw4ejc+fOMDU1RW5uLurWrQsA2LRpExwcHODi4gIzMzM8evQIb7zxBgDg77//xoMHD1CrVi0AwC+//AKNRgMfH59imVeuXIk1a9ZApVJh9uzZWLt2bbHsP/zwA3r27AkAyM3NxR9//IHvv/8eq1evxvHjxxEZGamVt0OHDmWO07lzZwBP/hst2vZjx47FzZs3MXfuXERHRyM8PBx//PEH9u3bh7t37+Kjjz6CRqPB8uXL0bFjRyQmJuLf//43AODRo0eYMWMGpk6dik2bNuHx48dwdHTEjBkzSuzniy++gLGxMfLz8/HVV18VW+a7d+8iOzsbCxYskK6jadq0KZKTk6HRaLB582bk5OTgk08+wZ9//ol58+bB0tISy5YtgxAC9evXR9++fTFs2DC888476NChA1avXo0GDRogMzMTADBw4EDs2LED33zzDRo1agQLCwusWLECNWvWlPbzgoICzJo1C3369EGnTp1K3e+L3ltvvfUWli1bhgYNGuDw4cM4ffq01nKFhIQgPj4eI0aMgJubG9asWYPk5GR0794dHTp0wKRJk+Ds7IxevXrByclJa3nGjx+P0aNHo169erh8+bLWfE+fPo2vv/4aADBx4kQ8fvy4xO0EAMuWLcOtW7dgaWmJRYsWYeHChUhNTUV6ejrWrl2LwMBArF69GsbGxhg/fjwWLFggrcchQ4bgo48+Qu3atdGvXz+Ymppi48aNyM/PR7t27dC/f3/MmjVLygIAo0aNgqurKxISEtC3b1/cvXsXVlZWeOedd/Dee+9h1apVmD59OmrVqoVTp05h4MCB0rQbN27E//73P7i4uMDIyAjz589HbGwscnNzERAQAAcHB3To0AFXrlzByZMnUaNGDQwfPhwAcO/ePXzwwQda2+Kfyzp8+HBs374d165dQ3h4OBYuXCjtex06dMCgQYPw559/YvXq1ejduzfat2+P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rJnOp6eflpubK/X58ccfP9e0PDJJREREVM6aNGmCq1evwtHRERcuXICNjY1O06Wnp6N9+/aIjo6Gk5NTsZsBn8Xd3V2a7sKFC1o3dRY9taHI08+RTE9PR5s2bXDjxo3n7hPgkUkiIiKicnfhwgU4OjoiPj4erq6u2Ldvn/R0l5IUFBRg//79aNCgAaKjo2FnZyc941pXUVFReOONN3Dr1i00aNAAhw4dkk5X37hxQ+sHeHJjzpEjR9CgQQPcuHFDVp8Aj0wSERERVYhHjx7B19cXp06dghACLVu2REBAANq3by998cX9+/dx8uRJbNq0CefPn4dKpULbtm1x+PBhmJmZPXef2dnZePvtt6U+O3TogICAALRp00Y6OpqcnIyzZ88iLCxMemRQ27ZtceTIEVl9spgkIiIiqiBCCKxatQqff/457t27J30xQdGD+HNzc1FYWAiVSoU6depg7ty5mDRpUomP7XmePlesWIHFixfjwYMH0vNRix76X/R1ziqVCjVr1kRQUBCmTZsmu08Wk0REREQVLCMjAz///DP27NmDq1evSt/hbWNjAw8PD/Tp0wd+fn7Frm18Eenp6di7dy/27duHa9euIS0tDcCTb5pzc3PDO++8g3feeafEb257HiwmiYiIiEg23oBDRERERLKxmCQiIiIi2VhMEhEREZFsLCaJiIiISDYWk0REREQkG4tJIiIiIpLt/wH4/TvkmwaGGgAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "import urllib\n", "\n", "df = pd.read_csv(csv_filename)\n", "\n", "df.plot(x='Year', \n", " xlabel='Year',\n", " y='Summary', \n", " ylabel='Number of CPE',\n", " kind='bar', \n", " title='Number of CPE per year')\n", "plt.tight_layout()\n", "plt.legend(['CPE'])\n", "plt.figtext(0.16, 0.02, f\"Generated on {generation_time} thanks to limberduck.org based on source: nvd.nist.gov/products/cpe/statistics\", 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('cpe-number-of-new-entries-bg-white.png', dpi = 300, facecolor = 'white')\n", "plt.savefig('cpe-number-of-new-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 }