Skip to content

Commit 76f65a8

Browse files
committed
Fix Gentoo importer v1
Update the Gentoo get_safe_and_affected_versions function in advisory v2 Signed-off-by: ziad hany <ziadhany2016@gmail.com>
1 parent 0611b55 commit 76f65a8

File tree

7 files changed

+207
-119
lines changed

7 files changed

+207
-119
lines changed

vulnerabilities/importers/__init__.py

Lines changed: 57 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@
4949
elixir_security_importer as elixir_security_importer_v2,
5050
)
5151
from vulnerabilities.pipelines.v2_importers import epss_importer_v2
52-
from vulnerabilities.pipelines.v2_importers import gentoo_importer as gentoo_importer_v2
5352
from vulnerabilities.pipelines.v2_importers import fireeye_importer_v2
53+
from vulnerabilities.pipelines.v2_importers import gentoo_importer as gentoo_importer_v2
5454
from vulnerabilities.pipelines.v2_importers import github_osv_importer as github_osv_importer_v2
5555
from vulnerabilities.pipelines.v2_importers import gitlab_importer as gitlab_importer_v2
5656
from vulnerabilities.pipelines.v2_importers import istio_importer as istio_importer_v2
@@ -70,62 +70,62 @@
7070

7171
IMPORTERS_REGISTRY = create_registry(
7272
[
73-
archlinux_importer_v2.ArchLinuxImporterPipeline,
74-
nvd_importer_v2.NVDImporterPipeline,
75-
elixir_security_importer_v2.ElixirSecurityImporterPipeline,
76-
npm_importer_v2.NpmImporterPipeline,
77-
vulnrichment_importer_v2.VulnrichImporterPipeline,
78-
apache_httpd_v2.ApacheHTTPDImporterPipeline,
79-
pypa_importer_v2.PyPaImporterPipeline,
80-
gitlab_importer_v2.GitLabImporterPipeline,
81-
pysec_importer_v2.PyPIImporterPipeline,
82-
xen_importer_v2.XenImporterPipeline,
83-
curl_importer_v2.CurlImporterPipeline,
84-
oss_fuzz_v2.OSSFuzzImporterPipeline,
85-
istio_importer_v2.IstioImporterPipeline,
86-
postgresql_importer_v2.PostgreSQLImporterPipeline,
87-
mozilla_importer_v2.MozillaImporterPipeline,
88-
github_osv_importer_v2.GithubOSVImporterPipeline,
89-
redhat_importer_v2.RedHatImporterPipeline,
90-
aosp_importer_v2.AospImporterPipeline,
91-
ruby_importer_v2.RubyImporterPipeline,
92-
epss_importer_v2.EPSSImporterPipeline,
73+
# archlinux_importer_v2.ArchLinuxImporterPipeline,
74+
# nvd_importer_v2.NVDImporterPipeline,
75+
# elixir_security_importer_v2.ElixirSecurityImporterPipeline,
76+
# npm_importer_v2.NpmImporterPipeline,
77+
# vulnrichment_importer_v2.VulnrichImporterPipeline,
78+
# apache_httpd_v2.ApacheHTTPDImporterPipeline,
79+
# pypa_importer_v2.PyPaImporterPipeline,
80+
# gitlab_importer_v2.GitLabImporterPipeline,
81+
# pysec_importer_v2.PyPIImporterPipeline,
82+
# xen_importer_v2.XenImporterPipeline,
83+
# curl_importer_v2.CurlImporterPipeline,
84+
# oss_fuzz_v2.OSSFuzzImporterPipeline,
85+
# istio_importer_v2.IstioImporterPipeline,
86+
# postgresql_importer_v2.PostgreSQLImporterPipeline,
87+
# mozilla_importer_v2.MozillaImporterPipeline,
88+
# github_osv_importer_v2.GithubOSVImporterPipeline,
89+
# redhat_importer_v2.RedHatImporterPipeline,
90+
# aosp_importer_v2.AospImporterPipeline,
91+
# ruby_importer_v2.RubyImporterPipeline,
92+
# epss_importer_v2.EPSSImporterPipeline,
9393
gentoo_importer_v2.GentooImporterPipeline,
94-
mattermost_importer_v2.MattermostImporterPipeline,
95-
nvd_importer.NVDImporterPipeline,
96-
github_importer.GitHubAPIImporterPipeline,
97-
gitlab_importer.GitLabImporterPipeline,
98-
github_osv.GithubOSVImporter,
99-
pypa_importer.PyPaImporterPipeline,
100-
npm_importer.NpmImporterPipeline,
101-
nginx_importer.NginxImporterPipeline,
102-
pysec_importer.PyPIImporterPipeline,
103-
fireeye_importer_v2.FireeyeImporterPipeline,
104-
apache_tomcat.ApacheTomcatImporter,
105-
postgresql.PostgreSQLImporter,
106-
debian.DebianImporter,
107-
curl.CurlImporter,
108-
epss.EPSSImporter,
109-
vulnrichment.VulnrichImporter,
110-
alpine_linux_importer.AlpineLinuxImporterPipeline,
111-
ruby.RubyImporter,
112-
apache_kafka.ApacheKafkaImporter,
113-
openssl.OpensslImporter,
114-
redhat.RedhatImporter,
115-
archlinux.ArchlinuxImporter,
116-
ubuntu.UbuntuImporter,
117-
debian_oval.DebianOvalImporter,
118-
retiredotnet.RetireDotnetImporter,
119-
apache_httpd.ApacheHTTPDImporter,
120-
mozilla.MozillaImporter,
121-
gentoo.GentooImporter,
122-
istio.IstioImporter,
123-
project_kb_msr2019.ProjectKBMSRImporter,
124-
suse_scores.SUSESeverityScoreImporter,
125-
elixir_security.ElixirSecurityImporter,
126-
xen.XenImporter,
127-
ubuntu_usn.UbuntuUSNImporter,
128-
fireeye.FireyeImporter,
129-
oss_fuzz.OSSFuzzImporter,
94+
# mattermost_importer_v2.MattermostImporterPipeline,
95+
# nvd_importer.NVDImporterPipeline,
96+
# github_importer.GitHubAPIImporterPipeline,
97+
# gitlab_importer.GitLabImporterPipeline,
98+
# github_osv.GithubOSVImporter,
99+
# pypa_importer.PyPaImporterPipeline,
100+
# npm_importer.NpmImporterPipeline,
101+
# nginx_importer.NginxImporterPipeline,
102+
# pysec_importer.PyPIImporterPipeline,
103+
# fireeye_importer_v2.FireeyeImporterPipeline,
104+
# apache_tomcat.ApacheTomcatImporter,
105+
# postgresql.PostgreSQLImporter,
106+
# debian.DebianImporter,
107+
# curl.CurlImporter,
108+
# epss.EPSSImporter,
109+
# vulnrichment.VulnrichImporter,
110+
# alpine_linux_importer.AlpineLinuxImporterPipeline,
111+
# ruby.RubyImporter,
112+
# apache_kafka.ApacheKafkaImporter,
113+
# openssl.OpensslImporter,
114+
# redhat.RedhatImporter,
115+
# archlinux.ArchlinuxImporter,
116+
# ubuntu.UbuntuImporter,
117+
# debian_oval.DebianOvalImporter,
118+
# retiredotnet.RetireDotnetImporter,
119+
# apache_httpd.ApacheHTTPDImporter,
120+
# mozilla.MozillaImporter,
121+
# gentoo.GentooImporter,
122+
# istio.IstioImporter,
123+
# project_kb_msr2019.ProjectKBMSRImporter,
124+
# suse_scores.SUSESeverityScoreImporter,
125+
# elixir_security.ElixirSecurityImporter,
126+
# xen.XenImporter,
127+
# ubuntu_usn.UbuntuUSNImporter,
128+
# fireeye.FireyeImporter,
129+
# oss_fuzz.OSSFuzzImporter,
130130
]
131131
)

