Skip to content

Commit ff22c02

Browse files
authored
Merge pull request #1138 from TG1999/add_valid_versions_improver
Add valid version improver
2 parents f2e3b21 + 44c99dc commit ff22c02

32 files changed

+5543
-1030
lines changed

vulnerabilities/importers/apache_httpd.py

Lines changed: 0 additions & 157 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,9 @@
99

1010
import logging
1111
import urllib
12-
from datetime import datetime
13-
from typing import Iterable
14-
from typing import List
15-
from typing import Mapping
16-
from typing import Optional
1712

1813
import requests
1914
from bs4 import BeautifulSoup
20-
from django.db.models.query import QuerySet
2115
from packageurl import PackageURL
2216
from univers.version_constraint import VersionConstraint
2317
from univers.version_range import ApacheVersionRange
@@ -27,18 +21,8 @@
2721
from vulnerabilities.importer import AffectedPackage
2822
from vulnerabilities.importer import Importer
2923
from vulnerabilities.importer import Reference
30-
from vulnerabilities.importer import UnMergeablePackageError
3124
from vulnerabilities.importer import VulnerabilitySeverity
32-
from vulnerabilities.improver import Improver
33-
from vulnerabilities.improver import Inference
34-
from vulnerabilities.models import Advisory
35-
from vulnerabilities.package_managers import GitHubTagsAPI
36-
from vulnerabilities.package_managers import VersionAPI
3725
from vulnerabilities.severity_systems import APACHE_HTTPD
38-
from vulnerabilities.utils import AffectedPackage as LegacyAffectedPackage
39-
from vulnerabilities.utils import get_affected_packages_by_patched_package
40-
from vulnerabilities.utils import nearest_patched_package
41-
from vulnerabilities.utils import resolve_version_range
4226

4327
logger = logging.getLogger(__name__)
4428

