|
9 | 9 |
|
10 | 10 | import logging |
11 | 11 | 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 |
17 | 12 |
|
18 | 13 | import requests |
19 | 14 | from bs4 import BeautifulSoup |
20 | | -from django.db.models.query import QuerySet |
21 | 15 | from packageurl import PackageURL |
22 | 16 | from univers.version_constraint import VersionConstraint |
23 | 17 | from univers.version_range import ApacheVersionRange |
|
27 | 21 | from vulnerabilities.importer import AffectedPackage |
28 | 22 | from vulnerabilities.importer import Importer |
29 | 23 | from vulnerabilities.importer import Reference |
30 | | -from vulnerabilities.importer import UnMergeablePackageError |
31 | 24 | 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 |
37 | 25 | 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 |
42 | 26 |
|
43 | 27 | logger = logging.getLogger(__name__) |
44 | 28 |
|
@@ -163,144 +147,3 @@ def fetch_links(url): |
163 | 147 | continue |
164 | 148 | links.append(urllib.parse.urljoin(url, link)) |
165 | 149 | 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 | | - ) |
0 commit comments