vulnerabilities/importers/gentoo.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66
# See https://github.com/aboutcode-org/vulnerablecode for support or download.
77
# See https://aboutcode.org for more information about nexB OSS projects.
88
#
9-
10-
9+
import logging
1110
import re
1211
import xml.etree.ElementTree as ET
1312
from pathlib import Path
@@ -17,12 +16,15 @@
1716
from univers.version_constraint import VersionConstraint
1817
from univers.version_range import EbuildVersionRange
1918
from univers.versions import GentooVersion
19+
from univers.versions import InvalidVersion
2020

2121
from vulnerabilities.importer import AdvisoryData
2222
from vulnerabilities.importer import AffectedPackage
2323
from vulnerabilities.importer import Importer
2424
from vulnerabilities.importer import Reference
2525

26+
logger = logging.getLogger(__name__)
27+
2628

2729
class GentooImporter(Importer):
2830
repo_url = "git+https://anongit.gentoo.org/git/data/glsa.git"
@@ -104,14 +106,20 @@ def affected_and_safe_purls(affected_elem):
104106
safe_versions, affected_versions = GentooImporter.get_safe_and_affected_versions(pkg)
105107

106108
for version in safe_versions:
107-
constraints.append(
108-
VersionConstraint(version=GentooVersion(version), comparator="=").invert()
109-
)
109+
try:
110+
constraints.append(
111+
VersionConstraint(version=GentooVersion(version), comparator="=").invert()
112+
)
113+
except InvalidVersion as e:
114+
logger.error(f"Invalid safe_version {version} - error: {e}")
110115

