Skip to content

Commit 6d4e4ef

Browse files
committed
Merge branch 'ref-type-exploitdb' into vul-exploit
2 parents 7b9846b + 2a81756 commit 6d4e4ef

2 files changed

Lines changed: 94 additions & 0 deletions

File tree

vulnerabilities/improvers/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
# See https://aboutcode.org for more information about nexB OSS projects.
88
#
99

10+
from vulnerabilities.improvers import exploitdb
1011
from vulnerabilities.improvers import valid_versions
1112
from vulnerabilities.improvers import vulnerability_kev
1213
from vulnerabilities.improvers import vulnerability_status
@@ -29,6 +30,7 @@
2930
valid_versions.GithubOSVImprover,
3031
vulnerability_status.VulnerabilityStatusImprover,
3132
vulnerability_kev.VulnerabilityKevImprover,
33+
exploitdb.ExploitDBImprover,
3234
]
3335

3436
IMPROVERS_REGISTRY = {x.qualified_name: x for x in IMPROVERS_REGISTRY}
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
import csv
2+
import io
3+
import logging
4+
from typing import Iterable
5+
6+
from django.db import IntegrityError
7+
from django.db.models import QuerySet
8+
from sphinx.util import requests
9+
10+
from vulnerabilities.improver import Improver
11+
from vulnerabilities.improver import Inference
12+
from vulnerabilities.models import Advisory
13+
from vulnerabilities.models import Alias
14+
from vulnerabilities.models import VulnerabilityReference
15+
from vulnerabilities.models import VulnerabilityRelatedReference
16+
17+
logger = logging.getLogger(__name__)
18+
19+
20+
class ExploitDBImprover(Improver):
21+
"""
22+
ExploitDB Improver
23+
"""
24+
25+
license_expression = "GPL-2.0"
26+
27+
@property
28+
def interesting_advisories(self) -> QuerySet:
29+
# TODO Modify ExploitDB Improver to iterate over the vulnerabilities alias, not the advisory
30+
return [Advisory.objects.first()]
31+
32+
def get_inferences(self, advisory_data) -> Iterable[Inference]:
33+
"""
34+
Fetch ExploitDB data, iterate over it to find the vulnerability with the specified alias, and create or update
35+
the ref and ref-type accordingly.
36+
"""
37+
38+
exploit_db_url = (
39+
"https://gitlab.com/exploit-database/exploitdb/-/raw/main/files_exploits.csv"
40+
)
41+
response = requests.get(exploit_db_url)
42+
43+
if response.status_code != 200:
44+
logger.error(f"Failed to fetch ExploitDB URL: {exploit_db_url}")
45+
return []
46+
47+
raw_data = io.StringIO(response.text)
48+
49+
csvreader = csv.reader(raw_data)
50+
51+
# Ignore the csv header
52+
next(csvreader) # header
53+
for row in csvreader:
54+
try:
55+
aliases = row[11].split(";")
56+
for raw_alias in aliases:
57+
alias = Alias.objects.get(alias=raw_alias)
58+
if not alias:
59+
continue
60+
61+
vul = alias.vulnerability
62+
if not vul:
63+
continue
64+
65+
if raw_alias:
66+
url_map = {
67+
"file_url": f"https://gitlab.com/exploit-database/exploitdb/-/blob/main/{row[1]}"
68+
if row[1]
69+
else None,
70+
"direct_url": row[16] if row[16] else None,
71+
}
72+
73+
for key, url in url_map.items():
74+
if url:
75+
ref, created = VulnerabilityReference.objects.update_or_create(
76+
reference_id=row[11],
77+
reference_type=VulnerabilityReference.EXPLOIT,
78+
defaults={"url": url},
79+
)
80+
81+
if created:
82+
VulnerabilityRelatedReference.objects.create(
83+
vulnerability=vul,
84+
reference=ref,
85+
)
86+
87+
except Alias.DoesNotExist as e:
88+
logger.error(f"No Alias found for exploit id {row[0]}: {e}")
89+
except Exception as e:
90+
logger.error(e)
91+
92+
return []

0 commit comments

Comments
 (0)