Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add support for Javascript package scanning (Fixes #1453) #1548

Merged
merged 57 commits into from
Feb 16, 2022
Merged
Show file tree
Hide file tree
Changes from 49 commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
771960a
Merge pull request #1 from intel/master
anthonyharrison May 27, 2020
20d6262
Merge remote-tracking branch 'upstream/master'
anthonyharrison Jun 1, 2020
5ab2c87
Merge remote-tracking branch 'upstream/master'
anthonyharrison Jul 18, 2020
ea57d05
Merge remote-tracking branch 'upstream/master'
anthonyharrison Aug 20, 2020
c2a8d1c
Merge remote-tracking branch 'upstream/master'
anthonyharrison Sep 1, 2020
7035ae9
Merge remote-tracking branch 'upstream/master'
anthonyharrison Sep 2, 2020
aaba9eb
Merge remote-tracking branch 'upstream/master'
anthonyharrison Sep 18, 2020
3b91b0e
Merge remote-tracking branch 'upstream/master'
anthonyharrison Oct 18, 2020
13fa1a8
Merge remote-tracking branch 'upstream/master'
anthonyharrison Nov 8, 2020
5db21eb
Merge remote-tracking branch 'upstream/master'
anthonyharrison Mar 14, 2021
9418560
Merge branch 'main'
anthonyharrison Mar 14, 2021
0f3f754
Merge branch 'main'
anthonyharrison Mar 24, 2021
9e04dab
Merge remote-tracking branch 'refs/remotes/upstream/main'
anthonyharrison May 30, 2021
da7e34a
Merge branch 'intel:main' into master
anthonyharrison Jun 20, 2021
8c9ea48
Merge branch 'intel:main' into master
anthonyharrison Jun 27, 2021
9581317
Merge branch 'intel:main' into master
anthonyharrison Jul 12, 2021
c59de25
Merge branch 'intel:main' into master
anthonyharrison Jul 25, 2021
bf5908a
Merge branch 'intel:main' into master
anthonyharrison Sep 3, 2021
2505e10
Merge branch 'intel:main' into master
anthonyharrison Sep 23, 2021
589b93d
Merge branch 'intel:main' into master
anthonyharrison Oct 13, 2021
42757cb
Merge branch 'intel:main' into master
anthonyharrison Oct 27, 2021
0f519a3
Merge branch 'intel:main' into master
anthonyharrison Nov 3, 2021
4e9f0e7
chore: update pre-commit config
web-flow Dec 1, 2021
4016283
Merge remote-tracking branch 'upstream/main'
anthonyharrison Dec 5, 2021
cd7b07a
Merge remote-tracking branch 'upstream/main'
anthonyharrison Dec 9, 2021
4197fde
Merge branch 'intel:main' into master
anthonyharrison Dec 12, 2021
6a9494b
Merge branch 'intel:main' into master
anthonyharrison Dec 20, 2021
187f669
Merge branch 'intel:main' into master
anthonyharrison Dec 23, 2021
03d40b2
Merge pull request #3 from anthonyharrison/chore-precommit-config
anthonyharrison Dec 28, 2021
5a9fc91
Merge remote-tracking branch 'upstream/main'
anthonyharrison Dec 28, 2021
38598df
Merge branch 'master' of https://github.com/anthonyharrison/cve-bin-t…
anthonyharrison Dec 28, 2021
53be88a
Merge remote-tracking branch 'upstream/main'
anthonyharrison Jan 12, 2022
076e16f
bug: set default version for xml2 checker to UNKNOWN (fixes #1517)
anthonyharrison Jan 12, 2022
6830930
Merge branch 'intel:main' into master
anthonyharrison Jan 18, 2022
dcb8411
feat: Add support for Javascript package scanning (Fixes #1453)
anthonyharrison Jan 25, 2022
047eecf
Merge branch 'intel:main' into master
anthonyharrison Jan 26, 2022
d78d40e
feat: Add XML schema validation (Fixes #1507)
anthonyharrison Jan 26, 2022
d61a04d
Revert "feat: Add XML schema validation (Fixes #1507)"
anthonyharrison Jan 26, 2022
fcfc11f
Merge branch 'intel:main' into master
anthonyharrison Feb 7, 2022
f6b21c0
Merge branch 'master' of git+ssh://github.com/anthonyharrison/cve-bin…
anthonyharrison Feb 7, 2022
cb02b7f
feat: Add support for Javascript package scanning (Fixes #1453)
anthonyharrison Jan 25, 2022
f281311
Merge branch 'pr-1453' of git+ssh://github.com/anthonyharrison/cve-bi…
anthonyharrison Feb 7, 2022
cecb381
Merge branch 'main' into pr-1453
anthonyharrison Feb 7, 2022
48391e3
feat: Add support for Javascript package scanning (Fixes #1453)
anthonyharrison Feb 7, 2022
8758a99
feat: Add support for Javascript package scanning (Fixes #1453)
anthonyharrison Feb 7, 2022
a79d759
feat: Add support for Javascript package scanning (Fixes #1453)
anthonyharrison Feb 8, 2022
ade7f24
Merge branch 'pr-1453' of git+ssh://github.com/anthonyharrison/cve-bi…
anthonyharrison Feb 8, 2022
64c0200
feat: Add support for Javascript package scanning (Fixes #1453)
anthonyharrison Feb 8, 2022
01e6c63
feat: Add support for Javascript package scanning (Fixes #1453)
anthonyharrison Feb 8, 2022
951d8f7
Update cve_bin_tool/version_scanner.py
anthonyharrison Feb 9, 2022
4ca92fe
Update cve_bin_tool/version_scanner.py
anthonyharrison Feb 9, 2022
e4ab9e6
Update cve_bin_tool/version_scanner.py
anthonyharrison Feb 9, 2022
bf180f3
Update test/test_language_scanner.py
anthonyharrison Feb 9, 2022
02707e7
Update test/test_language_scanner.py
anthonyharrison Feb 9, 2022
d71b2c1
Update test/test_language_scanner.py
anthonyharrison Feb 9, 2022
ebb1375
Update test/test_language_scanner.py
anthonyharrison Feb 9, 2022
ccf8ebe
feat: Add support for Javascript package scanning (Fixes #1453)
anthonyharrison Feb 13, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,12 @@ The scanner examines the `pom.xml` file within a Java package archive to identif

JAR, WAR and EAR archives are supported.

### Javascript

The scanner examines the `package-lock.json` file within a javascript application
to identify components. The package names and versions are used to search the database for vulnerabilities.


### Python

The scanner examines the `PKG-INFO` and `METADATA` files for an installed Python package to extract the component name and version which
Expand Down
70 changes: 67 additions & 3 deletions cve_bin_tool/version_scanner.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Copyright (C) 2021 Intel Corporation
# SPDX-License-Identifier: GPL-3.0-or-later

import json
import os
import subprocess
import sys
Expand Down Expand Up @@ -122,6 +123,7 @@ def is_executable(self, filename):
and ("PKG-INFO: " not in output)
and ("METADATA: " not in output)
and ("pom.xml" not in output)
and ("package-lock.json" not in output)
):
return False, None
# otherwise use python implementation of file
Expand Down Expand Up @@ -169,8 +171,11 @@ def scan_file(self, filename):

# Check for Java package
if output and "pom.xml" in output:
java_lines = "\n".join(lines.splitlines())
yield from self.run_java_checker(filename, java_lines)
yield from self.run_java_checker(filename)

# Javascript checker
if output and "package-lock.json" in output:
yield from self.run_js_checker(filename)

# If python package then strip the lines to avoid detecting other product strings
if output and ("PKG-INFO: " in output or "METADATA: " in output):
Expand Down Expand Up @@ -199,7 +204,7 @@ def find_java_vendor(self, product, version):
return ProductInfo(vendor, product, version), file_path
return None, None

def run_java_checker(self, filename, lines):
def run_java_checker(self, filename):
anthonyharrison marked this conversation as resolved.
Show resolved Hide resolved
"""Process maven pom.xml file and extract product and dependency details"""
tree = ET.parse(filename)
# Find root element
Expand Down Expand Up @@ -247,6 +252,65 @@ def run_java_checker(self, filename, lines):

self.logger.debug(f"Done scanning file: {filename}")

def find_js_vendor(self, product, version):
anthonyharrison marked this conversation as resolved.
Show resolved Hide resolved
"""Find vendor for Javascript product"""
if version == "*":
return None
vendor_package_pair = self.cve_db.get_vendor_product_pairs(product)
vendorlist = []
if vendor_package_pair != []:
# To handle multiple vendors, return all combinations of product/vendor mappings
for v in vendor_package_pair:
vendor = v["vendor"]
file_path = "".join(self.file_stack)
# Tidy up version string
if "^" in version:
version = version[1:]
self.logger.debug(f"{file_path} {product} {version} by {vendor}")
vendorlist.append([ProductInfo(vendor, product, version), file_path])
return vendorlist if len(vendorlist) > 0 else None
return None

def run_js_checker(self, filename):
anthonyharrison marked this conversation as resolved.
Show resolved Hide resolved
"""Process package-lock.json file and extract product and dependency details"""
fh = open(filename)
data = json.load(fh)
product = data["name"]
version = data["version"]
vendor = self.find_js_vendor(product, version)
if vendor is not None:
for v in vendor:
yield v[0], v[1] # product_info, file_path
# Now process dependencies
for i in data["dependencies"]:
# To handle @actions/<product>: lines, extract product name from line
product = i.split("/")[1] if "/" in i else i
# Handle different formats. Either <product> : <version> or
# <product>: {
# ...
# "version" : <version>
# ...
# }
try:
version = data["dependencies"][i]["version"]
except Exception:
# Cater for case when version field not present
version = data["dependencies"][i]
vendor = self.find_js_vendor(product, version)
if vendor is not None:
for v in vendor:
yield v[0], v[1] # product_info, file_path
if "requires" in data["dependencies"][i]:
for r in data["dependencies"][i]["requires"]:
# To handle @actions/<product>: lines, extract product name from line
product = r.split("/")[1] if "/" in r else r
version = data["dependencies"][i]["requires"][r]
vendor = self.find_js_vendor(product, version)
if vendor is not None:
for v in vendor:
yield v[0], v[1] # product_info, file_path
self.logger.debug(f"Done scanning file: {filename}")

def run_python_package_checkers(self, filename, lines):
"""
This generator runs only for python packages.
Expand Down
114 changes: 114 additions & 0 deletions test/language_data/package-lock1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
{
"name": "setup-python",
"version": "2.2.2",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@actions/cache": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@actions/cache/-/cache-1.0.8.tgz",
"integrity": "sha512-GWNNB67w93HGJRQXlsV56YqrdAuDoP3esK/mo5mzU8WoDCVjtQgJGsTdkYUX7brswtT7xnI30bWNo1WLKQ8FZQ==",
"requires": {
"@actions/core": "^1.2.6",
"@actions/exec": "^1.0.1",
"@actions/glob": "^0.1.0",
"@actions/http-client": "^1.0.9",
"@actions/io": "^1.0.1",
"@azure/ms-rest-js": "^2.0.7",
"@azure/storage-blob": "^12.1.2",
"semver": "^6.1.0",
"uuid": "^3.3.3"
},
"dependencies": {
"@actions/glob": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/@actions/glob/-/glob-0.1.2.tgz",
"integrity": "sha512-SclLR7Ia5sEqjkJTPs7Sd86maMDw43p769YxBOxvPvEWuPEhpAnBsQfENOpXjFYMmhCqd127bmf+YdvJqVqR4A==",
"requires": {
"@actions/core": "^1.2.6",
"minimatch": "^3.0.4"
}
},
"@actions/http-client": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.11.tgz",
"integrity": "sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg==",
"requires": {
"tunnel": "0.0.6"
}
},
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
}
}
},
"@actions/core": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.6.tgz",
"integrity": "sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA=="
},
"jest-snapshot": {
"version": "27.2.5",
"resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.2.5.tgz",
"integrity": "sha512-2/Jkn+VN6Abwz0llBltZaiJMnL8b1j5Bp/gRIxe9YR3FCEh9qp0TXVV0dcpTGZ8AcJV1SZGQkczewkI9LP5yGw==",
"dev": true,
"requires": {
"@babel/core": "^7.7.2",
"@babel/generator": "^7.7.2",
"@babel/parser": "^7.7.2",
"@babel/plugin-syntax-typescript": "^7.7.2",
"@babel/traverse": "^7.7.2",
"@babel/types": "^7.0.0",
"@jest/transform": "^27.2.5",
"@jest/types": "^27.2.5",
"@types/babel__traverse": "^7.0.4",
"@types/prettier": "^2.1.5",
"babel-preset-current-node-syntax": "^1.0.0",
"chalk": "^4.0.0",
"expect": "^27.2.5",
"graceful-fs": "^4.2.4",
"jest-diff": "^27.2.5",
"jest-get-type": "^27.0.6",
"jest-haste-map": "^27.2.5",
"jest-matcher-utils": "^27.2.5",
"jest-message-util": "^27.2.5",
"jest-resolve": "^27.2.5",
"jest-util": "^27.2.5",
"natural-compare": "^1.4.0",
"pretty-format": "^27.2.5",
"semver": "^7.3.2"
},
"dependencies": {
"semver": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
}
}
}
},
"node-releases": {
"version": "1.1.77",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz",
"integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==",
"dev": true
},
"typescript": {
"version": "3.8.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz",
"integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==",
"dev": true
},
"yargs-parser": {
"version": "20.2.9",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
"dev": true
}
}
}
29 changes: 29 additions & 0 deletions test/language_data/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"name": "node-js-sample",
"version": "0.2.0",
"description": "A sample Node.js app using Express 4",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "^4.13.3"
},
"engines": {
"node": "4.0.0"
},
"repository": {
"type": "git",
"url": "https://github.com/heroku/node-js-sample"
},
"keywords": [
"node",
"heroku",
"express"
],
"author": "Mark Pundsack",
"contributors": [
"Zeke Sikelianos <zeke@sikelianos.com> (http://zeke.sikelianos.com)"
],
"license": "MIT"
}