Skip to content

Commit 6f1fbab

Browse files
committed
Add fixed version for NPM advisory
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent ba73523 commit 6f1fbab

1 file changed

Lines changed: 57 additions & 19 deletions

File tree

  • vulnerabilities/importers

vulnerabilities/importers/npm.py

Lines changed: 57 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ def advisory_data(self) -> Iterable[AdvisoryData]:
5050

5151
def to_advisory_data(self, file: Path) -> AdvisoryData:
5252
data = load_json(file)
53+
id = data.get("id")
5354
description = data.get("overview") or ""
5455
summary = data.get("title") or ""
5556
date_published = parse(data.get("created_at")).replace(tzinfo=pytz.UTC)
@@ -71,39 +72,76 @@ def to_advisory_data(self, file: Path) -> AdvisoryData:
7172
value=cvss_score,
7273
)
7374
)
75+
76+
advisory_reference = Reference(
77+
url=f"https://github.com/nodejs/security-wg/blob/main/vuln/npm/{id}.json",
78+
reference_id=id,
79+
severities=severities,
80+
)
81+
7482
for ref in data.get("references") or []:
7583
references.append(
7684
Reference(
7785
url=ref,
7886
severities=severities,
7987
)
8088
)
89+
90+
if advisory_reference not in references:
91+
references.append(advisory_reference)
92+
8193
package_name = data.get("module_name")
8294
affected_packages = []
8395
if package_name:
84-
vulnerable_range = data.get("vulnerable_versions")
85-
affected_packages.append(
86-
AffectedPackage(
87-
package=PackageURL(
88-
type="npm",
89-
name=package_name,
90-
),
91-
affected_version_range=NpmVersionRange.from_native(vulnerable_range),
92-
# fixed_version= ??
93-
)
94-
)
95-
for alias in data.get("cves", []):
96-
print(AdvisoryData(
97-
summary=build_description(summary=summary, description=description),
98-
references=references,
99-
date_published=date_published,
100-
affected_packages=affected_packages,
101-
aliases=[alias],
102-
))
96+
affected_packages.append(self.get_affected_package(data, package_name))
97+
advsisory_aliases = data.get("cves") or []
98+
advsisory_aliases.append(f"NPM-{id}")
99+
for alias in advsisory_aliases:
103100
yield AdvisoryData(
104101
summary=build_description(summary=summary, description=description),
105102
references=references,
106103
date_published=date_published,
107104
affected_packages=affected_packages,
108105
aliases=[alias],
109106
)
107+
108+
def get_affected_package(self, data, package_name):
109+
vulnerable_range = data.get("vulnerable_versions") or ""
110+
111+
# https://github.com/nodejs/security-wg/blob/main/vuln/npm/213.json#L14
112+
if vulnerable_range == "<=99.999.99999":
113+
vulnerable_range = "*"
114+
115+
affected_version_range = (
116+
NpmVersionRange.from_native(vulnerable_range) if vulnerable_range else None
117+
)
118+
119+
if vulnerable_range == "*":
120+
return AffectedPackage(
121+
package=PackageURL(
122+
type="npm",
123+
name=package_name,
124+
),
125+
affected_version_range=affected_version_range,
126+
)
127+
128+
patched_range = data.get("patched_versions") or ""
129+
130+
unaffected_version_range = (
131+
NpmVersionRange.from_native(patched_range) if patched_range else None
132+
)
133+
fixed_version = None
134+
135+
if unaffected_version_range and len(unaffected_version_range.constraints) == 1:
136+
constraint = unaffected_version_range.constraints[0]
137+
if constraint.comparator == ">=":
138+
fixed_version = constraint.version
139+
140+
return AffectedPackage(
141+
package=PackageURL(
142+
type="npm",
143+
name=package_name,
144+
),
145+
affected_version_range=affected_version_range,
146+
fixed_version=fixed_version,
147+
)

0 commit comments

Comments
 (0)