@@ -163,144 +147,3 @@ def fetch_links(url):
163147
continue
164148
links.append(urllib.parse.urljoin(url, link))
165149
return links
166-
167-
168-
IGNORE_TAGS = {
169-
"AGB_BEFORE_AAA_CHANGES",
170-
"APACHE_1_2b1",
171-
"APACHE_1_2b10",
172-
"APACHE_1_2b11",
173-
"APACHE_1_2b2",
174-
"APACHE_1_2b3",
175-
"APACHE_1_2b4",
176-
"APACHE_1_2b5",
177-
"APACHE_1_2b6",
178-
"APACHE_1_2b7",
179-
"APACHE_1_2b8",
180-
"APACHE_1_2b9",
181-
"APACHE_1_3_PRE_NT",
182-
"APACHE_1_3a1",
183-
"APACHE_1_3b1",
184-
"APACHE_1_3b2",
185-
"APACHE_1_3b3",
186-
"APACHE_1_3b5",
187-
"APACHE_1_3b6",
188-
"APACHE_1_3b7",
189-
"APACHE_2_0_2001_02_09",
190-
"APACHE_2_0_52_WROWE_RC1",
191-
"APACHE_2_0_ALPHA",
192-
"APACHE_2_0_ALPHA_2",
193-
"APACHE_2_0_ALPHA_3",
194-
"APACHE_2_0_ALPHA_4",
195-
"APACHE_2_0_ALPHA_5",
196-
"APACHE_2_0_ALPHA_6",
197-
"APACHE_2_0_ALPHA_7",
198-
"APACHE_2_0_ALPHA_8",
199-
"APACHE_2_0_ALPHA_9",
200-
"APACHE_2_0_BETA_CANDIDATE_1",
201-
"APACHE_BIG_SYMBOL_RENAME_POST",
202-
"APACHE_BIG_SYMBOL_RENAME_PRE",
203-
"CHANGES",
204-
"HTTPD_LDAP_1_0_0",
205-
"INITIAL",
206-
"MOD_SSL_2_8_3",
207-
"PCRE_3_9",
208-
"POST_APR_SPLIT",
209-
"PRE_APR_CHANGES",
210-
"STRIKER_2_0_51_RC1",
211-
"STRIKER_2_0_51_RC2",
212-
"STRIKER_2_1_0_RC1",
213-
"WROWE_2_0_43_PRE1",
214-
"apache-1_3-merge-1-post",
215-
"apache-1_3-merge-1-pre",
216-
"apache-1_3-merge-2-post",
217-
"apache-1_3-merge-2-pre",
218-
"apache-apr-merge-3",
219-
"apache-doc-split-01",
220-
"dg_last_1_2_doc_merge",
221-
"djg-apache-nspr-07",
222-
"djg_nspr_split",
223-
"moving_to_httpd_module",
224-
"mpm-3",
225-
"mpm-merge-1",
226-
"mpm-merge-2",
227-
"post_ajp_proxy",
228-
"pre_ajp_proxy",
229-
}
230-
231-
232-
class ApacheHTTPDImprover(Improver):
233-
def __init__(self) -> None:
234-
self.versions_fetcher_by_purl: Mapping[str, VersionAPI] = {}
235-
self.vesions_by_purl = {}
236-
237-
@property
238-
def interesting_advisories(self) -> QuerySet:
239-
return Advisory.objects.filter(created_by=ApacheHTTPDImporter.qualified_name)
240-
241-
def get_package_versions(
242-
self, package_url: PackageURL, until: Optional[datetime] = None
243-
) -> List[str]:
244-
"""
245-
Return a list of `valid_versions` for the `package_url`
246-
"""
247-
api_name = "apache/httpd"
248-
versions_fetcher = GitHubTagsAPI()
249-
return versions_fetcher.get_until(package_name=api_name, until=until).valid_versions
250-
251-
def get_inferences(self, advisory_data: AdvisoryData) -> Iterable[Inference]:
252-
"""
253-
Yield Inferences for the given advisory data
254-
"""
255-
if not advisory_data.affected_packages:
256-
return
257-
try:
258-
purl, affected_version_ranges, _ = AffectedPackage.merge(
259-
advisory_data.affected_packages
260-
)
261-
except UnMergeablePackageError:
262-
logger.error(f"Cannot merge with different purls {advisory_data.affected_packages!r}")
263-
return iter([])
264-
265-
pkg_type = purl.type
266-
pkg_namespace = purl.namespace
267-
pkg_name = purl.name
268-
269-
if not self.vesions_by_purl.get(str(purl)):
270-
valid_versions = self.get_package_versions(
271-
package_url=purl, until=advisory_data.date_published
272-
)
273-
self.vesions_by_purl[str(purl)] = valid_versions
274-
275-
valid_versions = self.vesions_by_purl[str(purl)]
276-
277-
for affected_version_range in affected_version_ranges:
278-
aff_vers, unaff_vers = resolve_version_range(
279-
affected_version_range=affected_version_range,
280-
package_versions=valid_versions,
281-
ignorable_versions=IGNORE_TAGS,
282-
)
283-
affected_purls = [
284-
PackageURL(type=pkg_type, namespace=pkg_namespace, name=pkg_name, version=version)
285-
for version in aff_vers
286-
]
287-
288-
unaffected_purls = [
289-
PackageURL(type=pkg_type, namespace=pkg_namespace, name=pkg_name, version=version)
290-
for version in unaff_vers
291-
]
292-
293-
affected_packages: List[LegacyAffectedPackage] = nearest_patched_package(
294-
vulnerable_packages=affected_purls, resolved_packages=unaffected_purls
295-
)
296-
297-
for (
298-
fixed_package,
299-
affected_packages,
300-
) in get_affected_packages_by_patched_package(affected_packages).items():
301-
yield Inference.from_advisory_data(
302-
advisory_data,
303-
confidence=100, # We are getting all valid versions to get this inference
304-
affected_purls=affected_packages,
305-
fixed_purl=fixed_package,
306-
)

vulnerabilities/importers/debian.py

