From 21a0cb8c6b58bc5843e4dec4bf1c0048d98b858a Mon Sep 17 00:00:00 2001 From: priamai Date: Fri, 6 May 2022 11:51:28 +0100 Subject: [PATCH 1/7] added first draft of python library --- libraries/python/epss_lib.ipynb | 1945 +++++++++++++++++++++++++++++++ 1 file changed, 1945 insertions(+) create mode 100644 libraries/python/epss_lib.ipynb diff --git a/libraries/python/epss_lib.ipynb b/libraries/python/epss_lib.ipynb new file mode 100644 index 0000000..3ab7ccc --- /dev/null +++ b/libraries/python/epss_lib.ipynb @@ -0,0 +1,1945 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "epss_lib.ipynb", + "provenance": [], + "collapsed_sections": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "code", + "execution_count": 252, + "metadata": { + "id": "Q55EHKcA9pgu" + }, + "outputs": [], + "source": [ + "import requests\n", + "import pandas as pd\n", + "from datetime import datetime\n", + "import logging\n", + "\n", + "class Status(object):\n", + " def __init__(self, **kwargs):\n", + " self.__dict__.update(kwargs)\n", + "\n", + " def __str__(self):\n", + " return str(self.__dict__)\n", + "\n", + "class EPSS():\n", + "\n", + " def __init__(self,api_url='https://api.first.org/data/v1/'):\n", + " self.api_url = api_url\n", + " self.raw_url = \"https://epss.cyentia.com/\"\n", + "\n", + " def validate_date(self,date_text):\n", + " try:\n", + " datetime.strptime(date_text, '%Y-%m-%d')\n", + " except ValueError:\n", + " raise ValueError(\"Incorrect data format, should be YYYY-MM-DD\")\n", + "\n", + " def get_all(self,date:str=None)-> pd.DataFrame:\n", + " if date is None:\n", + " day_url = self.raw_url + 'epss_scores-current.csv.gz'\n", + " date = datetime.today().strftime('%Y-%m-%d')\n", + " elif type(date) is str:\n", + " self.validate_date(date)\n", + " day_url = self.raw_url + 'epss_scores-{date}.csv.gz'\n", + " else:\n", + " raise Exception('Date is invalid')\n", + " \n", + " epss_df = pd.read_csv(day_url,compression='gzip',sep=',')\n", + " if len(epss_df) > 0 :\n", + " logging.info('Done with total rows = %d' % len(epss_df))\n", + " header = epss_df.iloc[0]\n", + " if len(header)==2:\n", + " version = header.index[0].split(':')[1]\n", + " score_date = ''.join(header.index[1].split(':')[1:])\n", + " epss_df.columns = epss_df.iloc[0]\n", + " num_df = epss_df.iloc[1:].copy()\n", + " del epss_df\n", + " num_df['epss']=num_df['epss'].astype('float')\n", + " num_df['percentile']=num_df['percentile'].astype('float')\n", + " num_df['date']=date\n", + " status = Status(version=version,score_date=score_date)\n", + " return num_df,status\n", + " else:\n", + " raise Exception('EPSS format is malformed')\n", + "\n", + " def get(self,cve=None,envelope:bool=True,pretty:bool=False,offset:int=None,order:bool=True,\n", + " date:str=None,scope:str='public',epss_gt:float=None,epss_lt:float=None,\n", + " percentile_gt:float=None,percentile_lt:float=None,q:str=None)-> pd.DataFrame:\n", + "\n", + " url = self.api_url + 'epss'\n", + "\n", + " params = {}\n", + " if type(cve) is list:\n", + " params['cve'] = ','.join(cve)\n", + " if type(cve) is str:\n", + " params['cve'] = cve\n", + "\n", + " if type(date) is str:\n", + " self.validate_date(date)\n", + " params['date'] = date\n", + " \n", + " params['envelope']=envelope\n", + " params['pretty']=pretty\n", + " params['offset']=offset\n", + " params['scope']=scope\n", + " params['epss-gt']=epss_gt\n", + " params['epss-lt']=epss_lt\n", + " params['percentile-gt']=percentile_gt\n", + " params['percentile-lt']=percentile_lt\n", + " params['q']=q\n", + " if order == False: params['order']='!epss'\n", + "\n", + " r = requests.get(url,params)\n", + "\n", + " if r.status_code == 200:\n", + " data_status = r.json()\n", + "\n", + " if params['scope']=='public':\n", + " df = pd.json_normalize(data_status, 'data')\n", + " df.set_index('cve',inplace=True)\n", + " elif params['scope']=='time-series':\n", + " # iterate through each vulnerability\n", + " df = pd.json_normalize(data_status, 'data')\n", + " tmp = []\n", + " for idx,ts in df.iterrows():\n", + " tmp_df = pd.DataFrame(ts['time-series'])\n", + " tmp_df['cve']=ts['cve']\n", + " tmp_df = tmp_df.append(ts.drop(labels=['time-series']), ignore_index=True)\n", + " tmp.append(tmp_df)\n", + " df = pd.concat(tmp)\n", + " df.set_index('cve',inplace=True)\n", + " else:\n", + " raise Exception('Scope not supported')\n", + "\n", + " del data_status['data']\n", + " if envelope is True:\n", + " status = Status(**data_status)\n", + " else:\n", + " status = None\n", + " return df,status\n", + " else:\n", + " raise Exception(f'HTTP errror {r.status_code}')\n", + "\n" + ] + }, + { + "cell_type": "code", + "source": [ + "epss = EPSS()\n", + "data_df,status = epss.get()\n", + "data_df.columns" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "7lon1jqT-AnV", + "outputId": "2b15295d-9038-4fc9-9990-e11dc29969f4" + }, + "execution_count": 260, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Index(['epss', 'percentile', 'date'], dtype='object')" + ] + }, + "metadata": {}, + "execution_count": 260 + } + ] + }, + { + "cell_type": "code", + "source": [ + "data_df.head(2)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 143 + }, + "id": "9YWZ8c4J-w2m", + "outputId": "8139af22-6d77-4b67-fd7a-3bcd19eecd0a" + }, + "execution_count": 261, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " epss percentile date\n", + "cve \n", + "CVE-2022-30292 0.008850000 0.246240000 2022-05-05\n", + "CVE-2022-30288 0.008900000 0.270070000 2022-05-05" + ], + "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", + "
epsspercentiledate
cve
CVE-2022-302920.0088500000.2462400002022-05-05
CVE-2022-302880.0089000000.2700700002022-05-05
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 261 + } + ] + }, + { + "cell_type": "code", + "source": [ + "all_df,status = epss.get_all()\n", + "all_df.columns" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "o2cEiuzA9yK3", + "outputId": "f16fbaab-cae5-4a65-c94a-6d2eac19703f" + }, + "execution_count": 262, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Index(['epss', 'percentile', 'date'], dtype='object', name='cve')" + ] + }, + "metadata": {}, + "execution_count": 262 + } + ] + }, + { + "cell_type": "code", + "source": [ + "all_df.head(4)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 175 + }, + "id": "izyuqH4d_OWb", + "outputId": "c10fe0e3-f30b-49eb-feb1-bc5c1f664661" + }, + "execution_count": 263, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "cve epss percentile date\n", + "CVE-2022-25236 0.20148 0.96152 2022-05-06\n", + "CVE-2022-1388 0.01404 0.70195 2022-05-06\n", + "CVE-2022-1040 0.15362 0.95652 2022-05-06\n", + "CVE-2022-22954 0.93243 0.99926 2022-05-06" + ], + "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", + "
cveepsspercentiledate
CVE-2022-252360.201480.961522022-05-06
CVE-2022-13880.014040.701952022-05-06
CVE-2022-10400.153620.956522022-05-06
CVE-2022-229540.932430.999262022-05-06
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 263 + } + ] + }, + { + "cell_type": "code", + "source": [ + "data_df,status = epss.get(order=False)\n", + "data_df.head(2)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 112 + }, + "id": "G1_FsUTG7Zzu", + "outputId": "515ff4e8-68a3-47d0-f1e6-de1a8b48ab7b" + }, + "execution_count": 225, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " cve epss percentile date\n", + "0 CVE-2021-40438 0.972240000 1.000000000 2022-05-05\n", + "1 CVE-2017-12635 0.971090000 0.999990000 2022-05-05" + ], + "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", + "
cveepsspercentiledate
0CVE-2021-404380.9722400001.0000000002022-05-05
1CVE-2017-126350.9710900000.9999900002022-05-05
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 225 + } + ] + }, + { + "cell_type": "code", + "source": [ + "data_df,status = epss.get(epss_lt=0.0088)\n", + "data_df.shape" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "f-deHgph6y_A", + "outputId": "78e2f441-bbd3-4296-fd37-8d9fd308278e" + }, + "execution_count": 226, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(1, 4)" + ] + }, + "metadata": {}, + "execution_count": 226 + } + ] + }, + { + "cell_type": "code", + "source": [ + "data_df,status = epss.get(epss_gt=0.95)\n", + "data_df.shape" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8F6hYkWa7Ahj", + "outputId": "169cd152-e29d-4c72-ebee-8641cb55be82" + }, + "execution_count": 227, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(70, 4)" + ] + }, + "metadata": {}, + "execution_count": 227 + } + ] + }, + { + "cell_type": "code", + "source": [ + "data_df,status = epss.get(percentile_gt=0.98)\n", + "data_df.shape" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "iFCLRXh18X4p", + "outputId": "ea71c2b9-2a4e-4104-88c2-56586bcce643" + }, + "execution_count": 232, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(100, 4)" + ] + }, + "metadata": {}, + "execution_count": 232 + } + ] + }, + { + "cell_type": "code", + "source": [ + "data_df,status = epss.get(percentile_lt=0.1)\n", + "data_df.shape" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "H_4IU0E98cjM", + "outputId": "2cd07d0c-e42a-48a0-b58a-5d5df246e683" + }, + "execution_count": 231, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(1, 4)" + ] + }, + "metadata": {}, + "execution_count": 231 + } + ] + }, + { + "cell_type": "code", + "source": [ + "data_df,status = epss.get(cve='CVE-2022-27225',envelope=False)\n", + "data_df" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 80 + }, + "id": "wOzrT-RovVkS", + "outputId": "fcd3cdbb-02ba-419d-f98c-ac23d0a02f1d" + }, + "execution_count": 190, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " cve epss percentile date\n", + "0 CVE-2022-27225 0.008850000 0.246240000 2022-05-05" + ], + "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", + "
cveepsspercentiledate
0CVE-2022-272250.0088500000.2462400002022-05-05
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 190 + } + ] + }, + { + "cell_type": "code", + "source": [ + "status" + ], + "metadata": { + "id": "k9V2Yp1Sx_PS" + }, + "execution_count": 191, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "cve_list = ['CVE-2022-27225','CVE-2022-27223','CVE-2022-27218']\n", + "data_df,status = epss.get(cve=cve_list)\n", + "data_df" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 143 + }, + "id": "-tfVlTL_wovv", + "outputId": "8a7ab08d-66f1-4b70-9b38-af63dcadf6b5" + }, + "execution_count": 192, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " cve epss percentile date\n", + "0 CVE-2022-27225 0.008850000 0.246240000 2022-05-05\n", + "1 CVE-2022-27223 0.008900000 0.270070000 2022-05-05\n", + "2 CVE-2022-27218 0.008850000 0.246240000 2022-05-05" + ], + "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", + "
cveepsspercentiledate
0CVE-2022-272250.0088500000.2462400002022-05-05
1CVE-2022-272230.0089000000.2700700002022-05-05
2CVE-2022-272180.0088500000.2462400002022-05-05
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 192 + } + ] + }, + { + "cell_type": "code", + "source": [ + "data_df,status = epss.get(date='2022-03-01')\n", + "data_df" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 423 + }, + "id": "h7lCTccyxNML", + "outputId": "d25efd2f-8e9a-488e-adb5-2c1d71693391" + }, + "execution_count": 193, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " cve epss percentile date\n", + "0 CVE-2022-26332 0.008850000 0.111530000 2022-03-01\n", + "1 CVE-2022-26315 0.008850000 0.111530000 2022-03-01\n", + "2 CVE-2022-26181 0.008900000 0.127680000 2022-03-01\n", + "3 CVE-2022-26159 0.014120000 0.507330000 2022-03-01\n", + "4 CVE-2022-26158 0.008850000 0.111530000 2022-03-01\n", + ".. ... ... ... ...\n", + "95 CVE-2022-25206 0.008850000 0.111530000 2022-03-01\n", + "96 CVE-2022-25205 0.008850000 0.111530000 2022-03-01\n", + "97 CVE-2022-25204 0.008850000 0.111530000 2022-03-01\n", + "98 CVE-2022-25203 0.008850000 0.111530000 2022-03-01\n", + "99 CVE-2022-25202 0.008850000 0.111530000 2022-03-01\n", + "\n", + "[100 rows x 4 columns]" + ], + "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", + "
cveepsspercentiledate
0CVE-2022-263320.0088500000.1115300002022-03-01
1CVE-2022-263150.0088500000.1115300002022-03-01
2CVE-2022-261810.0089000000.1276800002022-03-01
3CVE-2022-261590.0141200000.5073300002022-03-01
4CVE-2022-261580.0088500000.1115300002022-03-01
...............
95CVE-2022-252060.0088500000.1115300002022-03-01
96CVE-2022-252050.0088500000.1115300002022-03-01
97CVE-2022-252040.0088500000.1115300002022-03-01
98CVE-2022-252030.0088500000.1115300002022-03-01
99CVE-2022-252020.0088500000.1115300002022-03-01
\n", + "

100 rows × 4 columns

\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 193 + } + ] + }, + { + "cell_type": "code", + "source": [ + "data_df,status = epss.get(cve=cve_list,scope='time-series')\n", + "data_df" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 423 + }, + "id": "guqW-VRsy9to", + "outputId": "8df54279-e5f6-4c13-e779-8741f48e6916" + }, + "execution_count": 194, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " epss percentile date cve\n", + "0 0.008850000 0.246150000 2022-05-04 CVE-2022-27225\n", + "1 0.008850000 0.246040000 2022-05-03 CVE-2022-27225\n", + "2 0.008850000 0.245850000 2022-05-02 CVE-2022-27225\n", + "3 0.008850000 0.245810000 2022-05-01 CVE-2022-27225\n", + "4 0.008850000 0.245810000 2022-04-30 CVE-2022-27225\n", + ".. ... ... ... ...\n", + "26 0.008850000 0.242790000 2022-04-08 CVE-2022-27218\n", + "27 0.008850000 0.242790000 2022-04-07 CVE-2022-27218\n", + "28 0.008850000 0.242790000 2022-04-06 CVE-2022-27218\n", + "29 0.008850000 0.242810000 2022-04-05 CVE-2022-27218\n", + "30 0.008850000 0.246240000 2022-05-05 CVE-2022-27218\n", + "\n", + "[93 rows x 4 columns]" + ], + "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", + "
epsspercentiledatecve
00.0088500000.2461500002022-05-04CVE-2022-27225
10.0088500000.2460400002022-05-03CVE-2022-27225
20.0088500000.2458500002022-05-02CVE-2022-27225
30.0088500000.2458100002022-05-01CVE-2022-27225
40.0088500000.2458100002022-04-30CVE-2022-27225
...............
260.0088500000.2427900002022-04-08CVE-2022-27218
270.0088500000.2427900002022-04-07CVE-2022-27218
280.0088500000.2427900002022-04-06CVE-2022-27218
290.0088500000.2428100002022-04-05CVE-2022-27218
300.0088500000.2462400002022-05-05CVE-2022-27218
\n", + "

