Skip to content

Commit a114deb

Browse files
authored
Remove GitLabBasicImprover (#1137)
Add get_cwes_from_github_advisory function Add CWE support for github importer Add CWE support for osv Add CWE support for gitlab and redhat Signed-off-by: ziadhany <[email protected]>
1 parent dc94005 commit a114deb

22 files changed

+311
-22
lines changed

vulnerabilities/importers/github.py

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from typing import Iterable
1212
from typing import Optional
1313

14+
from cwe2.database import Database
1415
from dateutil import parser as dateparser
1516
from packageurl import PackageURL
1617
from univers.version_range import RANGE_CLASS_BY_SCHEMES
@@ -24,11 +25,11 @@
2425
from vulnerabilities.importer import Reference
2526
from vulnerabilities.importer import VulnerabilitySeverity
2627
from vulnerabilities.utils import dedupe
28+
from vulnerabilities.utils import get_cwe_id
2729
from vulnerabilities.utils import get_item
2830

2931
logger = logging.getLogger(__name__)
3032

31-
3233
PACKAGE_TYPE_BY_GITHUB_ECOSYSTEM = {
3334
"MAVEN": "maven",
3435
"NUGET": "nuget",
@@ -63,6 +64,11 @@
6364
url
6465
}
6566
severity
67+
cwes(first: 10){
68+
nodes {
69+
cweId
70+
}
71+
}
6672
publishedAt
6773
}
6874
firstPatchedVersion{
@@ -227,10 +233,34 @@ def process_response(resp: dict, package_type: str) -> Iterable[AdvisoryData]:
227233
else:
228234
logger.error(f"Unknown identifier type {identifier_type!r} and value {value!r}")
229235

236+
weaknesses = get_cwes_from_github_advisory(advisory)
237+
230238
yield AdvisoryData(
231239
aliases=sorted(dedupe(aliases)),
232240
summary=summary,
233241
references=references,
234242
affected_packages=affected_packages,
235243
date_published=date_published,
244+
weaknesses=weaknesses,
236245
)
246+
247+
248+
def get_cwes_from_github_advisory(advisory) -> [int]:
249+
"""
250+
Return the cwe-id list from advisory ex: [ 522 ]
251+
by extracting the cwe_list from advisory ex: [{'cweId': 'CWE-522'}]
252+
then remove the CWE- from string and convert it to integer 522 and Check if the CWE in CWE-Database
253+
"""
254+
weaknesses = []
255+
db = Database()
256+
cwe_list = get_item(advisory, "cwes", "nodes") or []
257+
for cwe_item in cwe_list:
258+
cwe_string = get_item(cwe_item, "cweId")
259+
if cwe_string:
260+
cwe_id = get_cwe_id(cwe_string)
261+
try:
262+
db.get(cwe_id)
263+
weaknesses.append(cwe_id)
264+
except Exception:
265+
logger.error("Invalid CWE id")
266+
return weaknesses

vulnerabilities/importers/gitlab.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@
2828
from vulnerabilities.importer import Importer
2929
from vulnerabilities.importer import Reference
3030
from vulnerabilities.utils import build_description
31+
from vulnerabilities.utils import get_cwe_id
3132

3233
logger = logging.getLogger(__name__)
3334

34-
3535
PURL_TYPE_BY_GITLAB_SCHEME = {
3636
"conan": "conan",
3737
"gem": "gem",
@@ -44,7 +44,6 @@
4444
"pypi": "pypi",
4545
}
4646

47-
4847
GITLAB_SCHEME_BY_PURL_TYPE = {v: k for k, v in PURL_TYPE_BY_GITLAB_SCHEME.items()}
4948

5049

@@ -186,6 +185,10 @@ def parse_gitlab_advisory(file):
186185
summary = build_description(gitlab_advisory.get("title"), gitlab_advisory.get("description"))
187186
urls = gitlab_advisory.get("urls")
188187
references = [Reference.from_url(u) for u in urls]
188+
189+
cwe_ids = gitlab_advisory.get("cwe_ids") or []
190+
cwe_list = list(map(get_cwe_id, cwe_ids))
191+
189192
date_published = dateparser.parse(gitlab_advisory.get("pubdate"))
190193
date_published = date_published.replace(tzinfo=pytz.UTC)
191194
package_slug = gitlab_advisory.get("package_slug")
@@ -251,4 +254,5 @@ def parse_gitlab_advisory(file):
251254
references=references,
252255
date_published=date_published,
253256
affected_packages=affected_packages,
257+
weaknesses=cwe_list,
254258
)

vulnerabilities/importers/osv.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
from vulnerabilities.severity_systems import SCORING_SYSTEMS
2828
from vulnerabilities.utils import build_description
2929
from vulnerabilities.utils import dedupe
30+
from vulnerabilities.utils import get_cwe_id
3031

