Skip to content

Commit 131f37c

Browse files
committed
Refactor get_weaknesses function in apache_httpd importer
Signed-off-by: ambuj <[email protected]>
1 parent 451f55b commit 131f37c

File tree

4 files changed

+105
-66
lines changed

4 files changed

+105
-66
lines changed

vulnerabilities/importers/apache_httpd.py

Lines changed: 101 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -161,67 +161,106 @@ def fetch_links(url):
161161

162162

163163
def get_weaknesses(cve_data):
164-
"""
165-
Extract CWE IDs from CVE data.
166-
167-
Args:
168-
cve_data (dict): The CVE data in a dictionary format.
169-
170-
Returns:
171-
List[int]: A list of unique CWE IDs.
172-
173-
>>> mock_cve_data = {
174-
... "containers": {
175-
... "cna": {
176-
... "providerMetadata": {
177-
... "orgId": "f0158376-9dc2-43b6-827c-5f631a4d8d09"
178-
... },
179-
... "title": "mod_macro buffer over-read",
180-
... "problemTypes": [
181-
... {
182-
... "descriptions": [
183-
... {
184-
... "description": "CWE-125 Out-of-bounds Read",
185-
... "lang": "en",
186-
... "cweId": "CWE-125",
187-
... "type": "CWE"
188-
... }
189-
... ]
190-
... }
191-
... ]
192-
... }
193-
... }
194-
... }
195-
>>> get_weaknesses(mock_cve_data)
196-
[125]
197-
"""
198-
problem_types = cve_data.get("containers", {}).get("cna", {}).get("problemTypes", [])
199-
descriptions = problem_types[0].get("descriptions", []) if len(problem_types) > 0 else []
200-
cwe_string = descriptions[0].get("cweId", "") if len(descriptions) > 0 else ""
201-
cwe_pattern = r"CWE-\d+"
202-
description = descriptions[0].get("description", "") if len(descriptions) > 0 else ""
203-
matches = re.findall(cwe_pattern, description)
164+
# """
165+
# Extract CWE IDs from CVE data.
166+
167+
# Args:
168+
# cve_data (dict): The CVE data in a dictionary format.
169+
170+
# Returns:
171+
# List[int]: A list of unique CWE IDs.
172+
173+
# Examples:
174+
# >>> mock_cve_data1 = {
175+
# ... "containers": {
176+
# ... "cna": {
177+
# ... "providerMetadata": {
178+
# ... "orgId": "f0158376-9dc2-43b6-827c-5f631a4d8d09"
179+
# ... },
180+
# ... "title": "mod_macro buffer over-read",
181+
# ... "problemTypes": [
182+
# ... {
183+
# ... "descriptions": [
184+
# ... {
185+
# ... "description": "CWE-125 Out-of-bounds Read",
186+
# ... "lang": "en",
187+
# ... "cweId": "CWE-125",
188+
# ... "type": "CWE"
189+
# ... }
190+
# ... ]
191+
# ... }
192+
# ... ]
193+
# ... }
194+
# ... }
195+
# ... }
196+
# >>> mock_cve_data2 = {
197+
# ... "data_type": "CVE",
198+
# ... "data_format": "MITRE",
199+
# ... "data_version": "4.0",
200+
# ... "generator": {
201+
# ... "engine": "Vulnogram 0.0.9"
202+
# ... },
203+
# ... "CVE_data_meta": {
204+
# ... "ID": "CVE-2022-28614",
205+
# ... "ASSIGNER": "[email protected]",
206+
# ... "TITLE": "read beyond bounds via ap_rwrite() ",
207+
# ... "STATE": "PUBLIC"
208+
# ... },
209+
# ... "problemtype": {
210+
# ... "problemtype_data": [
211+
# ... {
212+
# ... "description": [
213+
# ... {
214+
# ... "lang": "eng",
215+
# ... "value": "CWE-190 Integer Overflow or Wraparound"
216+
# ... }
217+
# ... ]
218+
# ... },
219+
# ... {
220+
# ... "description": [
221+
# ... {
222+
# ... "lang": "eng",
223+
# ... "value": "CWE-200 Exposure of Sensitive Information to an Unauthorized Actor"
224+
# ... }
225+
# ... ]
226+
# ... }
227+
# ... ]
228+
# ... }
229+
# ... }
230+
231+
# >>> get_weaknesses(mock_cve_data1)
232+
# [125]
233+
234+
# >>> get_weaknesses(mock_cve_data2)
235+
# [190, 200]
236+
# """
237+
238+
alias = get_item(cve_data, "CVE_data_meta", "ID")
239+
cwe_id = []
204240
db = Database()
241+
if alias:
242+
problemtype_data = get_item(cve_data, "problemtype", "problemtype_data") or []
243+
for problem in problemtype_data:
244+
for desc in problem["description"]:
245+
value = desc.get("value", "")
246+
cwe_pattern = r"CWE-\d+"
247+
cwe_id_string_list = re.findall(cwe_pattern, value)
248+
for cwe_id_string in cwe_id_string_list:
249+
cwe_id.append(get_cwe_id(cwe_id_string))
250+
251+
else:
252+
problemTypes = cve_data.get("containers", {}).get("cna", {}).get("problemTypes", [])
253+
descriptions = problemTypes[0].get("descriptions", []) if len(problemTypes) > 0 else []
254+
for description in descriptions:
255+
cwe_id_string = description.get("cweId", "")
256+
cwe_id.append(get_cwe_id(cwe_id_string))
257+
205258
weaknesses = []
206-
cwe_string_from_description = ""
207-
if matches:
208-
cwe_string_from_description = matches[0]
209-
if cwe_string or cwe_string_from_description:
210-
if cwe_string:
211-
cwe_id = get_cwe_id(cwe_string)
212-
try:
213-
db.get(cwe_id)
214-
weaknesses.append(cwe_id)
215-
except Exception:
216-
logger.error("Invalid CWE id")
217-
elif cwe_string_from_description:
218-
cwe_id = get_cwe_id(cwe_string_from_description)
219-
try:
220-
db.get(cwe_id)
221-
weaknesses.append(cwe_id)
222-
except Exception:
223-
logger.error("Invalid CWE id")
224-
225-
seen = set()
226-
unique_cwe = [x for x in weaknesses if not (x in seen or seen.add(x))]
227-
return unique_cwe
259+
for cwe in cwe_id:
260+
try:
261+
db.get(cwe)
262+
weaknesses.append(cwe)
263+
except Exception:
264+
logger.error("Invalid CWE id")
265+
266+
return weaknesses

vulnerabilities/tests/test_data/apache_httpd/CVE-2021-44224-apache-httpd-expected.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,6 @@
3232
}
3333
],
3434
"date_published": null,
35-
"weaknesses": [],
35+
"weaknesses": [476],
3636
"url": "https://httpd.apache.org/security/json/CVE-2021-44224.json"
3737
}

vulnerabilities/tests/test_data/apache_httpd/CVE-2022-28614-apache-httpd-expected.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,6 @@
3232
}
3333
],
3434
"date_published": null,
35-
"weaknesses": [],
35+
"weaknesses": [190, 200],
3636
"url": "https://httpd.apache.org/security/json/CVE-2022-28614.json"
3737
}

vulnerabilities/tests/test_data/apache_httpd/apache-httpd-improver-expected.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
]
5555
}
5656
],
57-
"weaknesses": []
57+
"weaknesses": [476]
5858
},
5959
{
6060
"vulnerability_id": null,
@@ -103,6 +103,6 @@
103103
]
104104
}
105105
],
106-
"weaknesses": []
106+
"weaknesses": [476]
107107
}
108108
]

0 commit comments

Comments
 (0)