111116
for version in affected_versions:
112-
constraints.append(
113-
VersionConstraint(version=GentooVersion(version), comparator="=")
114-
)
117+
try:
118+
constraints.append(
119+
VersionConstraint(version=GentooVersion(version), comparator="=")
120+
)
121+
except InvalidVersion as e:
122+
logger.error(f"Invalid affected_version {version} - error: {e}")
115123

116124
if not constraints:
117125
continue

vulnerabilities/pipelines/v2_importers/gentoo_importer.py

Lines changed: 40 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -121,43 +121,43 @@ def cves_from_reference(reference):
121121
return cves
122122

123123

124+
def _yield_packages(pkg_name, pkg_ns, constraints, invert):
125+
"""
126+
Generate AffectedPackageV2 objects for a list of constraints.
127+
"""
128+
for comparator, version, slot_value in constraints:
129+
qualifiers = {"slot": slot_value} if slot_value else {}
130+
purl = PackageURL(type="ebuild", name=pkg_name, namespace=pkg_ns, qualifiers=qualifiers)
131+
132+
try:
133+
constraint = VersionConstraint(version=GentooVersion(version), comparator=comparator)
134+
135+
if invert:
136+
constraint = constraint.invert()
137+
138+
yield AffectedPackageV2(
139+
package=purl,
140+
affected_version_range=EbuildVersionRange(constraints=[constraint]),
141+
fixed_version_range=None,
142+
)
143+
except InvalidVersion as e:
144+
logger.error(f"InvalidVersion constraints version: {version} error:{e}")
145+
146+
124147
def affected_and_safe_purls(affected_elem):
125-
constraints = []
126148
for pkg in affected_elem:
127149
name = pkg.attrib.get("name")
128150
if not name:
129151
continue
130152
pkg_ns, _, pkg_name = name.rpartition("/")
131-
purl = PackageURL(type="ebuild", name=pkg_name, namespace=pkg_ns)
132-
safe_versions, affected_versions = get_safe_and_affected_versions(pkg)
133-
134-
for version in safe_versions:
135-
try:
136-
constraints.append(
137-
VersionConstraint(version=GentooVersion(version), comparator="=").invert()
138-
)
139-
except InvalidVersion as e:
140-
logger.error(f"InvalidVersion - version: {version} - error:{e}")
141-
142-
for version in affected_versions:
143-
try:
144-
constraints.append(
145-
VersionConstraint(version=GentooVersion(version), comparator="=")
146-
)
147-
except InvalidVersion as e:
148-
logger.error(f"InvalidVersion - version: {version} - error:{e}")
149-
150-
if not constraints:
151-
continue
152153

153-
yield AffectedPackageV2(
154-
package=purl,
155-
affected_version_range=EbuildVersionRange(constraints=constraints),
156-
fixed_version_range=None,
157-
)
154+
safe_constraints, affected_constraints = get_safe_and_affected_constraints(pkg)
155+
156+
yield from _yield_packages(pkg_name, pkg_ns, affected_constraints, invert=False)
157+
yield from _yield_packages(pkg_name, pkg_ns, safe_constraints, invert=True)
158158

159159

160-
def get_safe_and_affected_versions(pkg):
160+
def get_safe_and_affected_constraints(pkg):
161161
# TODO : Revisit why we are skipping some versions in gentoo importer
162162
skip_versions = {"1.3*", "7.3*", "7.4*"}
163163
safe_versions = set()
@@ -166,27 +166,20 @@ def get_safe_and_affected_versions(pkg):
166166
if info.text in skip_versions:
167167
continue
168168