3132
logger = logging.getLogger(__name__)
3233

@@ -74,13 +75,17 @@ def parse_advisory_data(raw_data: dict, supported_ecosystem) -> Optional[Advisor
7475
fixed_version=version,
7576
)
7677
)
78+
database_specific = raw_data.get("database_specific") or {}
79+
cwe_ids = database_specific.get("cwe_ids") or []
80+
weaknesses = list(map(get_cwe_id, cwe_ids))
7781

7882
return AdvisoryData(
7983
aliases=aliases,
8084
summary=summary,
8185
references=references,
8286
affected_packages=affected_packages,
8387
date_published=date_published,
88+
weaknesses=weaknesses,
8489
)
8590

8691

vulnerabilities/importers/redhat.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#
99

1010
import logging
11+
import re
1112
from typing import Dict
1213
from typing import Iterable
1314
from typing import List
@@ -23,6 +24,7 @@
2324
from vulnerabilities.importer import Reference
2425
from vulnerabilities.importer import VulnerabilitySeverity
2526
from vulnerabilities.rpm_utils import rpm_to_purl
27+
from vulnerabilities.utils import get_cwe_id
2628
from vulnerabilities.utils import get_item
2729
from vulnerabilities.utils import requests_with_5xx_retry
2830

@@ -61,7 +63,6 @@ def get_data_from_url(url):
6163

6264

6365
class RedhatImporter(Importer):
64-
6566
spdx_license_expression = "CC-BY-4.0"
6667
license_url = "https://access.redhat.com/documentation/en-us/red_hat_security_data_api/1.0/html/red_hat_security_data_api/legal-notice"
6768

@@ -135,6 +136,11 @@ def to_advisory(advisory_data):
135136
scoring_elements=cvssv3_vector,
136137
)
137138
)
139+
cwe_list = []
140+
# cwe_string : CWE-409","CWE-121->CWE-787","(CWE-401|CWE-404)","(CWE-190|CWE-911)->CWE-416"
141+
cwe_string = advisory_data.get("CWE")
142+
if cwe_string:
143+
cwe_list = list(map(get_cwe_id, re.findall("CWE-[0-9]+", cwe_string)))
138144

139145
aliases = []
140146
alias = advisory_data.get("CVE")
@@ -148,4 +154,5 @@ def to_advisory(advisory_data):
148154
summary=advisory_data.get("bugzilla_description") or "",
149155
affected_packages=affected_packages,
150156
references=references,
157+
weaknesses=cwe_list,
151158
)

vulnerabilities/improvers/default.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ def get_inferences(self, advisory_data: AdvisoryData) -> Iterable[Inference]:
6464
affected_purls=affected_purls,
6565
fixed_purl=None,
6666
references=advisory_data.references,
67+
weaknesses=advisory_data.weaknesses,
6768
)
6869
else:
6970
for fixed_purl in fixed_purls or []:
@@ -74,6 +75,7 @@ def get_inferences(self, advisory_data: AdvisoryData) -> Iterable[Inference]:
7475
affected_purls=affected_purls,
7576
fixed_purl=fixed_purl,
7677
references=advisory_data.references,
78+
weaknesses=advisory_data.weaknesses,
7779
)
7880

7981
else:

vulnerabilities/tests/test_data/gitlab/composer-expected.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,5 @@
2525
}
2626
],
2727
"date_published": "2018-03-15T00:00:00+00:00",
28-
"weaknesses": []
28+
"weaknesses": [1035,937]
2929
}

vulnerabilities/tests/test_data/gitlab/composer-improver-expected.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@
2222
"severities": []
2323
}
2424
],
25-
"weaknesses": []
25+
"weaknesses": [1035,937]
2626
}
2727
]

vulnerabilities/tests/test_data/gitlab/golang-expected.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,5 @@
3131
}
3232
],
3333
"date_published": "2021-05-20T00:00:00+00:00",
34-
"weaknesses": []
34+
"weaknesses": [1035,937]
3535
}

vulnerabilities/tests/test_data/gitlab/golang-improver-expected.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
"severities": []
3838
}
3939
],
40-
"weaknesses": []
40+
"weaknesses": [1035,937]
4141
},
4242
{
4343
"vulnerability_id": null,
@@ -68,6 +68,6 @@
6868
"severities": []
6969
}
7070
],
71-
"weaknesses": []
71+
"weaknesses": [1035,937]
7272
}
7373
]

vulnerabilities/tests/test_data/gitlab/maven-expected.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,5 @@
4646
}
4747
],
4848
"date_published": "2021-11-15T00:00:00+00:00",
49-
"weaknesses": []
49+
"weaknesses": [1035,937,94]
5050
}

0 commit comments

Comments
 (0)