93 rows × 4 columns

\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 194 + } + ] + }, + { + "cell_type": "code", + "source": [ + "data_df,status = epss.get(cve='CVE-2022-27225',scope='time-series')\n", + "data_df" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "ZzQpmB0d0zSd", + "outputId": "dfd05938-9d79-4759-8afd-e9f67e6c9077" + }, + "execution_count": 195, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " epss percentile date cve\n", + "0 0.008850000 0.246150000 2022-05-04 CVE-2022-27225\n", + "1 0.008850000 0.246040000 2022-05-03 CVE-2022-27225\n", + "2 0.008850000 0.245850000 2022-05-02 CVE-2022-27225\n", + "3 0.008850000 0.245810000 2022-05-01 CVE-2022-27225\n", + "4 0.008850000 0.245810000 2022-04-30 CVE-2022-27225\n", + "5 0.008850000 0.245690000 2022-04-29 CVE-2022-27225\n", + "6 0.008850000 0.245550000 2022-04-28 CVE-2022-27225\n", + "7 0.008850000 0.245460000 2022-04-27 CVE-2022-27225\n", + "8 0.008850000 0.245400000 2022-04-26 CVE-2022-27225\n", + "9 0.008850000 0.245320000 2022-04-25 CVE-2022-27225\n", + "10 0.008850000 0.245300000 2022-04-24 CVE-2022-27225\n", + "11 0.008850000 0.245310000 2022-04-23 CVE-2022-27225\n", + "12 0.008850000 0.245310000 2022-04-22 CVE-2022-27225\n", + "13 0.008850000 0.245060000 2022-04-21 CVE-2022-27225\n", + "14 0.008850000 0.244990000 2022-04-20 CVE-2022-27225\n", + "15 0.008850000 0.244770000 2022-04-19 CVE-2022-27225\n", + "16 0.008850000 0.244680000 2022-04-18 CVE-2022-27225\n", + "17 0.008850000 0.244680000 2022-04-17 CVE-2022-27225\n", + "18 0.008850000 0.244660000 2022-04-16 CVE-2022-27225\n", + "19 0.008850000 0.244340000 2022-04-15 CVE-2022-27225\n", + "20 0.008850000 0.244030000 2022-04-14 CVE-2022-27225\n", + "21 0.008850000 0.244120000 2022-04-13 CVE-2022-27225\n", + "22 0.008850000 0.243790000 2022-04-12 CVE-2022-27225\n", + "23 0.008850000 0.243390000 2022-04-11 CVE-2022-27225\n", + "24 0.008850000 0.243270000 2022-04-10 CVE-2022-27225\n", + "25 0.008850000 0.243240000 2022-04-09 CVE-2022-27225\n", + "26 0.008850000 0.242790000 2022-04-08 CVE-2022-27225\n", + "27 0.008850000 0.242790000 2022-04-07 CVE-2022-27225\n", + "28 0.008850000 0.242790000 2022-04-06 CVE-2022-27225\n", + "29 0.008850000 0.242810000 2022-04-05 CVE-2022-27225\n", + "30 0.008850000 0.246240000 2022-05-05 CVE-2022-27225" + ], + "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", + "
epsspercentiledatecve
00.0088500000.2461500002022-05-04CVE-2022-27225
10.0088500000.2460400002022-05-03CVE-2022-27225
20.0088500000.2458500002022-05-02CVE-2022-27225
30.0088500000.2458100002022-05-01CVE-2022-27225
40.0088500000.2458100002022-04-30CVE-2022-27225
50.0088500000.2456900002022-04-29CVE-2022-27225
60.0088500000.2455500002022-04-28CVE-2022-27225
70.0088500000.2454600002022-04-27CVE-2022-27225
80.0088500000.2454000002022-04-26CVE-2022-27225
90.0088500000.2453200002022-04-25CVE-2022-27225
100.0088500000.2453000002022-04-24CVE-2022-27225
110.0088500000.2453100002022-04-23CVE-2022-27225
120.0088500000.2453100002022-04-22CVE-2022-27225
130.0088500000.2450600002022-04-21CVE-2022-27225
140.0088500000.2449900002022-04-20CVE-2022-27225
150.0088500000.2447700002022-04-19CVE-2022-27225
160.0088500000.2446800002022-04-18CVE-2022-27225
170.0088500000.2446800002022-04-17CVE-2022-27225
180.0088500000.2446600002022-04-16CVE-2022-27225
190.0088500000.2443400002022-04-15CVE-2022-27225
200.0088500000.2440300002022-04-14CVE-2022-27225
210.0088500000.2441200002022-04-13CVE-2022-27225
220.0088500000.2437900002022-04-12CVE-2022-27225
230.0088500000.2433900002022-04-11CVE-2022-27225
240.0088500000.2432700002022-04-10CVE-2022-27225
250.0088500000.2432400002022-04-09CVE-2022-27225
260.0088500000.2427900002022-04-08CVE-2022-27225
270.0088500000.2427900002022-04-07CVE-2022-27225
280.0088500000.2427900002022-04-06CVE-2022-27225
290.0088500000.2428100002022-04-05CVE-2022-27225
300.0088500000.2462400002022-05-05CVE-2022-27225
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 195 + } + ] + }, + { + "cell_type": "code", + "source": [ + "" + ], + "metadata": { + "id": "z3wSlWjl6S1A" + }, + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file From 52e21034e0e6dda8a44886cdeef4efe0dd792d7b Mon Sep 17 00:00:00 2001 From: priamai Date: Wed, 11 May 2022 10:04:03 +0100 Subject: [PATCH 2/7] Few improvements. --- .gitignore | 5 + .idea/.gitignore | 3 + libraries/python/epss_lib.ipynb | 1846 ++++++++++------------------- libraries/python/requirements.txt | 2 + 4 files changed, 650 insertions(+), 1206 deletions(-) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 libraries/python/requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6b46000 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.idea/EPSS.iml +.idea/misc.xml +.idea/modules.xml +.idea/vcs.xml +.idea/inspectionProfiles/profiles_settings.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/libraries/python/epss_lib.ipynb b/libraries/python/epss_lib.ipynb index 3ab7ccc..56812a4 100644 --- a/libraries/python/epss_lib.ipynb +++ b/libraries/python/epss_lib.ipynb @@ -1,24 +1,8 @@ { - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "name": "epss_lib.ipynb", - "provenance": [], - "collapsed_sections": [] - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" - } - }, "cells": [ { "cell_type": "code", - "execution_count": 252, + "execution_count": 58, "metadata": { "id": "Q55EHKcA9pgu" }, @@ -71,15 +55,19 @@ " num_df['epss']=num_df['epss'].astype('float')\n", " num_df['percentile']=num_df['percentile'].astype('float')\n", " num_df['date']=date\n", + " #num_df.set_index('cve',inplace=True)\n", " status = Status(version=version,score_date=score_date)\n", " return num_df,status\n", " else:\n", " raise Exception('EPSS format is malformed')\n", "\n", - " def get(self,cve=None,envelope:bool=True,pretty:bool=False,offset:int=None,order:bool=True,\n", - " date:str=None,scope:str='public',epss_gt:float=None,epss_lt:float=None,\n", + " def get(self,cve=None,envelope:bool=True,pretty:bool=False,offset:int=None,limit:int=None,order:bool=True,sort_fields:list=None,\n", + " date:str=None,scope:str='public',epss_gt:float=None,epss_lt:float=None,fields:list=None,\n", " percentile_gt:float=None,percentile_lt:float=None,q:str=None)-> pd.DataFrame:\n", "\n", + " '''\n", + " Refer to parameters here: https://api.first.org/#Global-parameters\n", + " '''\n", " url = self.api_url + 'epss'\n", "\n", " params = {}\n", @@ -87,7 +75,10 @@ " params['cve'] = ','.join(cve)\n", " if type(cve) is str:\n", " params['cve'] = cve\n", - "\n", + " if type(sort_fields) is list:\n", + " params['sort'] = ','.join(sort_fields)\n", + " if type(fields) is list:\n", + " params['fields'] = ','.join(fields)\n", " if type(date) is str:\n", " self.validate_date(date)\n", " params['date'] = date\n", @@ -95,14 +86,16 @@ " params['envelope']=envelope\n", " params['pretty']=pretty\n", " params['offset']=offset\n", + " params['limit']=limit\n", " params['scope']=scope\n", " params['epss-gt']=epss_gt\n", " params['epss-lt']=epss_lt\n", " params['percentile-gt']=percentile_gt\n", " params['percentile-lt']=percentile_lt\n", " params['q']=q\n", + " \n", " if order == False: params['order']='!epss'\n", - "\n", + " \n", " r = requests.get(url,params)\n", "\n", " if r.status_code == 200:\n", @@ -119,6 +112,7 @@ " tmp_df = pd.DataFrame(ts['time-series'])\n", " tmp_df['cve']=ts['cve']\n", " tmp_df = tmp_df.append(ts.drop(labels=['time-series']), ignore_index=True)\n", + " #tmp_df = pd.concat([tmp_df,ts.drop(labels=['time-series'])])\n", " tmp.append(tmp_df)\n", " df = pd.concat(tmp)\n", " df.set_index('cve',inplace=True)\n", @@ -138,11 +132,7 @@ }, { "cell_type": "code", - "source": [ - "epss = EPSS()\n", - "data_df,status = epss.get()\n", - "data_df.columns" - ], + "execution_count": 59, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -150,25 +140,32 @@ "id": "7lon1jqT-AnV", "outputId": "2b15295d-9038-4fc9-9990-e11dc29969f4" }, - "execution_count": 260, "outputs": [ { - "output_type": "execute_result", "data": { "text/plain": [ - "Index(['epss', 'percentile', 'date'], dtype='object')" + "Index(['CVE-2022-30524', 'CVE-2022-30335', 'CVE-2022-30334', 'CVE-2022-30333',\n", + " 'CVE-2022-30330', 'CVE-2022-30295', 'CVE-2022-30294', 'CVE-2022-30293',\n", + " 'CVE-2022-30292', 'CVE-2022-30288'],\n", + " dtype='object', name='cve')" ] }, + "execution_count": 59, "metadata": {}, - "execution_count": 260 + "output_type": "execute_result" } + ], + "source": [ + "epss = EPSS()\n", + "data_df,status = epss.get(limit=10)\n", + "assert len(data_df)==10\n", + "assert data_df.columns.tolist()== ['epss', 'percentile', 'date']\n", + "data_df.index" ] }, { "cell_type": "code", - "source": [ - "data_df.head(2)" - ], + "execution_count": 60, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -177,22 +174,11 @@ "id": "9YWZ8c4J-w2m", "outputId": "8139af22-6d77-4b67-fd7a-3bcd19eecd0a" }, - "execution_count": 261, "outputs": [ { - "output_type": "execute_result", "data": { - "text/plain": [ - " epss percentile date\n", - "cve \n", - "CVE-2022-30292 0.008850000 0.246240000 2022-05-05\n", - "CVE-2022-30288 0.008900000 0.270070000 2022-05-05" - ], "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", + "
\n", "\n", - "\n", - " \n", - "
\n", - "
\n", - " " + "
" + ], + "text/plain": [ + " epss percentile date\n", + "cve \n", + "CVE-2022-30524 0.010550000 0.488890000 2022-05-10\n", + "CVE-2022-30335 0.008900000 0.270660000 2022-05-10\n", + "CVE-2022-30334 0.009500000 0.290490000 2022-05-10\n", + "CVE-2022-30333 0.008850000 0.246880000 2022-05-10\n", + "CVE-2022-30330 0.008850000 0.246880000 2022-05-10\n", + "CVE-2022-30295 0.008850000 0.246880000 2022-05-10\n", + "CVE-2022-30294 0.008850000 0.246880000 2022-05-10\n", + "CVE-2022-30293 0.008850000 0.246880000 2022-05-10\n", + "CVE-2022-30292 0.008850000 0.246880000 2022-05-10\n", + "CVE-2022-30288 0.008900000 0.270660000 2022-05-10" ] }, + "execution_count": 60, "metadata": {}, - "execution_count": 261 + "output_type": "execute_result" } + ], + "source": [ + "data_df,status = epss.get(sort_fields=['-epss'],limit=10)\n", + "data_df" ] }, { "cell_type": "code", - "source": [ - "all_df,status = epss.get_all()\n", - "all_df.columns" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "o2cEiuzA9yK3", - "outputId": "f16fbaab-cae5-4a65-c94a-6d2eac19703f" - }, - "execution_count": 262, + "execution_count": 61, + "metadata": {}, "outputs": [ { - "output_type": "execute_result", "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", + "
epsspercentiledate
cve
CVE-2022-305240.0105500000.4888900002022-05-10
CVE-2022-303350.0089000000.2706600002022-05-10
CVE-2022-303340.0095000000.2904900002022-05-10
CVE-2022-303330.0088500000.2468800002022-05-10
CVE-2022-303300.0088500000.2468800002022-05-10
CVE-2022-302950.0088500000.2468800002022-05-10
CVE-2022-302940.0088500000.2468800002022-05-10
CVE-2022-302930.0088500000.2468800002022-05-10
CVE-2022-302920.0088500000.2468800002022-05-10
CVE-2022-302880.0089000000.2706600002022-05-10
\n", + "
" + ], "text/plain": [ - "Index(['epss', 'percentile', 'date'], dtype='object', name='cve')" + " epss percentile date\n", + "cve \n", + "CVE-2022-30524 0.010550000 0.488890000 2022-05-10\n", + "CVE-2022-30335 0.008900000 0.270660000 2022-05-10\n", + "CVE-2022-30334 0.009500000 0.290490000 2022-05-10\n", + "CVE-2022-30333 0.008850000 0.246880000 2022-05-10\n", + "CVE-2022-30330 0.008850000 0.246880000 2022-05-10\n", + "CVE-2022-30295 0.008850000 0.246880000 2022-05-10\n", + "CVE-2022-30294 0.008850000 0.246880000 2022-05-10\n", + "CVE-2022-30293 0.008850000 0.246880000 2022-05-10\n", + "CVE-2022-30292 0.008850000 0.246880000 2022-05-10\n", + "CVE-2022-30288 0.008900000 0.270660000 2022-05-10" ] }, + "execution_count": 61, "metadata": {}, - "execution_count": 262 + "output_type": "execute_result" } + ], + "source": [ + "data_df,status = epss.get(sort_fields=['+epss'],limit=10)\n", + "data_df" ] }, { "cell_type": "code", - "source": [ - "all_df.head(4)" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 175 - }, - "id": "izyuqH4d_OWb", - "outputId": "c10fe0e3-f30b-49eb-feb1-bc5c1f664661" - }, - "execution_count": 263, + "execution_count": 62, + "metadata": {}, "outputs": [ { - "output_type": "execute_result", "data": { - "text/plain": [ - "cve epss percentile date\n", - "CVE-2022-25236 0.20148 0.96152 2022-05-06\n", - "CVE-2022-1388 0.01404 0.70195 2022-05-06\n", - "CVE-2022-1040 0.15362 0.95652 2022-05-06\n", - "CVE-2022-22954 0.93243 0.99926 2022-05-06" - ], "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", + "
\n", "\n", - "\n", - " \n", - "
\n", - "
\n", - " " + "
" + ], + "text/plain": [ + " epss\n", + "cve \n", + "CVE-2022-30524 0.010550000\n", + "CVE-2022-30335 0.008900000\n", + "CVE-2022-30334 0.009500000\n", + "CVE-2022-30333 0.008850000\n", + "CVE-2022-30330 0.008850000" ] }, + "execution_count": 62, "metadata": {}, - "execution_count": 263 + "output_type": "execute_result" } + ], + "source": [ + "data_df,status = epss.get(fields=['cve','epss'],limit=5)\n", + "data_df" ] }, { "cell_type": "code", - "source": [ - "data_df,status = epss.get(order=False)\n", - "data_df.head(2)" - ], + "execution_count": 63, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -524,21 +513,11 @@ "id": "G1_FsUTG7Zzu", "outputId": "515ff4e8-68a3-47d0-f1e6-de1a8b48ab7b" }, - "execution_count": 225, "outputs": [ { - "output_type": "execute_result", "data": { - "text/plain": [ - " cve epss percentile date\n", - "0 CVE-2021-40438 0.972240000 1.000000000 2022-05-05\n", - "1 CVE-2017-12635 0.971090000 0.999990000 2022-05-05" - ], "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", + "
\n", "\n", - "\n", - " \n", - "
\n", - "
\n", - " " + "
" + ], + "text/plain": [ + " epss percentile date\n", + "cve \n", + "CVE-2021-40438 0.972240000 1.000000000 2022-05-10\n", + "CVE-2017-12635 0.971090000 0.999990000 2022-05-10" ] }, + "execution_count": 63, "metadata": {}, - "execution_count": 225 + "output_type": "execute_result" } + ], + "source": [ + "data_df,status = epss.get(order=False)\n", + "data_df.head(2)" ] }, { "cell_type": "code", - "source": [ - "data_df,status = epss.get(epss_lt=0.0088)\n", - "data_df.shape" - ], + "execution_count": 64, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -676,26 +590,26 @@ "id": "f-deHgph6y_A", "outputId": "78e2f441-bbd3-4296-fd37-8d9fd308278e" }, - "execution_count": 226, "outputs": [ { - "output_type": "execute_result", "data": { "text/plain": [ - "(1, 4)" + "(1, 3)" ] }, + "execution_count": 64, "metadata": {}, - "execution_count": 226 + "output_type": "execute_result" } + ], + "source": [ + "data_df,status = epss.get(epss_lt=0.0088)\n", + "data_df.shape" ] }, { "cell_type": "code", - "source": [ - "data_df,status = epss.get(epss_gt=0.95)\n", - "data_df.shape" - ], + "execution_count": 65, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -703,26 +617,26 @@ "id": "8F6hYkWa7Ahj", "outputId": "169cd152-e29d-4c72-ebee-8641cb55be82" }, - "execution_count": 227, "outputs": [ { - "output_type": "execute_result", "data": { "text/plain": [ - "(70, 4)" + "(70, 3)" ] }, + "execution_count": 65, "metadata": {}, - "execution_count": 227 + "output_type": "execute_result" } + ], + "source": [ + "data_df,status = epss.get(epss_gt=0.95)\n", + "data_df.shape" ] }, { "cell_type": "code", - "source": [ - "data_df,status = epss.get(percentile_gt=0.98)\n", - "data_df.shape" - ], + "execution_count": 66, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -730,26 +644,26 @@ "id": "iFCLRXh18X4p", "outputId": "ea71c2b9-2a4e-4104-88c2-56586bcce643" }, - "execution_count": 232, "outputs": [ { - "output_type": "execute_result", "data": { "text/plain": [ - "(100, 4)" + "(100, 3)" ] }, + "execution_count": 66, "metadata": {}, - "execution_count": 232 + "output_type": "execute_result" } + ], + "source": [ + "data_df,status = epss.get(percentile_gt=0.98)\n", + "data_df.shape" ] }, { "cell_type": "code", - "source": [ - "data_df,status = epss.get(percentile_lt=0.1)\n", - "data_df.shape" - ], + "execution_count": 67, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -757,26 +671,26 @@ "id": "H_4IU0E98cjM", "outputId": "2cd07d0c-e42a-48a0-b58a-5d5df246e683" }, - "execution_count": 231, "outputs": [ { - "output_type": "execute_result", "data": { "text/plain": [ - "(1, 4)" + "(1, 3)" ] }, + "execution_count": 67, "metadata": {}, - "execution_count": 231 + "output_type": "execute_result" } + ], + "source": [ + "data_df,status = epss.get(percentile_lt=0.1)\n", + "data_df.shape" ] }, { "cell_type": "code", - "source": [ - "data_df,status = epss.get(cve='CVE-2022-27225',envelope=False)\n", - "data_df" - ], + "execution_count": 68, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -785,20 +699,11 @@ "id": "wOzrT-RovVkS", "outputId": "fcd3cdbb-02ba-419d-f98c-ac23d0a02f1d" }, - "execution_count": 190, "outputs": [ { - "output_type": "execute_result", "data": { - "text/plain": [ - " cve epss percentile date\n", - "0 CVE-2022-27225 0.008850000 0.246240000 2022-05-05" - ], "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", + "
\n", "\n", - "\n", - " \n", - "
\n", - "
\n", - " " + "
" + ], + "text/plain": [ + " epss percentile date\n", + "cve \n", + "CVE-2022-27225 0.008850000 0.246880000 2022-05-10" ] }, + "execution_count": 68, "metadata": {}, - "execution_count": 190 + "output_type": "execute_result" } + ], + "source": [ + "data_df,status = epss.get(cve='CVE-2022-27225',envelope=False)\n", + "data_df" ] }, { "cell_type": "code", - "source": [ - "status" - ], + "execution_count": 69, "metadata": { "id": "k9V2Yp1Sx_PS" }, - "execution_count": 191, - "outputs": [] + "outputs": [], + "source": [ + "status" + ] }, { "cell_type": "code", - "source": [ - "cve_list = ['CVE-2022-27225','CVE-2022-27223','CVE-2022-27218']\n", - "data_df,status = epss.get(cve=cve_list)\n", - "data_df" - ], + "execution_count": 70, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -942,22 +781,11 @@ "id": "-tfVlTL_wovv", "outputId": "8a7ab08d-66f1-4b70-9b38-af63dcadf6b5" }, - "execution_count": 192, "outputs": [ { - "output_type": "execute_result", "data": { - "text/plain": [ - " cve epss percentile date\n", - "0 CVE-2022-27225 0.008850000 0.246240000 2022-05-05\n", - "1 CVE-2022-27223 0.008900000 0.270070000 2022-05-05\n", - "2 CVE-2022-27218 0.008850000 0.246240000 2022-05-05" - ], "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", + "
\n", "\n", - "\n", - " \n", - "
\n", - "
\n", - " " + "
" + ], + "text/plain": [ + " epss percentile date\n", + "cve \n", + "CVE-2022-27225 0.008850000 0.246880000 2022-05-10\n", + "CVE-2022-27223 0.008900000 0.270660000 2022-05-10\n", + "CVE-2022-27218 0.008850000 0.246880000 2022-05-10" ] }, + "execution_count": 70, "metadata": {}, - "execution_count": 192 + "output_type": "execute_result" } + ], + "source": [ + "cve_list = ['CVE-2022-27225','CVE-2022-27223','CVE-2022-27218']\n", + "data_df,status = epss.get(cve=cve_list)\n", + "data_df" ] }, { "cell_type": "code", - "source": [ - "data_df,status = epss.get(date='2022-03-01')\n", - "data_df" - ], + "execution_count": 71, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -1103,32 +867,11 @@ "id": "h7lCTccyxNML", "outputId": "d25efd2f-8e9a-488e-adb5-2c1d71693391" }, - "execution_count": 193, "outputs": [ { - "output_type": "execute_result", "data": { - "text/plain": [ - " cve epss percentile date\n", - "0 CVE-2022-26332 0.008850000 0.111530000 2022-03-01\n", - "1 CVE-2022-26315 0.008850000 0.111530000 2022-03-01\n", - "2 CVE-2022-26181 0.008900000 0.127680000 2022-03-01\n", - "3 CVE-2022-26159 0.014120000 0.507330000 2022-03-01\n", - "4 CVE-2022-26158 0.008850000 0.111530000 2022-03-01\n", - ".. ... ... ... ...\n", - "95 CVE-2022-25206 0.008850000 0.111530000 2022-03-01\n", - "96 CVE-2022-25205 0.008850000 0.111530000 2022-03-01\n", - "97 CVE-2022-25204 0.008850000 0.111530000 2022-03-01\n", - "98 CVE-2022-25203 0.008850000 0.111530000 2022-03-01\n", - "99 CVE-2022-25202 0.008850000 0.111530000 2022-03-01\n", - "\n", - "[100 rows x 4 columns]" - ], "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", + "
\n", "\n", - "\n", - " \n", - "
\n", - "
\n", - " " + "

100 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " epss percentile date\n", + "cve \n", + "CVE-2022-26332 0.008850000 0.111530000 2022-03-01\n", + "CVE-2022-26315 0.008850000 0.111530000 2022-03-01\n", + "CVE-2022-26181 0.008900000 0.127680000 2022-03-01\n", + "CVE-2022-26159 0.014120000 0.507330000 2022-03-01\n", + "CVE-2022-26158 0.008850000 0.111530000 2022-03-01\n", + "... ... ... ...\n", + "CVE-2022-25206 0.008850000 0.111530000 2022-03-01\n", + "CVE-2022-25205 0.008850000 0.111530000 2022-03-01\n", + "CVE-2022-25204 0.008850000 0.111530000 2022-03-01\n", + "CVE-2022-25203 0.008850000 0.111530000 2022-03-01\n", + "CVE-2022-25202 0.008850000 0.111530000 2022-03-01\n", + "\n", + "[100 rows x 3 columns]" ] }, + "execution_count": 71, "metadata": {}, - "execution_count": 193 + "output_type": "execute_result" } + ], + "source": [ + "data_df,status = epss.get(date='2022-03-01')\n", + "data_df" ] }, { "cell_type": "code", - "source": [ - "data_df,status = epss.get(cve=cve_list,scope='time-series')\n", - "data_df" - ], + "execution_count": 72, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -1331,32 +1011,11 @@ "id": "guqW-VRsy9to", "outputId": "8df54279-e5f6-4c13-e779-8741f48e6916" }, - "execution_count": 194, "outputs": [ { - "output_type": "execute_result", "data": { - "text/plain": [ - " epss percentile date cve\n", - "0 0.008850000 0.246150000 2022-05-04 CVE-2022-27225\n", - "1 0.008850000 0.246040000 2022-05-03 CVE-2022-27225\n", - "2 0.008850000 0.245850000 2022-05-02 CVE-2022-27225\n", - "3 0.008850000 0.245810000 2022-05-01 CVE-2022-27225\n", - "4 0.008850000 0.245810000 2022-04-30 CVE-2022-27225\n", - ".. ... ... ... ...\n", - "26 0.008850000 0.242790000 2022-04-08 CVE-2022-27218\n", - "27 0.008850000 0.242790000 2022-04-07 CVE-2022-27218\n", - "28 0.008850000 0.242790000 2022-04-06 CVE-2022-27218\n", - "29 0.008850000 0.242810000 2022-04-05 CVE-2022-27218\n", - "30 0.008850000 0.246240000 2022-05-05 CVE-2022-27218\n", - "\n", - "[93 rows x 4 columns]" - ], "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", + "
\n", "\n", - "\n", - " \n", - "
\n", - "
\n", - " " + "

102 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " epss percentile date 0\n", + "cve \n", + "CVE-2022-27225 0.008850000 0.246670000 2022-05-09 NaN\n", + "CVE-2022-27225 0.008850000 0.246670000 2022-05-08 NaN\n", + "CVE-2022-27225 0.008850000 0.246640000 2022-05-07 NaN\n", + "CVE-2022-27225 0.008850000 0.246590000 2022-05-06 NaN\n", + "CVE-2022-27225 0.008850000 0.246240000 2022-05-05 NaN\n", + "... ... ... ... ...\n", + "CVE-2022-27218 0.008850000 0.243270000 2022-04-10 NaN\n", + "NaN NaN NaN NaN CVE-2022-27218\n", + "NaN NaN NaN NaN 0.008850000\n", + "NaN NaN NaN NaN 0.246880000\n", + "NaN NaN NaN NaN 2022-05-10\n", + "\n", + "[102 rows x 4 columns]" ] }, + "execution_count": 72, "metadata": {}, - "execution_count": 194 + "output_type": "execute_result" } + ], + "source": [ + "data_df,status = epss.get(cve=cve_list,scope='time-series')\n", + "data_df" ] }, { "cell_type": "code", - "source": [ - "data_df,status = epss.get(cve='CVE-2022-27225',scope='time-series')\n", - "data_df" - ], + "execution_count": 57, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -1559,50 +1168,19 @@ "id": "ZzQpmB0d0zSd", "outputId": "dfd05938-9d79-4759-8afd-e9f67e6c9077" }, - "execution_count": 195, "outputs": [ { - "output_type": "execute_result", + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\robom\\AppData\\Local\\Temp\\ipykernel_40540\\3998398855.py:104: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", + " tmp_df = tmp_df.append(ts.drop(labels=['time-series']), ignore_index=True)\n" + ] + }, + { "data": { - "text/plain": [ - " epss percentile date cve\n", - "0 0.008850000 0.246150000 2022-05-04 CVE-2022-27225\n", - "1 0.008850000 0.246040000 2022-05-03 CVE-2022-27225\n", - "2 0.008850000 0.245850000 2022-05-02 CVE-2022-27225\n", - "3 0.008850000 0.245810000 2022-05-01 CVE-2022-27225\n", - "4 0.008850000 0.245810000 2022-04-30 CVE-2022-27225\n", - "5 0.008850000 0.245690000 2022-04-29 CVE-2022-27225\n", - "6 0.008850000 0.245550000 2022-04-28 CVE-2022-27225\n", - "7 0.008850000 0.245460000 2022-04-27 CVE-2022-27225\n", - "8 0.008850000 0.245400000 2022-04-26 CVE-2022-27225\n", - "9 0.008850000 0.245320000 2022-04-25 CVE-2022-27225\n", - "10 0.008850000 0.245300000 2022-04-24 CVE-2022-27225\n", - "11 0.008850000 0.245310000 2022-04-23 CVE-2022-27225\n", - "12 0.008850000 0.245310000 2022-04-22 CVE-2022-27225\n", - "13 0.008850000 0.245060000 2022-04-21 CVE-2022-27225\n", - "14 0.008850000 0.244990000 2022-04-20 CVE-2022-27225\n", - "15 0.008850000 0.244770000 2022-04-19 CVE-2022-27225\n", - "16 0.008850000 0.244680000 2022-04-18 CVE-2022-27225\n", - "17 0.008850000 0.244680000 2022-04-17 CVE-2022-27225\n", - "18 0.008850000 0.244660000 2022-04-16 CVE-2022-27225\n", - "19 0.008850000 0.244340000 2022-04-15 CVE-2022-27225\n", - "20 0.008850000 0.244030000 2022-04-14 CVE-2022-27225\n", - "21 0.008850000 0.244120000 2022-04-13 CVE-2022-27225\n", - "22 0.008850000 0.243790000 2022-04-12 CVE-2022-27225\n", - "23 0.008850000 0.243390000 2022-04-11 CVE-2022-27225\n", - "24 0.008850000 0.243270000 2022-04-10 CVE-2022-27225\n", - "25 0.008850000 0.243240000 2022-04-09 CVE-2022-27225\n", - "26 0.008850000 0.242790000 2022-04-08 CVE-2022-27225\n", - "27 0.008850000 0.242790000 2022-04-07 CVE-2022-27225\n", - "28 0.008850000 0.242790000 2022-04-06 CVE-2022-27225\n", - "29 0.008850000 0.242810000 2022-04-05 CVE-2022-27225\n", - "30 0.008850000 0.246240000 2022-05-05 CVE-2022-27225" - ], "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", "
cveepsspercentiledate
270.0088500000.2427900002022-04-07CVE-2022-27225CVE-2007-24470.794030.994302022-05-11
280.0088500000.2427900002022-04-06CVE-2022-27225CVE-2022-238520.123000.949752022-05-11
290.0088500000.2428100002022-04-05CVE-2022-27225CVE-2022-13880.235790.965062022-05-11
300.0088500000.2462400002022-05-05CVE-2022-27225CVE-2020-255400.739570.992292022-05-11
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " + "
" + ], + "text/plain": [ + "cve epss percentile date\n", + "CVE-2007-2447 0.79403 0.99430 2022-05-11\n", + "CVE-2022-23852 0.12300 0.94975 2022-05-11\n", + "CVE-2022-1388 0.23579 0.96506 2022-05-11\n", + "CVE-2020-25540 0.73957 0.99229 2022-05-11" ] }, + "execution_count": 56, "metadata": {}, - "execution_count": 195 + "output_type": "execute_result" } + ], + "source": [ + "all_df,status = epss.get_all()\n", + "assert len(all_df)>1000\n", + "assert all_df.columns.tolist()== ['epss', 'percentile', 'date']\n", + "all_df.head(4)" ] }, { "cell_type": "code", - "source": [ - "" - ], - "metadata": { - "id": "z3wSlWjl6S1A" - }, "execution_count": null, - "outputs": [] + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "name": "epss_lib.ipynb", + "provenance": [] + }, + "interpreter": { + "hash": "af6884b45a73264763f36d110d675e21c5b9ede8d799332244b48ac88600c464" + }, + "kernelspec": { + "display_name": "Python 3.8.13 ('epss')", + "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.8.13" } - ] -} \ No newline at end of file + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/libraries/python/requirements.txt b/libraries/python/requirements.txt new file mode 100644 index 0000000..a94cf69 --- /dev/null +++ b/libraries/python/requirements.txt @@ -0,0 +1,2 @@ +requests +pandas \ No newline at end of file From 865f574f571d766cedb06181243b0f1e5ef0d54b Mon Sep 17 00:00:00 2001 From: priamai Date: Fri, 13 May 2022 09:43:04 +0100 Subject: [PATCH 3/7] now using the pip package --- .idea/.gitignore | 3 - libraries/python/epss_lib.ipynb | 1379 ------------------------- libraries/python/requirements.txt | 2 - notebooks/jupyter/epss_tutorial.ipynb | 407 ++++---- 4 files changed, 233 insertions(+), 1558 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 libraries/python/epss_lib.ipynb delete mode 100644 libraries/python/requirements.txt diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 26d3352..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/libraries/python/epss_lib.ipynb b/libraries/python/epss_lib.ipynb deleted file mode 100644 index 56812a4..0000000 --- a/libraries/python/epss_lib.ipynb +++ /dev/null @@ -1,1379 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 58, - "metadata": { - "id": "Q55EHKcA9pgu" - }, - "outputs": [], - "source": [ - "import requests\n", - "import pandas as pd\n", - "from datetime import datetime\n", - "import logging\n", - "\n", - "class Status(object):\n", - " def __init__(self, **kwargs):\n", - " self.__dict__.update(kwargs)\n", - "\n", - " def __str__(self):\n", - " return str(self.__dict__)\n", - "\n", - "class EPSS():\n", - "\n", - " def __init__(self,api_url='https://api.first.org/data/v1/'):\n", - " self.api_url = api_url\n", - " self.raw_url = \"https://epss.cyentia.com/\"\n", - "\n", - " def validate_date(self,date_text):\n", - " try:\n", - " datetime.strptime(date_text, '%Y-%m-%d')\n", - " except ValueError:\n", - " raise ValueError(\"Incorrect data format, should be YYYY-MM-DD\")\n", - "\n", - " def get_all(self,date:str=None)-> pd.DataFrame:\n", - " if date is None:\n", - " day_url = self.raw_url + 'epss_scores-current.csv.gz'\n", - " date = datetime.today().strftime('%Y-%m-%d')\n", - " elif type(date) is str:\n", - " self.validate_date(date)\n", - " day_url = self.raw_url + 'epss_scores-{date}.csv.gz'\n", - " else:\n", - " raise Exception('Date is invalid')\n", - " \n", - " epss_df = pd.read_csv(day_url,compression='gzip',sep=',')\n", - " if len(epss_df) > 0 :\n", - " logging.info('Done with total rows = %d' % len(epss_df))\n", - " header = epss_df.iloc[0]\n", - " if len(header)==2:\n", - " version = header.index[0].split(':')[1]\n", - " score_date = ''.join(header.index[1].split(':')[1:])\n", - " epss_df.columns = epss_df.iloc[0]\n", - " num_df = epss_df.iloc[1:].copy()\n", - " del epss_df\n", - " num_df['epss']=num_df['epss'].astype('float')\n", - " num_df['percentile']=num_df['percentile'].astype('float')\n", - " num_df['date']=date\n", - " #num_df.set_index('cve',inplace=True)\n", - " status = Status(version=version,score_date=score_date)\n", - " return num_df,status\n", - " else:\n", - " raise Exception('EPSS format is malformed')\n", - "\n", - " def get(self,cve=None,envelope:bool=True,pretty:bool=False,offset:int=None,limit:int=None,order:bool=True,sort_fields:list=None,\n", - " date:str=None,scope:str='public',epss_gt:float=None,epss_lt:float=None,fields:list=None,\n", - " percentile_gt:float=None,percentile_lt:float=None,q:str=None)-> pd.DataFrame:\n", - "\n", - " '''\n", - " Refer to parameters here: https://api.first.org/#Global-parameters\n", - " '''\n", - " url = self.api_url + 'epss'\n", - "\n", - " params = {}\n", - " if type(cve) is list:\n", - " params['cve'] = ','.join(cve)\n", - " if type(cve) is str:\n", - " params['cve'] = cve\n", - " if type(sort_fields) is list:\n", - " params['sort'] = ','.join(sort_fields)\n", - " if type(fields) is list:\n", - " params['fields'] = ','.join(fields)\n", - " if type(date) is str:\n", - " self.validate_date(date)\n", - " params['date'] = date\n", - " \n", - " params['envelope']=envelope\n", - " params['pretty']=pretty\n", - " params['offset']=offset\n", - " params['limit']=limit\n", - " params['scope']=scope\n", - " params['epss-gt']=epss_gt\n", - " params['epss-lt']=epss_lt\n", - " params['percentile-gt']=percentile_gt\n", - " params['percentile-lt']=percentile_lt\n", - " params['q']=q\n", - " \n", - " if order == False: params['order']='!epss'\n", - " \n", - " r = requests.get(url,params)\n", - "\n", - " if r.status_code == 200:\n", - " data_status = r.json()\n", - "\n", - " if params['scope']=='public':\n", - " df = pd.json_normalize(data_status, 'data')\n", - " df.set_index('cve',inplace=True)\n", - " elif params['scope']=='time-series':\n", - " # iterate through each vulnerability\n", - " df = pd.json_normalize(data_status, 'data')\n", - " tmp = []\n", - " for idx,ts in df.iterrows():\n", - " tmp_df = pd.DataFrame(ts['time-series'])\n", - " tmp_df['cve']=ts['cve']\n", - " tmp_df = tmp_df.append(ts.drop(labels=['time-series']), ignore_index=True)\n", - " #tmp_df = pd.concat([tmp_df,ts.drop(labels=['time-series'])])\n", - " tmp.append(tmp_df)\n", - " df = pd.concat(tmp)\n", - " df.set_index('cve',inplace=True)\n", - " else:\n", - " raise Exception('Scope not supported')\n", - "\n", - " del data_status['data']\n", - " if envelope is True:\n", - " status = Status(**data_status)\n", - " else:\n", - " status = None\n", - " return df,status\n", - " else:\n", - " raise Exception(f'HTTP errror {r.status_code}')\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "7lon1jqT-AnV", - "outputId": "2b15295d-9038-4fc9-9990-e11dc29969f4" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['CVE-2022-30524', 'CVE-2022-30335', 'CVE-2022-30334', 'CVE-2022-30333',\n", - " 'CVE-2022-30330', 'CVE-2022-30295', 'CVE-2022-30294', 'CVE-2022-30293',\n", - " 'CVE-2022-30292', 'CVE-2022-30288'],\n", - " dtype='object', name='cve')" - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "epss = EPSS()\n", - "data_df,status = epss.get(limit=10)\n", - "assert len(data_df)==10\n", - "assert data_df.columns.tolist()== ['epss', 'percentile', 'date']\n", - "data_df.index" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 143 - }, - "id": "9YWZ8c4J-w2m", - "outputId": "8139af22-6d77-4b67-fd7a-3bcd19eecd0a" - }, - "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", - "
epsspercentiledate
cve
CVE-2022-305240.0105500000.4888900002022-05-10
CVE-2022-303350.0089000000.2706600002022-05-10
CVE-2022-303340.0095000000.2904900002022-05-10
CVE-2022-303330.0088500000.2468800002022-05-10
CVE-2022-303300.0088500000.2468800002022-05-10
CVE-2022-302950.0088500000.2468800002022-05-10
CVE-2022-302940.0088500000.2468800002022-05-10
CVE-2022-302930.0088500000.2468800002022-05-10
CVE-2022-302920.0088500000.2468800002022-05-10
CVE-2022-302880.0089000000.2706600002022-05-10
\n", - "
" - ], - "text/plain": [ - " epss percentile date\n", - "cve \n", - "CVE-2022-30524 0.010550000 0.488890000 2022-05-10\n", - "CVE-2022-30335 0.008900000 0.270660000 2022-05-10\n", - "CVE-2022-30334 0.009500000 0.290490000 2022-05-10\n", - "CVE-2022-30333 0.008850000 0.246880000 2022-05-10\n", - "CVE-2022-30330 0.008850000 0.246880000 2022-05-10\n", - "CVE-2022-30295 0.008850000 0.246880000 2022-05-10\n", - "CVE-2022-30294 0.008850000 0.246880000 2022-05-10\n", - "CVE-2022-30293 0.008850000 0.246880000 2022-05-10\n", - "CVE-2022-30292 0.008850000 0.246880000 2022-05-10\n", - "CVE-2022-30288 0.008900000 0.270660000 2022-05-10" - ] - }, - "execution_count": 60, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data_df,status = epss.get(sort_fields=['-epss'],limit=10)\n", - "data_df" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "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", - "
epsspercentiledate
cve
CVE-2022-305240.0105500000.4888900002022-05-10
CVE-2022-303350.0089000000.2706600002022-05-10
CVE-2022-303340.0095000000.2904900002022-05-10
CVE-2022-303330.0088500000.2468800002022-05-10
CVE-2022-303300.0088500000.2468800002022-05-10
CVE-2022-302950.0088500000.2468800002022-05-10
CVE-2022-302940.0088500000.2468800002022-05-10
CVE-2022-302930.0088500000.2468800002022-05-10
CVE-2022-302920.0088500000.2468800002022-05-10
CVE-2022-302880.0089000000.2706600002022-05-10
\n", - "
" - ], - "text/plain": [ - " epss percentile date\n", - "cve \n", - "CVE-2022-30524 0.010550000 0.488890000 2022-05-10\n", - "CVE-2022-30335 0.008900000 0.270660000 2022-05-10\n", - "CVE-2022-30334 0.009500000 0.290490000 2022-05-10\n", - "CVE-2022-30333 0.008850000 0.246880000 2022-05-10\n", - "CVE-2022-30330 0.008850000 0.246880000 2022-05-10\n", - "CVE-2022-30295 0.008850000 0.246880000 2022-05-10\n", - "CVE-2022-30294 0.008850000 0.246880000 2022-05-10\n", - "CVE-2022-30293 0.008850000 0.246880000 2022-05-10\n", - "CVE-2022-30292 0.008850000 0.246880000 2022-05-10\n", - "CVE-2022-30288 0.008900000 0.270660000 2022-05-10" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data_df,status = epss.get(sort_fields=['+epss'],limit=10)\n", - "data_df" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "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", - "
epss
cve
CVE-2022-305240.010550000
CVE-2022-303350.008900000
CVE-2022-303340.009500000
CVE-2022-303330.008850000
CVE-2022-303300.008850000
\n", - "
" - ], - "text/plain": [ - " epss\n", - "cve \n", - "CVE-2022-30524 0.010550000\n", - "CVE-2022-30335 0.008900000\n", - "CVE-2022-30334 0.009500000\n", - "CVE-2022-30333 0.008850000\n", - "CVE-2022-30330 0.008850000" - ] - }, - "execution_count": 62, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data_df,status = epss.get(fields=['cve','epss'],limit=5)\n", - "data_df" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 112 - }, - "id": "G1_FsUTG7Zzu", - "outputId": "515ff4e8-68a3-47d0-f1e6-de1a8b48ab7b" - }, - "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", - "
epsspercentiledate
cve
CVE-2021-404380.9722400001.0000000002022-05-10
CVE-2017-126350.9710900000.9999900002022-05-10
\n", - "
" - ], - "text/plain": [ - " epss percentile date\n", - "cve \n", - "CVE-2021-40438 0.972240000 1.000000000 2022-05-10\n", - "CVE-2017-12635 0.971090000 0.999990000 2022-05-10" - ] - }, - "execution_count": 63, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data_df,status = epss.get(order=False)\n", - "data_df.head(2)" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "f-deHgph6y_A", - "outputId": "78e2f441-bbd3-4296-fd37-8d9fd308278e" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "(1, 3)" - ] - }, - "execution_count": 64, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data_df,status = epss.get(epss_lt=0.0088)\n", - "data_df.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "8F6hYkWa7Ahj", - "outputId": "169cd152-e29d-4c72-ebee-8641cb55be82" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "(70, 3)" - ] - }, - "execution_count": 65, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data_df,status = epss.get(epss_gt=0.95)\n", - "data_df.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "iFCLRXh18X4p", - "outputId": "ea71c2b9-2a4e-4104-88c2-56586bcce643" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "(100, 3)" - ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data_df,status = epss.get(percentile_gt=0.98)\n", - "data_df.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "H_4IU0E98cjM", - "outputId": "2cd07d0c-e42a-48a0-b58a-5d5df246e683" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "(1, 3)" - ] - }, - "execution_count": 67, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data_df,status = epss.get(percentile_lt=0.1)\n", - "data_df.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 80 - }, - "id": "wOzrT-RovVkS", - "outputId": "fcd3cdbb-02ba-419d-f98c-ac23d0a02f1d" - }, - "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", - "
epsspercentiledate
cve
CVE-2022-272250.0088500000.2468800002022-05-10
\n", - "
" - ], - "text/plain": [ - " epss percentile date\n", - "cve \n", - "CVE-2022-27225 0.008850000 0.246880000 2022-05-10" - ] - }, - "execution_count": 68, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data_df,status = epss.get(cve='CVE-2022-27225',envelope=False)\n", - "data_df" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": { - "id": "k9V2Yp1Sx_PS" - }, - "outputs": [], - "source": [ - "status" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 143 - }, - "id": "-tfVlTL_wovv", - "outputId": "8a7ab08d-66f1-4b70-9b38-af63dcadf6b5" - }, - "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", - "
epsspercentiledate
cve
CVE-2022-272250.0088500000.2468800002022-05-10
CVE-2022-272230.0089000000.2706600002022-05-10
CVE-2022-272180.0088500000.2468800002022-05-10
\n", - "
" - ], - "text/plain": [ - " epss percentile date\n", - "cve \n", - "CVE-2022-27225 0.008850000 0.246880000 2022-05-10\n", - "CVE-2022-27223 0.008900000 0.270660000 2022-05-10\n", - "CVE-2022-27218 0.008850000 0.246880000 2022-05-10" - ] - }, - "execution_count": 70, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cve_list = ['CVE-2022-27225','CVE-2022-27223','CVE-2022-27218']\n", - "data_df,status = epss.get(cve=cve_list)\n", - "data_df" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 423 - }, - "id": "h7lCTccyxNML", - "outputId": "d25efd2f-8e9a-488e-adb5-2c1d71693391" - }, - "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", - "
epsspercentiledate
cve
CVE-2022-263320.0088500000.1115300002022-03-01
CVE-2022-263150.0088500000.1115300002022-03-01
CVE-2022-261810.0089000000.1276800002022-03-01
CVE-2022-261590.0141200000.5073300002022-03-01
CVE-2022-261580.0088500000.1115300002022-03-01
............
CVE-2022-252060.0088500000.1115300002022-03-01
CVE-2022-252050.0088500000.1115300002022-03-01
CVE-2022-252040.0088500000.1115300002022-03-01
CVE-2022-252030.0088500000.1115300002022-03-01
CVE-2022-252020.0088500000.1115300002022-03-01
\n", - "