169-
if info.attrib.get("range"):
170-
if len(info.attrib.get("range")) > 2:
171-
continue
169+
# All possible values of info.attrib['range'] =
170+
# {'gt', 'lt', 'rle', 'rge', 'rgt', 'le', 'ge', 'eq'}, out of
171+
# which ('rle', 'rge', 'rgt') are ignored, because they compare
172+
# 'release' not the 'version'.
173+
range_value = info.attrib.get("range")
174+
slot_value = info.attrib.get("slot")
175+
comparator_dict = {"gt": ">", "lt": "<", "ge": ">=", "le": "<=", "eq": "="}
176+
comparator = comparator_dict.get(range_value)
177+
if not comparator:
178+
continue
172179

173180
if info.tag == "unaffected":
174-
# quick hack, to know whether this
175-
# version lies in this range, 'e' stands for
176-
# equal, which is paired with 'greater' or 'less'.
177-
# All possible values of info.attrib['range'] =
178-
# {'gt', 'lt', 'rle', 'rge', 'rgt', 'le', 'ge', 'eq'}, out of
179-
# which ('rle', 'rge', 'rgt') are ignored, because they compare
180-
# 'release' not the 'version'.
181-
if "e" in info.attrib["range"]:
182-
safe_versions.add(info.text)
183-
else:
184-
affected_versions.add(info.text)
181+
safe_versions.add((comparator, info.text, slot_value))
185182

186183
elif info.tag == "vulnerable":
187-
if "e" in info.attrib["range"]:
188-
affected_versions.add(info.text)
189-
else:
190-
safe_versions.add(info.text)
191-
184+
affected_versions.add((comparator, info.text, slot_value))
192185
return safe_versions, affected_versions

vulnerabilities/tests/pipelines/v2_importers/test_gentoo_importer_v2.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
# See https://github.com/aboutcode-org/vulnerablecode for support or download.
77
# See https://aboutcode.org for more information about nexB OSS projects.
88
#
9-
9+
import json
1010
from pathlib import Path
1111
from unittest.mock import Mock
1212
from unittest.mock import patch
@@ -32,7 +32,10 @@ def test_gentoo_advisories_per_file(xml_file):
3232
pipeline.vcs_response = Mock(dest_dir=TEST_DATA)
3333

3434
with patch.object(Path, "glob", return_value=[xml_file]):
35-
result = [adv.to_dict() for adv in pipeline.collect_advisories()]
35+
results = [adv.to_dict() for adv in pipeline.collect_advisories()]
36+
37+
for adv in results:
38+
adv["affected_packages"].sort(key=lambda x: json.dumps(x, sort_keys=True))
3639

3740
expected_file = xml_file.with_name(xml_file.stem + "-expected.json")
38-
util_tests.check_results_against_json(result, expected_file)
41+
util_tests.check_results_against_json(results, expected_file)

vulnerabilities/tests/test_data/gentoo_v2/glsa-201709-09-expected.json

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,35 @@
1515
"qualifiers": "",
1616
"subpath": ""
1717
},
18-
"affected_version_range": "vers:ebuild/0.1.1|!=1.9.7",
18+
"affected_version_range": "vers:ebuild/0.1.1",
19+
"fixed_version_range": null,
20+
"introduced_by_commit_patches": [],
21+
"fixed_by_commit_patches": []
22+
},
23+
{
24+
"package": {
25+
"type": "ebuild",
26+
"namespace": "dev-vcs",
27+
"name": "subversion",
28+
"version": "",
29+
"qualifiers": "",
30+
"subpath": ""
31+
},
32+
"affected_version_range": "vers:ebuild/<1.9.7",
33+
"fixed_version_range": null,
34+
"introduced_by_commit_patches": [],
35+
"fixed_by_commit_patches": []
36+
},
37+
{
38+
"package": {
39+
"type": "ebuild",
40+
"namespace": "dev-vcs",
41+
"name": "subversion",
42+
"version": "",
43+
"qualifiers": "",
44+
"subpath": ""
45+
},
46+
"affected_version_range": "vers:ebuild/<1.9.7",
1947
"fixed_version_range": null,
2048
"introduced_by_commit_patches": [],
2149
"fixed_by_commit_patches": []

0 commit comments

Comments
 (0)