Lines changed: 0 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
from typing import Mapping
1515

1616
import requests
17-
from django.db.models.query import QuerySet
1817
from packageurl import PackageURL
1918
from univers.version_range import DebianVersionRange
2019
from univers.versions import DebianVersion
@@ -23,16 +22,8 @@
2322
from vulnerabilities.importer import AffectedPackage
2423
from vulnerabilities.importer import Importer
2524
from vulnerabilities.importer import Reference
26-
from vulnerabilities.importer import UnMergeablePackageError
27-
from vulnerabilities.improver import MAX_CONFIDENCE
28-
from vulnerabilities.improver import Improver
29-
from vulnerabilities.improver import Inference
30-
from vulnerabilities.models import Advisory
31-
from vulnerabilities.utils import AffectedPackage as LegacyAffectedPackage
3225
from vulnerabilities.utils import dedupe
33-
from vulnerabilities.utils import get_affected_packages_by_patched_package
3426
from vulnerabilities.utils import get_item
35-
from vulnerabilities.utils import nearest_patched_package
3627

3728
logger = logging.getLogger(__name__)
3829

@@ -164,74 +155,3 @@ def parse(self, pkg_name: str, records: Mapping[str, Any]) -> Iterable[AdvisoryD
164155
affected_packages=affected_packages,
165156
references=references,
166157
)
167-
168-
169-
class DebianBasicImprover(Improver):
170-
@property
171-
def interesting_advisories(self) -> QuerySet:
172-
return Advisory.objects.filter(created_by=DebianImporter.qualified_name)
173-
174-
def get_inferences(self, advisory_data: AdvisoryData) -> Iterable[Inference]:
175-
"""
176-
Yield Inferences for the given advisory data
177-
"""
178-
if not advisory_data.affected_packages:
179-
return
180-
try:
181-
purl, affected_version_ranges, fixed_versions = AffectedPackage.merge(
182-
advisory_data.affected_packages
183-
)
184-
except UnMergeablePackageError:
185-
logger.error(f"Cannot merge with different purls {advisory_data.affected_packages!r}")
186-
return
187-
188-
pkg_type = purl.type
189-
pkg_namespace = purl.namespace
190-
pkg_name = purl.name
191-
pkg_qualifiers = purl.qualifiers
192-
fixed_purls = [
193-
PackageURL(
194-
type=pkg_type,
195-
namespace=pkg_namespace,
196-
name=pkg_name,
197-
version=str(version),
198-
qualifiers=pkg_qualifiers,
199-
)
200-
for version in fixed_versions
201-
]
202-
if not affected_version_ranges:
203-
for fixed_purl in fixed_purls:
204-
yield Inference.from_advisory_data(
205-
advisory_data, # We are getting all valid versions to get this inference
206-
confidence=MAX_CONFIDENCE,
207-
affected_purls=[],
208-
fixed_purl=fixed_purl,
209-
)
210-
else:
211-
aff_versions = set()
212-
for affected_version_range in affected_version_ranges:
213-
for constraint in affected_version_range.constraints:
214-
aff_versions.add(constraint.version.string)
215-
affected_purls = [
216-
PackageURL(
217-
type=pkg_type,
218-
namespace=pkg_namespace,
219-
name=pkg_name,
220-
version=version,
221-
qualifiers=pkg_qualifiers,
222-
)
223-
for version in aff_versions
224-
]
225-
affected_packages: List[LegacyAffectedPackage] = nearest_patched_package(
226-
vulnerable_packages=affected_purls, resolved_packages=fixed_purls
227-
)
228-
229-
for (fixed_package, affected_packages,) in get_affected_packages_by_patched_package(
230-
affected_packages=affected_packages
231-
).items():
232-
yield Inference.from_advisory_data(
233-
advisory_data,
234-
confidence=MAX_CONFIDENCE, # We are getting all valid versions to get this inference
235-
affected_purls=affected_packages,
236-
fixed_purl=fixed_package,
237-
)

0 commit comments

Comments
 (0)