100 rows × 3 columns

\n", - "
" - ], - "text/plain": [ - " epss percentile date\n", - "cve \n", - "CVE-2022-26332 0.008850000 0.111530000 2022-03-01\n", - "CVE-2022-26315 0.008850000 0.111530000 2022-03-01\n", - "CVE-2022-26181 0.008900000 0.127680000 2022-03-01\n", - "CVE-2022-26159 0.014120000 0.507330000 2022-03-01\n", - "CVE-2022-26158 0.008850000 0.111530000 2022-03-01\n", - "... ... ... ...\n", - "CVE-2022-25206 0.008850000 0.111530000 2022-03-01\n", - "CVE-2022-25205 0.008850000 0.111530000 2022-03-01\n", - "CVE-2022-25204 0.008850000 0.111530000 2022-03-01\n", - "CVE-2022-25203 0.008850000 0.111530000 2022-03-01\n", - "CVE-2022-25202 0.008850000 0.111530000 2022-03-01\n", - "\n", - "[100 rows x 3 columns]" - ] - }, - "execution_count": 71, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data_df,status = epss.get(date='2022-03-01')\n", - "data_df" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 423 - }, - "id": "guqW-VRsy9to", - "outputId": "8df54279-e5f6-4c13-e779-8741f48e6916" - }, - "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", - "
epsspercentiledate0
cve
CVE-2022-272250.0088500000.2466700002022-05-09NaN
CVE-2022-272250.0088500000.2466700002022-05-08NaN
CVE-2022-272250.0088500000.2466400002022-05-07NaN
CVE-2022-272250.0088500000.2465900002022-05-06NaN
CVE-2022-272250.0088500000.2462400002022-05-05NaN
...............
CVE-2022-272180.0088500000.2432700002022-04-10NaN
NaNNaNNaNNaNCVE-2022-27218
NaNNaNNaNNaN0.008850000
NaNNaNNaNNaN0.246880000
NaNNaNNaNNaN2022-05-10
\n", - "

102 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " epss percentile date 0\n", - "cve \n", - "CVE-2022-27225 0.008850000 0.246670000 2022-05-09 NaN\n", - "CVE-2022-27225 0.008850000 0.246670000 2022-05-08 NaN\n", - "CVE-2022-27225 0.008850000 0.246640000 2022-05-07 NaN\n", - "CVE-2022-27225 0.008850000 0.246590000 2022-05-06 NaN\n", - "CVE-2022-27225 0.008850000 0.246240000 2022-05-05 NaN\n", - "... ... ... ... ...\n", - "CVE-2022-27218 0.008850000 0.243270000 2022-04-10 NaN\n", - "NaN NaN NaN NaN CVE-2022-27218\n", - "NaN NaN NaN NaN 0.008850000\n", - "NaN NaN NaN NaN 0.246880000\n", - "NaN NaN NaN NaN 2022-05-10\n", - "\n", - "[102 rows x 4 columns]" - ] - }, - "execution_count": 72, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data_df,status = epss.get(cve=cve_list,scope='time-series')\n", - "data_df" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "id": "ZzQpmB0d0zSd", - "outputId": "dfd05938-9d79-4759-8afd-e9f67e6c9077" - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\robom\\AppData\\Local\\Temp\\ipykernel_40540\\3998398855.py:104: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", - " tmp_df = tmp_df.append(ts.drop(labels=['time-series']), ignore_index=True)\n" - ] - }, - { - "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", - "
epsspercentiledate
cve
CVE-2022-272250.0088500000.2466700002022-05-09
CVE-2022-272250.0088500000.2466700002022-05-08
CVE-2022-272250.0088500000.2466400002022-05-07
CVE-2022-272250.0088500000.2465900002022-05-06
\n", - "
" - ], - "text/plain": [ - " epss percentile date\n", - "cve \n", - "CVE-2022-27225 0.008850000 0.246670000 2022-05-09\n", - "CVE-2022-27225 0.008850000 0.246670000 2022-05-08\n", - "CVE-2022-27225 0.008850000 0.246640000 2022-05-07\n", - "CVE-2022-27225 0.008850000 0.246590000 2022-05-06" - ] - }, - "execution_count": 57, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data_df,status = epss.get(cve='CVE-2022-27225',scope='time-series')\n", - "data_df.head(4)" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": { - "id": "z3wSlWjl6S1A" - }, - "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", - "
cveepsspercentiledate
CVE-2007-24470.794030.994302022-05-11
CVE-2022-238520.123000.949752022-05-11
CVE-2022-13880.235790.965062022-05-11
CVE-2020-255400.739570.992292022-05-11
\n", - "
" - ], - "text/plain": [ - "cve epss percentile date\n", - "CVE-2007-2447 0.79403 0.99430 2022-05-11\n", - "CVE-2022-23852 0.12300 0.94975 2022-05-11\n", - "CVE-2022-1388 0.23579 0.96506 2022-05-11\n", - "CVE-2020-25540 0.73957 0.99229 2022-05-11" - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "all_df,status = epss.get_all()\n", - "assert len(all_df)>1000\n", - "assert all_df.columns.tolist()== ['epss', 'percentile', 'date']\n", - "all_df.head(4)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "colab": { - "collapsed_sections": [], - "name": "epss_lib.ipynb", - "provenance": [] - }, - "interpreter": { - "hash": "af6884b45a73264763f36d110d675e21c5b9ede8d799332244b48ac88600c464" - }, - "kernelspec": { - "display_name": "Python 3.8.13 ('epss')", - "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.8.13" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/libraries/python/requirements.txt b/libraries/python/requirements.txt deleted file mode 100644 index a94cf69..0000000 --- a/libraries/python/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -requests -pandas \ No newline at end of file diff --git a/notebooks/jupyter/epss_tutorial.ipynb b/notebooks/jupyter/epss_tutorial.ipynb index d53acaa..b421b7d 100644 --- a/notebooks/jupyter/epss_tutorial.ipynb +++ b/notebooks/jupyter/epss_tutorial.ipynb @@ -1,87 +1,107 @@ { - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "name": "epss_tutorial.ipynb", - "provenance": [], - "collapsed_sections": [] - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" - } - }, "cells": [ { "cell_type": "markdown", - "source": [ - "# This notebooks shows how to process the raw daily feed" - ], "metadata": { "id": "SosTVme_R2C_" - } + }, + "source": [ + "# This notebooks shows how to process the raw daily feed" + ] }, { - "cell_type": "code", + "cell_type": "markdown", + "metadata": {}, "source": [ - "import pandas as pd\n", - "import logging\n", - "\n", - "logging.basicConfig(\n", - " level=logging.INFO # allow DEBUG level messages to pass through the logger\n", - " )\n", - "\n", - "DAY_URL = \"https://epss.cyentia.com/epss_scores-current.csv.gz\"\n", - "\n", - "def load_data(day_url = DAY_URL):\n", - " try:\n", - " logging.info('Downloading day feed')\n", - " epss_df = pd.read_csv(DAY_URL,compression='gzip',sep=',')\n", - " if len(epss_df) > 0 :\n", - " logging.info('Done with total rows = %d' % len(epss_df))\n", - " header = epss_df.iloc[0]\n", - " if len(header)==2:\n", - " version = header.index[0].split(':')[1]\n", - " score_date = ''.join(header.index[1].split(':')[1:])\n", - " epss_df.columns = epss_df.iloc[0]\n", - " num_df = epss_df.iloc[1:].copy()\n", - " del epss_df\n", - " num_df['epss']=num_df['epss'].astype('float')\n", - " num_df['percentile']=num_df['percentile'].astype('float')\n", - " return (version,score_date,num_df)\n", - " else:\n", - " raise Exception('EPSS format is malformed')\n", - " except Exception as ep:\n", - " logging.error(ep)" - ], + "## Install dependencies" + ] + }, + { + "cell_type": "code", + "execution_count": 6, "metadata": { "id": "QRUM0QFfR4lb" }, - "execution_count": 1, - "outputs": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: https://test.pypi.org/simple/\n", + "Requirement already satisfied: epss in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (0.1.1)\n", + "Requirement already satisfied: Click>=7.0 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from epss) (8.0.4)\n", + "Requirement already satisfied: colorama in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from Click>=7.0->epss) (0.4.4)\n", + "Collecting matplotlib\n", + " Downloading matplotlib-3.5.2-cp38-cp38-win_amd64.whl (7.2 MB)\n", + "Requirement already satisfied: numpy>=1.17 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from matplotlib) (1.21.5)\n", + "Collecting pillow>=6.2.0\n", + " Downloading Pillow-9.1.0-cp38-cp38-win_amd64.whl (3.3 MB)\n", + "Requirement already satisfied: pyparsing>=2.2.1 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from matplotlib) (3.0.9)\n", + "Requirement already satisfied: python-dateutil>=2.7 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from matplotlib) (2.8.2)\n", + "Collecting fonttools>=4.22.0\n", + " Downloading fonttools-4.33.3-py3-none-any.whl (930 kB)\n", + "Collecting cycler>=0.10\n", + " Downloading cycler-0.11.0-py3-none-any.whl (6.4 kB)\n", + "Requirement already satisfied: packaging>=20.0 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from matplotlib) (21.3)\n", + "Collecting kiwisolver>=1.0.1\n", + " Downloading kiwisolver-1.4.2-cp38-cp38-win_amd64.whl (55 kB)\n", + "Requirement already satisfied: six>=1.5 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)\n", + "Installing collected packages: pillow, kiwisolver, fonttools, cycler, matplotlib\n", + "Successfully installed cycler-0.11.0 fonttools-4.33.3 kiwisolver-1.4.2 matplotlib-3.5.2 pillow-9.1.0\n" + ] + } + ], + "source": [ + "!pip install --upgrade epss\n", + "!pip install matplotlib" + ] }, { - "cell_type": "markdown", - "source": [ - "Show version, date and some basic stats" + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting seaborn\n", + " Downloading seaborn-0.11.2-py3-none-any.whl (292 kB)\n", + "Requirement already satisfied: matplotlib>=2.2 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from seaborn) (3.5.2)\n", + "Collecting scipy>=1.0\n", + " Downloading scipy-1.8.0-cp38-cp38-win_amd64.whl (36.9 MB)\n", + "Requirement already satisfied: pandas>=0.23 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from seaborn) (1.4.2)\n", + "Requirement already satisfied: numpy>=1.15 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from seaborn) (1.21.5)\n", + "Requirement already satisfied: python-dateutil>=2.7 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from matplotlib>=2.2->seaborn) (2.8.2)\n", + "Requirement already satisfied: pyparsing>=2.2.1 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from matplotlib>=2.2->seaborn) (3.0.9)\n", + "Requirement already satisfied: pillow>=6.2.0 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from matplotlib>=2.2->seaborn) (9.1.0)\n", + "Requirement already satisfied: packaging>=20.0 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from matplotlib>=2.2->seaborn) (21.3)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from matplotlib>=2.2->seaborn) (1.4.2)\n", + "Requirement already satisfied: fonttools>=4.22.0 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from matplotlib>=2.2->seaborn) (4.33.3)\n", + "Requirement already satisfied: cycler>=0.10 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from matplotlib>=2.2->seaborn) (0.11.0)\n", + "Requirement already satisfied: pytz>=2020.1 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from pandas>=0.23->seaborn) (2021.3)\n", + "Requirement already satisfied: six>=1.5 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from python-dateutil>=2.7->matplotlib>=2.2->seaborn) (1.16.0)\n", + "Installing collected packages: scipy, seaborn\n", + "Successfully installed scipy-1.8.0 seaborn-0.11.2\n" + ] + } ], + "source": [ + "!pip install seaborn" + ] + }, + { + "cell_type": "markdown", "metadata": { "id": "Ofod_SWsgZGh" - } + }, + "source": [ + "Show version, date and some basic stats" + ] }, { "cell_type": "code", - "source": [ - "(version,score_date,epss_df) = load_data()\n", - "logging.info(f'Date = {score_date} Version = {version}')\n", - "logging.info(f'Total entries {len(epss_df)}')\n", - "logging.info(f\"Total CVE {epss_df.index.nunique()}\")\n", - "assert len(epss_df) == epss_df.index.nunique()" - ], + "execution_count": 13, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -89,51 +109,58 @@ "id": "8uemrrOMd_j7", "outputId": "3b596356-cbfa-4483-a5ad-8708d797d14e" }, - "execution_count": 2, "outputs": [ { - "output_type": "stream", "name": "stderr", + "output_type": "stream", "text": [ - "INFO:root:Downloading day feed\n", - "INFO:root:Done with total rows = 175040\n", - "INFO:root:Date = 2022-05-02T000000+0000 Version = v2022.01.01\n", - "INFO:root:Total entries 175039\n", - "INFO:root:Total CVE 175039\n" + "INFO:root:Date = 2022-05-12T000000+0000 Version = v2022.01.01\n", + "INFO:root:Total entries 175924\n", + "INFO:root:Total CVE 175924\n" ] } + ], + "source": [ + "from epss import epss\n", + "import logging\n", + "\n", + "logging.basicConfig(level=logging.INFO)\n", + "\n", + "client = epss.EPSS()\n", + "epss_df,status = client.get_all()\n", + "\n", + "logging.info(f'Date = {status.score_date} Version = {status.version}')\n", + "logging.info(f'Total entries {len(epss_df)}')\n", + "logging.info(f\"Total CVE {epss_df.index.nunique()}\")\n", + "assert len(epss_df) == epss_df.index.nunique()\n" ] }, { "cell_type": "markdown", - "source": [ - "## Plot simple charts" - ], "metadata": { "id": "j-roxgT2iBg0" - } + }, + "source": [ + "## Plot simple charts" + ] }, { "cell_type": "code", + "execution_count": 14, + "metadata": { + "id": "Rv20lwNEh-Iu" + }, + "outputs": [], "source": [ "import matplotlib\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline " - ], - "metadata": { - "id": "Rv20lwNEh-Iu" - }, - "execution_count": 3, - "outputs": [] + ] }, { "cell_type": "code", - "source": [ - "epss_df.hist(column='epss', alpha=0.8,figsize=(10,4))\n", - "plt.title('Histogram of EPSS scores')\n", - "plt.show()" - ], + "execution_count": 15, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -142,29 +169,29 @@ "id": "kowj0J6bSEFS", "outputId": "dbab029e-28f7-4273-efb4-98799f003ad7" }, - "execution_count": 5, "outputs": [ { - "output_type": "display_data", "data": { + "image/png": "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", "text/plain": [ "
" - ], - "image/png": "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\n" + ] }, "metadata": { "needs_background": "light" - } + }, + "output_type": "display_data" } + ], + "source": [ + "epss_df.hist(column='epss', alpha=0.8,figsize=(10,4))\n", + "plt.title('Histogram of EPSS scores')\n", + "plt.show()" ] }, { "cell_type": "code", - "source": [ - "boxplot = epss_df.boxplot(column=['epss', 'percentile']) \n", - "plt.title('Box plot of score and percentiles')\n", - "plt.show()" - ], + "execution_count": 16, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -173,32 +200,29 @@ "id": "SdgP8zVhNmny", "outputId": "9701c809-6546-4572-f5fd-00db154d1f5d" }, - "execution_count": 6, "outputs": [ { - "output_type": "display_data", "data": { + "image/png": "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", "text/plain": [ "
" - ], - "image/png": "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\n" + ] }, "metadata": { "needs_background": "light" - } + }, + "output_type": "display_data" } + ], + "source": [ + "boxplot = epss_df.boxplot(column=['epss', 'percentile']) \n", + "plt.title('Box plot of score and percentiles')\n", + "plt.show()" ] }, { "cell_type": "code", - "source": [ - "import seaborn as sb\n", - "\n", - "sb.violinplot(x = 'epss',data = epss_df)\n", - "\n", - "# display\n", - "plt.show()" - ], + "execution_count": 19, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -207,101 +231,104 @@ "id": "gDRGxzWlOcue", "outputId": "de9b6fd9-65cc-4acb-8507-985d867483ec" }, - "execution_count": 7, "outputs": [ { - "output_type": "display_data", "data": { + "image/png": "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", "text/plain": [ "
" - ], - "image/png": "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\n" + ] }, "metadata": { "needs_background": "light" - } + }, + "output_type": "display_data" } + ], + "source": [ + "import seaborn as sb\n", + "\n", + "sb.violinplot(x = 'epss',data = epss_df)\n", + "\n", + "# display violin plot in log scale\n", + "plt.yscale('log')\n", + "plt.show()" ] }, { "cell_type": "code", - "source": [ - "sb.violinplot(x = 'percentile',data = epss_df)\n", - "\n", - "plt.show()" - ], + "execution_count": 20, "metadata": { - "id": "6ylEWBuIPPfv", - "outputId": "9387c035-bea8-4289-9114-66dde5aecd43", "colab": { "base_uri": "https://localhost:8080/", "height": 279 - } + }, + "id": "6ylEWBuIPPfv", + "outputId": "9387c035-bea8-4289-9114-66dde5aecd43" }, - "execution_count": 8, "outputs": [ { - "output_type": "display_data", "data": { + "image/png": "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", "text/plain": [ "
" - ], - "image/png": "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\n" + ] }, "metadata": { "needs_background": "light" - } + }, + "output_type": "display_data" } + ], + "source": [ + "sb.violinplot(x = 'percentile',data = epss_df)\n", + "\n", + "plt.show()" ] }, { "cell_type": "code", - "source": [ - "epss_df.hist(column='percentile',bins=100, alpha=0.5,figsize=(10,4))\n", - "plt.title('Histogram of percentile')\n", - "plt.show()" - ], + "execution_count": 21, "metadata": { - "id": "-Rr_9OZueVjq", "colab": { "base_uri": "https://localhost:8080/", "height": 281 }, + "id": "-Rr_9OZueVjq", "outputId": "0f3d2057-236d-45f4-9b54-0b1c35c9ec91" }, - "execution_count": 9, "outputs": [ { - "output_type": "display_data", "data": { + "image/png": "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", "text/plain": [ "
" - ], - "image/png": "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\n" + ] }, "metadata": { "needs_background": "light" - } + }, + "output_type": "display_data" } + ], + "source": [ + "epss_df.hist(column='percentile',bins=100, alpha=0.5,figsize=(10,4))\n", + "plt.title('Histogram of percentile')\n", + "plt.show()" ] }, { "cell_type": "markdown", - "source": [ - "## Top CVSS" - ], "metadata": { "id": "fxwECkaQLAlk" - } + }, + "source": [ + "## Top CVSS" + ] }, { "cell_type": "code", - "source": [ - "TOP = 20\n", - "epss_df.sort_values(by='epss',ascending=False).head(TOP).plot.bar(y='epss',figsize=(10,4))\n", - "plt.title(f'Top {TOP} CVE')\n", - "plt.show()" - ], + "execution_count": 22, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -310,29 +337,30 @@ "id": "VInnBipLKxgV", "outputId": "ed2df125-b31b-4484-df38-fc00074c9f90" }, - "execution_count": 10, "outputs": [ { - "output_type": "display_data", "data": { + "image/png": "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", "text/plain": [ "
" - ], - "image/png": "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\n" + ] }, "metadata": { "needs_background": "light" - } + }, + "output_type": "display_data" } + ], + "source": [ + "TOP = 20\n", + "epss_df.sort_values(by='epss',ascending=False).head(TOP).plot.bar(y='epss',figsize=(10,4))\n", + "plt.title(f'Top {TOP} CVE')\n", + "plt.show()" ] }, { "cell_type": "code", - "source": [ - "epss_df.sort_values(by='epss',ascending=True).head(TOP).plot.bar(y='epss',figsize=(10,4))\n", - "plt.title(f'Bottom {TOP} CVE')\n", - "plt.show()" - ], + "execution_count": 23, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -341,41 +369,72 @@ "id": "ELG9qZSkLKpp", "outputId": "2580d5fe-8143-49c1-9aba-2c17802dcb06" }, - "execution_count": 11, "outputs": [ { - "output_type": "display_data", "data": { + "image/png": "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", "text/plain": [ "
" - ], - "image/png": "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\n" + ] }, "metadata": { "needs_background": "light" - } + }, + "output_type": "display_data" } + ], + "source": [ + "epss_df.sort_values(by='epss',ascending=True).head(TOP).plot.bar(y='epss',figsize=(10,4))\n", + "plt.title(f'Bottom {TOP} CVE')\n", + "plt.show()" ] }, { "cell_type": "markdown", - "source": [ - "# All done!" - ], "metadata": { "id": "zUyCVYQ0Y7DU" - } + }, + "source": [ + "# All done!" + ] }, { "cell_type": "code", - "source": [ - "" - ], + "execution_count": null, "metadata": { "id": "zVBocSl0Y5Gy" }, - "execution_count": null, - "outputs": [] + "outputs": [], + "source": [] } - ] -} \ No newline at end of file + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "name": "epss_tutorial.ipynb", + "provenance": [] + }, + "interpreter": { + "hash": "af6884b45a73264763f36d110d675e21c5b9ede8d799332244b48ac88600c464" + }, + "kernelspec": { + "display_name": "Python 3.8.13 ('epss')", + "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.8.13" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} From d1e3c0a9c7ebde0c8dbf4ce8548bee8a172e38a7 Mon Sep 17 00:00:00 2001 From: priamai Date: Fri, 13 May 2022 12:24:37 +0100 Subject: [PATCH 4/7] example with nvd --- notebooks/jupyter/epss_nvd_tutorial.ipynb | 375 ++++++++++++++++++++++ 1 file changed, 375 insertions(+) create mode 100644 notebooks/jupyter/epss_nvd_tutorial.ipynb diff --git a/notebooks/jupyter/epss_nvd_tutorial.ipynb b/notebooks/jupyter/epss_nvd_tutorial.ipynb new file mode 100644 index 0000000..852892c --- /dev/null +++ b/notebooks/jupyter/epss_nvd_tutorial.ipynb @@ -0,0 +1,375 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: epss in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (0.1.1)\n", + "Requirement already satisfied: Click>=7.0 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from epss) (8.0.4)\n", + "Requirement already satisfied: colorama in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from Click>=7.0->epss) (0.4.4)\n", + "Collecting nvdlib\n", + " Downloading nvdlib-0.5.6-py3-none-any.whl (10 kB)\n", + "Requirement already satisfied: requests in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from nvdlib) (2.27.1)\n", + "Requirement already satisfied: urllib3<1.27,>=1.21.1 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from requests->nvdlib) (1.26.9)\n", + "Requirement already satisfied: certifi>=2017.4.17 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from requests->nvdlib) (2021.10.8)\n", + "Requirement already satisfied: idna<4,>=2.5 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from requests->nvdlib) (3.3)\n", + "Requirement already satisfied: charset-normalizer~=2.0.0 in d:\\users\\robom\\anaconda3\\envs\\epss\\lib\\site-packages (from requests->nvdlib) (2.0.4)\n", + "Installing collected packages: nvdlib\n", + "Successfully installed nvdlib-0.5.6\n" + ] + } + ], + "source": [ + "# Install depdendeces\n", + "!pip install --upgrade epss\n", + "!pip install nvdlib" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "from epss import epss\n", + "import nvdlib\n", + "import logging\n", + "\n", + "logging.basicConfig(level=logging.INFO)\n", + "\n", + "# key (str) – NVD API Key. Allows for a request every 0.6 seconds instead of 6 seconds.\n", + "\n", + "def add_cvss(cveid,API_KEY=None):\n", + " r = nvdlib.getCVE(cveid,key=API_KEY)\n", + " scores = r.score\n", + " return scores\n", + "\n", + "client = epss.EPSS()\n", + "epss_df,status = client.get(date='2022-05-01',limit=10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:Got 10 cve\n" + ] + } + ], + "source": [ + "logging.info(f'Got {len(epss_df)} cve')" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "epss_df.reset_index(inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "# remember that the NVD has throttling even with 10 will be slow\n", + "\n", + "epss_df[['version','score','severity']]=epss_df.apply(lambda x:add_cvss(x['cve']),axis=1, result_type=\"expand\")" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "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", + "
cveepsspercentiledateversionscoreseverity
0CVE-2022-299670.0088500000.2458100002022-05-01V37.5HIGH
1CVE-2022-299470.0088500000.2458100002022-05-01V36.1MEDIUM
2CVE-2022-299450.0089000000.2696200002022-05-01NoneNaNNone
3CVE-2022-299370.0088500000.2458100002022-05-01V38.8HIGH
4CVE-2022-299360.0272200000.8134200002022-05-01V38.8HIGH
5CVE-2022-299350.0088500000.2458100002022-05-01V37.5HIGH
6CVE-2022-299340.0088500000.2458100002022-05-01V37.8HIGH
7CVE-2022-299070.0088500000.2458100002022-05-01V36.1MEDIUM
8CVE-2022-299060.0088500000.2458100002022-05-01V39.8CRITICAL
9CVE-2022-299050.0088500000.2458100002022-05-01V34.3MEDIUM
\n", + "
" + ], + "text/plain": [ + " cve epss percentile date version score \\\n", + "0 CVE-2022-29967 0.008850000 0.245810000 2022-05-01 V3 7.5 \n", + "1 CVE-2022-29947 0.008850000 0.245810000 2022-05-01 V3 6.1 \n", + "2 CVE-2022-29945 0.008900000 0.269620000 2022-05-01 None NaN \n", + "3 CVE-2022-29937 0.008850000 0.245810000 2022-05-01 V3 8.8 \n", + "4 CVE-2022-29936 0.027220000 0.813420000 2022-05-01 V3 8.8 \n", + "5 CVE-2022-29935 0.008850000 0.245810000 2022-05-01 V3 7.5 \n", + "6 CVE-2022-29934 0.008850000 0.245810000 2022-05-01 V3 7.8 \n", + "7 CVE-2022-29907 0.008850000 0.245810000 2022-05-01 V3 6.1 \n", + "8 CVE-2022-29906 0.008850000 0.245810000 2022-05-01 V3 9.8 \n", + "9 CVE-2022-29905 0.008850000 0.245810000 2022-05-01 V3 4.3 \n", + "\n", + " severity \n", + "0 HIGH \n", + "1 MEDIUM \n", + "2 None \n", + "3 HIGH \n", + "4 HIGH \n", + "5 HIGH \n", + "6 HIGH \n", + "7 MEDIUM \n", + "8 CRITICAL \n", + "9 MEDIUM " + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#display the vulnerabilities\n", + "epss_df" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "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", + "
cveepsspercentiledateversionscoreseverity
2CVE-2022-299450.0089000000.2696200002022-05-01NoneNaNNone
\n", + "
" + ], + "text/plain": [ + " cve epss percentile date version score \\\n", + "2 CVE-2022-29945 0.008900000 0.269620000 2022-05-01 None NaN \n", + "\n", + " severity \n", + "2 None " + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# which cve are new?\n", + "epss_df[epss_df.severity.isnull()]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "interpreter": { + "hash": "af6884b45a73264763f36d110d675e21c5b9ede8d799332244b48ac88600c464" + }, + "kernelspec": { + "display_name": "Python 3.8.13 ('epss')", + "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.8.13" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 3310b31d59a685eb6891740f6ad35610053eabd1 Mon Sep 17 00:00:00 2001 From: priamai <57333254+priamai@users.noreply.github.com> Date: Thu, 26 May 2022 16:42:41 +0100 Subject: [PATCH 5/7] added cisa tutorial --- notebooks/jupyter/cisa_tutorial.ipynb | 558 ++++++++++++++++++++++++++ 1 file changed, 558 insertions(+) create mode 100644 notebooks/jupyter/cisa_tutorial.ipynb diff --git a/notebooks/jupyter/cisa_tutorial.ipynb b/notebooks/jupyter/cisa_tutorial.ipynb new file mode 100644 index 0000000..c2d0d5a --- /dev/null +++ b/notebooks/jupyter/cisa_tutorial.ipynb @@ -0,0 +1,558 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "cisa_tutorial.ipynb", + "provenance": [], + "collapsed_sections": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "F6bqca0A34Hf", + "outputId": "ae6eb415-24c3-40b5-ecfe-aefc67b7aff8" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", + "Collecting epss\n", + " Downloading epss-0.1.1-py2.py3-none-any.whl (4.9 kB)\n", + "Requirement already satisfied: Click>=7.0 in /usr/local/lib/python3.7/dist-packages (from epss) (7.1.2)\n", + "Installing collected packages: epss\n", + "Successfully installed epss-0.1.1\n" + ] + } + ], + "source": [ + "!pip install --upgrade epss" + ] + }, + { + "cell_type": "code", + "source": [ + "import requests\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt " + ], + "metadata": { + "id": "95OJ7z2j3-z2" + }, + "execution_count": 39, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "Download CISA vulnerabilities" + ], + "metadata": { + "id": "TjaBdglO4Gqg" + } + }, + { + "cell_type": "code", + "source": [ + "cisa_df = pd.read_csv('https://www.cisa.gov/sites/default/files/csv/known_exploited_vulnerabilities.csv',parse_dates=['dateAdded','dueDate'])\n", + "\n", + "\n", + "cisa_df.set_index(\"dateAdded\").resample('M').size().plot.bar(figsize=(10,4),title='Total CVE by CISA published by month')\n", + "plt.show()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 390 + }, + "id": "MHjuRYxc4IYn", + "outputId": "8819414b-3490-4684-e27a-400fd2ff56ff" + }, + "execution_count": 43, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "source": [ + "cisa_df.columns" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "08XpR3dY4NDo", + "outputId": "29e0950f-4841-4f28-d04b-4f265eb5dac3" + }, + "execution_count": 44, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Index(['cveID', 'vendorProject', 'product', 'vulnerabilityName', 'dateAdded',\n", + " 'shortDescription', 'requiredAction', 'dueDate', 'notes'],\n", + " dtype='object')" + ] + }, + "metadata": {}, + "execution_count": 44 + } + ] + }, + { + "cell_type": "code", + "source": [ + "cisa_df.dtypes" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "BxvZ991q4URh", + "outputId": "dd2ddba0-efa5-4021-b744-1ffa87b3491e" + }, + "execution_count": 45, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "cveID object\n", + "vendorProject object\n", + "product object\n", + "vulnerabilityName object\n", + "dateAdded datetime64[ns]\n", + "shortDescription object\n", + "requiredAction object\n", + "dueDate datetime64[ns]\n", + "notes float64\n", + "dtype: object" + ] + }, + "metadata": {}, + "execution_count": 45 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Take the vulns published by CISA yesterday" + ], + "metadata": { + "id": "YJKM7M2EBVJr" + } + }, + { + "cell_type": "code", + "source": [ + "# Filter CVE from this month for example\n", + "month_df = cisa_df.loc[(cisa_df['dateAdded'] >= '2022-05-25')]\n", + "month_df.shape" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "zm8czfzl4VHE", + "outputId": "cea4c03e-77cd-4146-8a95-c95712e3ece9" + }, + "execution_count": 61, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(34, 9)" + ] + }, + "metadata": {}, + "execution_count": 61 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Now let's find the EPSS scores for those vulns" + ], + "metadata": { + "id": "xi6BqEnx9jiT" + } + }, + { + "cell_type": "code", + "source": [ + "from epss import epss\n", + "import logging\n", + "\n", + "logging.basicConfig(level=logging.INFO)\n", + "client = epss.EPSS()" + ], + "metadata": { + "id": "qUlSHR5n47iQ" + }, + "execution_count": 62, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "found = []\n", + "for idx,row in month_df.iterrows():\n", + " epss_df,status=client.get(cve=row['cveID'])\n", + " if epss_df.shape[0]>0:\n", + " found.append(epss_df)\n", + "epss_df = pd.concat(found)" + ], + "metadata": { + "id": "rLkrSo0M9pIc" + }, + "execution_count": 64, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "enrich_df = pd.merge(month_df,epss_df,left_on=['cveID'],right_index=True)\n", + "enrich_df['epss']=enrich_df['epss'].astype(float)" + ], + "metadata": { + "id": "A6WdcOsO96vJ" + }, + "execution_count": 78, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "enrich_df.head(5)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 337 + }, + "id": "JYyvkJz_9_M5", + "outputId": "8c7cad20-2ffe-42bf-c8cc-4a7977321eb8" + }, + "execution_count": 79, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " cveID vendorProject product \\\n", + "703 CVE-2019-3010 Oracle Solaris \n", + "704 CVE-2016-3393 Microsoft Windows \n", + "705 CVE-2016-7256 Microsoft Windows \n", + "706 CVE-2016-1010 Adobe Flash Player and AIR \n", + "707 CVE-2016-0984 Adobe Flash Player and AIR \n", + "\n", + " vulnerabilityName dateAdded \\\n", + "703 Oracle Solaris Privilege Escalation Vulnerability 2022-05-25 \n", + "704 Microsoft Windows Graphics Device Interface (G... 2022-05-25 \n", + "705 Microsoft Windows Open Type Font Remote Code E... 2022-05-25 \n", + "706 Adobe Flash Player and AIR Integer Overflow Vu... 2022-05-25 \n", + "707 Adobe Flash Player and AIR Use-After-Free Vuln... 2022-05-25 \n", + "\n", + " shortDescription \\\n", + "703 Oracle Solaris component: XScreenSaver contain... \n", + "704 A remote code execution vulnerability exists d... \n", + "705 A remote code execution vulnerability exists w... \n", + "706 Integer overflow vulnerability in Adobe Flash ... \n", + "707 Use-after-free vulnerability in Adobe Flash Pl... \n", + "\n", + " requiredAction dueDate notes \\\n", + "703 Apply updates per vendor instructions. 2022-06-15 NaN \n", + "704 Apply updates per vendor instructions. 2022-06-15 NaN \n", + "705 Apply updates per vendor instructions. 2022-06-15 NaN \n", + "706 The impacted products are end-of-life and shou... 2022-06-15 NaN \n", + "707 The impacted products are end-of-life and shou... 2022-06-15 NaN \n", + "\n", + " epss percentile date \n", + "703 0.17164 0.959200000 2022-05-26 \n", + "704 0.32828 0.975110000 2022-05-26 \n", + "705 0.31179 0.974380000 2022-05-26 \n", + "706 0.03731 0.838300000 2022-05-26 \n", + "707 0.84976 0.996390000 2022-05-26 " + ], + "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", + "
cveIDvendorProjectproductvulnerabilityNamedateAddedshortDescriptionrequiredActiondueDatenotesepsspercentiledate
703CVE-2019-3010OracleSolarisOracle Solaris Privilege Escalation Vulnerability2022-05-25Oracle Solaris component: XScreenSaver contain...Apply updates per vendor instructions.2022-06-15NaN0.171640.9592000002022-05-26
704CVE-2016-3393MicrosoftWindowsMicrosoft Windows Graphics Device Interface (G...2022-05-25A remote code execution vulnerability exists d...Apply updates per vendor instructions.2022-06-15NaN0.328280.9751100002022-05-26
705CVE-2016-7256MicrosoftWindowsMicrosoft Windows Open Type Font Remote Code E...2022-05-25A remote code execution vulnerability exists w...Apply updates per vendor instructions.2022-06-15NaN0.311790.9743800002022-05-26
706CVE-2016-1010AdobeFlash Player and AIRAdobe Flash Player and AIR Integer Overflow Vu...2022-05-25Integer overflow vulnerability in Adobe Flash ...The impacted products are end-of-life and shou...2022-06-15NaN0.037310.8383000002022-05-26
707CVE-2016-0984AdobeFlash Player and AIRAdobe Flash Player and AIR Use-After-Free Vuln...2022-05-25Use-after-free vulnerability in Adobe Flash Pl...The impacted products are end-of-life and shou...2022-06-15NaN0.849760.9963900002022-05-26
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 79 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Sort by EPSS" + ], + "metadata": { + "id": "qSwWCLkNBSHe" + } + }, + { + "cell_type": "code", + "source": [ + "# sort by epss\n", + "enrich_df.sort_values(by='epss',ascending=False).plot.bar(x='cveID',y='epss',title='Top latest CISA by EPSS',figsize=(10,6))\n", + "plt.show()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 472 + }, + "id": "mCqs5pML_jqK", + "outputId": "cf6c8a74-fed7-411a-a09b-a0a084736d21" + }, + "execution_count": 84, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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52zgcuD6iPj5ZIFk5mmUy4Qvbtbx06aOn51k8VspZ5q+GRG/pCQc3wZeExEbUfqL/Usz4m3icS2ln9NUl/o+C1wILG+2x78PxLeCst0T+OoU64D7Ri4OPvYdUeYOYDHwv5TpEL5NSUpf1Lz/C8p2/yFwM/Au4M8GRvtJ6liUP/QkjbtmaoKTm75DmkUR8SHgx5n5hpELS1rnTdUnQJI0TRGxGPgDYNSIQEljwst8ktSRiHgr5bLbPzaXCyXdD3iZT5IkqYJnpiRJkiqYTEmSJFWYtw7o2267bS5evHi+Pl6SJKm1Cy+88OeZOelNy+ctmVq8eDEXXHDBfH28JElSaxHxg7W952U+SZKkCiZTkiRJFUymJEmSKjgDuiRJGunOO+9k5cqV3H777fMdyqzaaKONWLRoEQsXLmxdxmRKkiSNtHLlSjbbbDMWL15MRMx3OLMiM7nhhhtYuXIlO+20U+tyXuaTJEkj3X777WyzzTZjm0gBRATbbLPNtM++mUxJkqRWxjmRmjCTOppMSZIkVbDPlCRJmrbFx5ze6fquO+7QTtc3lzwzJUmS1hknn3wy++23H3vttRcvf/nLufvuu9l00005+uij2X333Tn44INZtWoVAO9///tZsmQJe+65J0cccQQA5557LnvttRd77bUXe++9N7feemt1TCZTkiRpnXDFFVdw6qmn8vWvf53ly5ezYMECPv7xj/PLX/6SpUuXcvnll3PggQdy7LHHAnDcccdx8cUXc+mll/KBD3wAgH/6p3/i+OOPZ/ny5Xz1q19l4403ro7LZEqSJK0TzjrrLC688EL23Xdf9tprL8466yyuueYa1ltvPZ7znOcAcOSRR/K1r30NgD333JPnP//5nHzyyay/funZtP/++/PqV7+a97///dx88833vl7DZEqSJK0TMpOjjjqK5cuXs3z5cq666ire/OY3r7HcxIi8008/nT//8z/noosuYt999+Wuu+7imGOO4aSTTuLXv/41+++/P1deeWV1XL3pgD6qI9u63DFNkiTVO/jggzn88MM5+uij2X777bnxxhu59dZbueeeezjttNM44ogj+MQnPsEBBxzAPffcw4oVKzjooIM44IADOOWUU7jtttu44YYb2GOPPdhjjz04//zzufLKK9l1112r4upNMiVJkjSVJUuW8La3vY2nPOUp3HPPPSxcuJDj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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "source": [ + "" + ], + "metadata": { + "id": "19TPSIaE_6GQ" + }, + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file From 8576b0821cf89f661fb2a1bf2020bc9039790c64 Mon Sep 17 00:00:00 2001 From: priamai <57333254+priamai@users.noreply.github.com> Date: Mon, 30 May 2022 22:46:45 +0100 Subject: [PATCH 6/7] example of prioritization approach --- .../jupyter/prioritization_example.ipynb | 1124 +++++++++++++++++ 1 file changed, 1124 insertions(+) create mode 100644 notebooks/jupyter/prioritization_example.ipynb diff --git a/notebooks/jupyter/prioritization_example.ipynb b/notebooks/jupyter/prioritization_example.ipynb new file mode 100644 index 0000000..51ae165 --- /dev/null +++ b/notebooks/jupyter/prioritization_example.ipynb @@ -0,0 +1,1124 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "prioritization_example.ipynb", + "provenance": [], + "collapsed_sections": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "Simple algorithm to prioritize CVE" + ], + "metadata": { + "id": "pg56ed5ACp6Y" + } + }, + { + "cell_type": "code", + "source": [ + "!pip install --upgrade epss\n", + "!pip install nvdlib" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "V10rospQClt3", + "outputId": "f0aae7fd-e0ac-4ab2-802d-b40c7970f86e" + }, + "execution_count": 3, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", + "Collecting epss\n", + " Downloading epss-0.1.1-py2.py3-none-any.whl (4.9 kB)\n", + "Requirement already satisfied: Click>=7.0 in /usr/local/lib/python3.7/dist-packages (from epss) (7.1.2)\n", + "Installing collected packages: epss\n", + "Successfully installed epss-0.1.1\n", + "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", + "Collecting nvdlib\n", + " Downloading nvdlib-0.5.7-py3-none-any.whl (11 kB)\n", + "Requirement already satisfied: requests in /usr/local/lib/python3.7/dist-packages (from nvdlib) (2.23.0)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests->nvdlib) (2022.5.18.1)\n", + "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests->nvdlib) (1.24.3)\n", + "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests->nvdlib) (3.0.4)\n", + "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests->nvdlib) (2.10)\n", + "Installing collected packages: nvdlib\n", + "Successfully installed nvdlib-0.5.7\n" + ] + } + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "id": "44E4ZFSnCiW5" + }, + "outputs": [], + "source": [ + "import requests\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt " + ] + }, + { + "cell_type": "markdown", + "source": [ + "Assuming we have a list of vulnerabilities in our environment below" + ], + "metadata": { + "id": "n4GG1kWZBgqC" + } + }, + { + "cell_type": "code", + "source": [ + "MY_VULNS = ['CVE-2022-0540','CVE-2022-24160','CVE-2010-0379','CVE-2022-1813']" + ], + "metadata": { + "id": "_pIEuhHiBfEf" + }, + "execution_count": 5, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "from epss import epss\n", + "import nvdlib\n", + "import logging\n", + "\n", + "logging.basicConfig(level=logging.INFO)\n", + "\n", + "# key (str) – NVD API Key. Allows for a request every 0.6 seconds instead of 6 seconds.\n", + "\n", + "def add_cvss(cveid,API_KEY=None):\n", + " try:\n", + " r = nvdlib.getCVE(cveid,key=API_KEY)\n", + " scores = r.score\n", + " return scores\n", + " except LookupError as e:\n", + " return [None,None,None]\n", + "\n", + "client = epss.EPSS()\n", + "\n", + "found = []\n", + "for cve in MY_VULNS:\n", + " epss_df,status=client.get(cve=cve)\n", + " if epss_df.shape[0]>0:\n", + " found.append(epss_df)\n", + "epss_df = pd.concat(found)" + ], + "metadata": { + "id": "6WecKdC0EvqS" + }, + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# All the vulns that are not in NVD\n", + "Potentially very dangerous we know very little." + ], + "metadata": { + "id": "Nl1iHa9G7QZP" + } + }, + { + "cell_type": "code", + "source": [ + "epss_df[epss_df.score.isna()]" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49 + }, + "id": "Ye1HHzK52te6", + "outputId": "61c46d38-fd43-4569-b591-fdeaecf655aa" + }, + "execution_count": 61, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Empty DataFrame\n", + "Columns: [cve, epss, percentile, date, version, score, severity]\n", + "Index: []" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cveepsspercentiledateversionscoreseverity
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 61 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Then consider the ones with both scores" + ], + "metadata": { + "id": "AeHeNCII7haR" + } + }, + { + "cell_type": "code", + "source": [ + "epss_df[~epss_df.score.isna()]" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 175 + }, + "id": "h1g96rirCBRt", + "outputId": "0b6e1bc5-e133-4ebb-ff9a-2f9eb41b3d31" + }, + "execution_count": 62, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " cve epss percentile date version score \\\n", + "0 CVE-2022-0540 0.221700000 0.963730000 2022-05-30 V3 9.8 \n", + "1 CVE-2022-24160 0.008850000 0.249370000 2022-05-30 V3 7.5 \n", + "2 CVE-2010-0379 0.563710000 0.987010000 2022-05-30 V2 9.3 \n", + "3 CVE-2022-1813 0.020550000 0.782130000 2022-05-30 V3 9.8 \n", + "\n", + " severity \n", + "0 CRITICAL \n", + "1 HIGH \n", + "2 HIGH \n", + "3 CRITICAL " + ], + "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", + "
cveepsspercentiledateversionscoreseverity
0CVE-2022-05400.2217000000.9637300002022-05-30V39.8CRITICAL
1CVE-2022-241600.0088500000.2493700002022-05-30V37.5HIGH
2CVE-2010-03790.5637100000.9870100002022-05-30V29.3HIGH
3CVE-2022-18130.0205500000.7821300002022-05-30V39.8CRITICAL
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 62 + } + ] + }, + { + "cell_type": "code", + "source": [ + "epss_df.reset_index(inplace=True)\n", + "# remember that the NVD has throttling so this will be slow\n", + "epss_df[['version','score','severity']]=epss_df.apply(lambda x:add_cvss(x['cve']),axis=1, result_type=\"expand\")" + ], + "metadata": { + "id": "Saola2KxFMqd" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "epss_df" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 175 + }, + "id": "zWkAWSlNF_O4", + "outputId": "87451be7-9f7c-4ed3-c612-de5b7531a438" + }, + "execution_count": 10, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " cve epss percentile date version score \\\n", + "0 CVE-2022-0540 0.221700000 0.963730000 2022-05-30 V3 9.8 \n", + "1 CVE-2022-24160 0.008850000 0.249370000 2022-05-30 V3 7.5 \n", + "2 CVE-2010-0379 0.563710000 0.987010000 2022-05-30 V2 9.3 \n", + "3 CVE-2022-1813 0.020550000 0.782130000 2022-05-30 V3 9.8 \n", + "\n", + " severity \n", + "0 CRITICAL \n", + "1 HIGH \n", + "2 HIGH \n", + "3 CRITICAL " + ], + "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", + "
cveepsspercentiledateversionscoreseverity
0CVE-2022-05400.2217000000.9637300002022-05-30V39.8CRITICAL
1CVE-2022-241600.0088500000.2493700002022-05-30V37.5HIGH
2CVE-2010-03790.5637100000.9870100002022-05-30V29.3HIGH
3CVE-2022-18130.0205500000.7821300002022-05-30V39.8CRITICAL
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 10 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Current ranking prioritization\n", + "\n", + "When all CVE have EPSS and CVSS scoring you can follow the diagonal." + ], + "metadata": { + "id": "SfRbk6eiHIH2" + } + }, + { + "cell_type": "code", + "source": [ + "priority_df = epss_df[epss_df.version.notna()].sort_values(by=['epss','score'],ascending = False)\n", + "priority_df.sort_index(inplace=True)\n", + "# top priority is 0 and then so on...\n", + "priority_df" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 175 + }, + "id": "yIZR66IjGAN8", + "outputId": "8ad1f635-09bb-400a-f1aa-19f30b2d5826" + }, + "execution_count": 11, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " cve epss percentile date version score \\\n", + "0 CVE-2022-0540 0.221700000 0.963730000 2022-05-30 V3 9.8 \n", + "1 CVE-2022-24160 0.008850000 0.249370000 2022-05-30 V3 7.5 \n", + "2 CVE-2010-0379 0.563710000 0.987010000 2022-05-30 V2 9.3 \n", + "3 CVE-2022-1813 0.020550000 0.782130000 2022-05-30 V3 9.8 \n", + "\n", + " severity \n", + "0 CRITICAL \n", + "1 HIGH \n", + "2 HIGH \n", + "3 CRITICAL " + ], + "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", + "
cveepsspercentiledateversionscoreseverity
0CVE-2022-05400.2217000000.9637300002022-05-30V39.8CRITICAL
1CVE-2022-241600.0088500000.2493700002022-05-30V37.5HIGH
2CVE-2010-03790.5637100000.9870100002022-05-30V29.3HIGH
3CVE-2022-18130.0205500000.7821300002022-05-30V39.8CRITICAL
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 11 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Identify vuln movers and prioritize them\n", + "\n", + "Very naive change point detection and keep the last delta as a way to prioritize them.\n", + "\n", + "More advanced strategies here will be to apply RLE,SAX/PAX, change point detection and other better methods to infer the trend." + ], + "metadata": { + "id": "4jz-6kTUI1pb" + } + }, + { + "cell_type": "code", + "source": [ + "import numpy as np\n", + "\n", + "moved = []\n", + "for idx,row in priority_df.iterrows():\n", + " print(f'Time series of CVE {row[\"cve\"]}')\n", + " ts_df,status=client.get(cve=row['cve'],scope='time-series')\n", + " ts_df['epss'] = ts_df['epss'].astype('float')\n", + " ts_df['percentile'] = ts_df['percentile'].astype('float')\n", + "\n", + " epss_range =ts_df['epss'].max()-ts_df['epss'].min()\n", + " perc_range =ts_df['epss'].max()-ts_df['epss'].min()\n", + "\n", + " if epss_range != 0.0:\n", + " ts_df['date'] = pd.to_datetime(ts_df['date'])\n", + " ts_df.sort_values(by='date',inplace=True)\n", + " ts_df.reset_index(inplace=True)\n", + " ts_df['depss'] = ts_df['epss'] - ts_df['epss'].shift(1)\n", + " ts_df.replace(np.nan, 0.0,inplace=True)\n", + " all_up = (ts_df['depss'] >= 0.0).all(axis=0)\n", + " all_down = (ts_df['depss'] <= 0.0).all(axis=0) \n", + "\n", + " chg_df = ts_df[(ts_df.depss!=0.0) & (ts_df.depss.notna())]\n", + " # quick check is it monotoic increasing or decreasing\n", + " last_chg = chg_df.iloc[-1]\n", + " if all_up:\n", + " moved.append({'CVE':row['cve'],'Trend':'variable up','Delta':last_chg['depss']})\n", + " elif all_down:\n", + " moved.append({'CVE':row['cve'],'Trend':'variable down','Delta':last_chg['depss']})\n", + " else:\n", + " moved.append({'CVE':row['cve'],'Trend':'variable steady','Delta':last_chg['depss']})\n", + " else:\n", + " moved.append({'CVE':row['cve'],'Trend':'static','Delta':0.0})\n", + "moved_df = pd.DataFrame(moved)\n", + "moved_df.sort_values(by='Delta',ascending=False,inplace=True)" + ], + "metadata": { + "id": "8Ukt7CfkHoCU", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "4a2caff8-4127-4f6a-f84d-da8b7fc08392" + }, + "execution_count": 59, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Time series of CVE CVE-2022-0540\n", + "Time series of CVE CVE-2022-24160\n", + "Time series of CVE CVE-2010-0379\n", + "Time series of CVE CVE-2022-1813\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "moved_df" + ], + "metadata": { + "id": "LyRwfZWxJ1fc", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 175 + }, + "outputId": "48516230-c7bb-4bab-adef-d6ab25d2b8b6" + }, + "execution_count": 60, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " CVE Trend Delta\n", + "0 CVE-2022-0540 variable up 0.21034\n", + "3 CVE-2022-1813 variable up 0.01050\n", + "1 CVE-2022-24160 static 0.00000\n", + "2 CVE-2010-0379 variable down -0.01944" + ], + "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", + "
CVETrendDelta
0CVE-2022-0540variable up0.21034
3CVE-2022-1813variable up0.01050
1CVE-2022-24160static0.00000
2CVE-2010-0379variable down-0.01944
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 60 + } + ] + } + ] +} \ No newline at end of file From c87b29505ed3ab9de0ff23b5cee1f18b33ff473d Mon Sep 17 00:00:00 2001 From: priamai <57333254+priamai@users.noreply.github.com> Date: Wed, 1 Jun 2022 14:23:42 +0100 Subject: [PATCH 7/7] Fixed sequence of filters --- .../jupyter/prioritization_example.ipynb | 412 +++++++++++++----- 1 file changed, 298 insertions(+), 114 deletions(-) diff --git a/notebooks/jupyter/prioritization_example.ipynb b/notebooks/jupyter/prioritization_example.ipynb index 51ae165..f9028b3 100644 --- a/notebooks/jupyter/prioritization_example.ipynb +++ b/notebooks/jupyter/prioritization_example.ipynb @@ -36,9 +36,9 @@ "base_uri": "https://localhost:8080/" }, "id": "V10rospQClt3", - "outputId": "f0aae7fd-e0ac-4ab2-802d-b40c7970f86e" + "outputId": "885722b1-ac1f-44d3-f149-1b04be764cfc" }, - "execution_count": 3, + "execution_count": 1, "outputs": [ { "output_type": "stream", @@ -55,9 +55,9 @@ " Downloading nvdlib-0.5.7-py3-none-any.whl (11 kB)\n", "Requirement already satisfied: requests in /usr/local/lib/python3.7/dist-packages (from nvdlib) (2.23.0)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests->nvdlib) (2022.5.18.1)\n", - "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests->nvdlib) (1.24.3)\n", "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests->nvdlib) (3.0.4)\n", "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests->nvdlib) (2.10)\n", + "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests->nvdlib) (1.24.3)\n", "Installing collected packages: nvdlib\n", "Successfully installed nvdlib-0.5.7\n" ] @@ -66,7 +66,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": { "id": "44E4ZFSnCiW5" }, @@ -94,7 +94,7 @@ "metadata": { "id": "_pIEuhHiBfEf" }, - "execution_count": 5, + "execution_count": 3, "outputs": [] }, { @@ -128,45 +128,38 @@ "metadata": { "id": "6WecKdC0EvqS" }, - "execution_count": 6, + "execution_count": 4, "outputs": [] }, - { - "cell_type": "markdown", - "source": [ - "# All the vulns that are not in NVD\n", - "Potentially very dangerous we know very little." - ], - "metadata": { - "id": "Nl1iHa9G7QZP" - } - }, { "cell_type": "code", "source": [ - "epss_df[epss_df.score.isna()]" + "epss_df" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", - "height": 49 + "height": 206 }, - "id": "Ye1HHzK52te6", - "outputId": "61c46d38-fd43-4569-b591-fdeaecf655aa" + "id": "hrUzB6W8aivQ", + "outputId": "9c2b4ce0-b6ab-463d-e1cc-f6378b8dbcd9" }, - "execution_count": 61, + "execution_count": 6, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ - "Empty DataFrame\n", - "Columns: [cve, epss, percentile, date, version, score, severity]\n", - "Index: []" + " epss percentile date\n", + "cve \n", + "CVE-2022-0540 0.221700000 0.963740000 2022-05-31\n", + "CVE-2022-24160 0.008850000 0.249460000 2022-05-31\n", + "CVE-2010-0379 0.563710000 0.987020000 2022-05-31\n", + "CVE-2022-1813 0.020550000 0.782160000 2022-05-31" ], "text/html": [ "\n", - "
\n", + "
\n", "
\n", "
\n", "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cveepsspercentiledateversionscoreseverity
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 9 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## All the vulns in NVD with EPSS score\n", + "\n", + "Consider and sort them." + ], + "metadata": { + "id": "AeHeNCII7haR" + } }, { "cell_type": "code", "source": [ - "epss_df" + "epss_df[~epss_df.score.isna()]" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 175 }, - "id": "zWkAWSlNF_O4", - "outputId": "87451be7-9f7c-4ed3-c612-de5b7531a438" + "id": "h1g96rirCBRt", + "outputId": "768724a0-5780-4ba8-cd83-2bb103c6d758" }, "execution_count": 10, "outputs": [ @@ -513,10 +685,10 @@ "data": { "text/plain": [ " cve epss percentile date version score \\\n", - "0 CVE-2022-0540 0.221700000 0.963730000 2022-05-30 V3 9.8 \n", - "1 CVE-2022-24160 0.008850000 0.249370000 2022-05-30 V3 7.5 \n", - "2 CVE-2010-0379 0.563710000 0.987010000 2022-05-30 V2 9.3 \n", - "3 CVE-2022-1813 0.020550000 0.782130000 2022-05-30 V3 9.8 \n", + "0 CVE-2022-0540 0.221700000 0.963740000 2022-05-31 V3 9.8 \n", + "1 CVE-2022-24160 0.008850000 0.249460000 2022-05-31 V3 7.5 \n", + "2 CVE-2010-0379 0.563710000 0.987020000 2022-05-31 V2 9.3 \n", + "3 CVE-2022-1813 0.020550000 0.782160000 2022-05-31 V3 9.8 \n", "\n", " severity \n", "0 CRITICAL \n", @@ -526,7 +698,7 @@ ], "text/html": [ "\n", - "
\n", + "
\n", "
\n", "
\n", "