Package: cve-bin-tool
CVE Binary Tool quick start / READMEThe CVE Binary Tool is a free, open source tool to help you find known vulnerabilities in software, using data from theNational Vulnerability Database(NVD) list ofCommon Vulnerabilities and Exposures(CVEs).The tool has two main modes of operation:A binary scanner which helps you determine which packages may have been included as part of a piece of software. There are 290 checkers which focus on common, vulnerable open source components such as openssl, libpng, libxml2 and expat.Tools for scanning known component lists in various formats, including .csv, several linux distribution package lists, language specific package scanners and several Software Bill of Materials (SBOM) formats.It is intended to be used as part of your continuous integration system to enable regular vulnerability scanning and give you early warning of known issues in your supply chain.What CVE Binary Tool does when it runs:Download CVE Data (from NVD, Redhat, OSV, Gitlab, and Curl).This happens once per day by default, not every time a scan is run.On first run, downloading all data can take some time.Create/read a component list.  There are two modes of operation:Creates a component list (including versions) using a combination of binary checkers and language component lists (such as python's requirements.txt).Read SBOM (use an existing component list in a standardized Software Bill of Materials format.)Create CVE ListThis looks up all components found or read from an existing bill of materials and reports back any known issues associated with themInclude triage/additional dataThere are several options for adding triage/notes, information from previous reports to track vulnerability change over time, or known fix dataGenerate report in one or more formats (console, json, csv, html, pdf)For more details, see ourdocumentationor thisquickstart guideCVE Binary Tool quick start / READMEInstalling CVE Binary ToolSetting up an NVD_API_KEYMost popular usage optionsFinding known vulnerabilities using the binary scannerFinding known vulnerabilities in a list of componentsScanning an SBOM file for known vulnerabilitiesProviding triage inputUsing the tool offlineOutput OptionsFull option listConfigurationUsing CVE Binary Tool in GitHub ActionsData SourcesNational Vulnerability Database (NVD)Open Source Vulnerability Database (OSV)Gitlab Advisory Database (GAD)RedHat Security Database (REDHAT)Curl Database (Curl)Binary checker listLanguage Specific checkersJavaJavascriptRustRubyRGoSwiftPythonPerlSBOM GenerationLimitationsAdditional RequirementsSupported Archive FormatsFeedback & ContributionsSecurity IssuesInstalling CVE Binary ToolCVE Binary Tool can be installed using pip:pip install cve-bin-toolYou can also dopip install --user -e .to install a local copy which is useful if you're trying the latest code fromthe cve-bin-tool githubor doing development. TheContributor Documentationcovers how to set up for local development in more detail.Pip will install the python requirements for you, but for some types of extraction we use system libraries.  If you have difficulties extracting files, you may want to look at ouradditional Requirements lists for Linux and Windows.Setting up an NVD_API_KEYThe major source of data for known vulnerabilities at this time is the National Vulnerability Database (NVD).  We recommend most usersGet an NVD API Keyand use it with cve-bin-tool to avoid timeouts, as access to the data is rate limited fairly heavily and many users report having difficulty downloading the data without a key.  There areseveral ways to pass the NVD_API_KEY through to cve-bin-tool.  The quickstart examples below show how to pass it through as a command-line option so that first-time users don't miss it but most users prefer to usea config file or environment variableto avoid having to copy the key over and over again or to take advantage of secret storage in environments such as Github Actions.CVE Binary Tool uses the NVD API but is not endorsed or certified by the NVD.Most popular usage optionsFinding known vulnerabilities using the binary scannerTo run the binary scanner on a directory or file:cve-bin-tool--nvd-api-key<key><directory/file>Note: That this option will also use anylanguage specific checkersto find known vulnerabilities in components.You can also store the nvd-api-key in an environment variable rather than passing it through on the command line:nvd_api_key instructions.Finding known vulnerabilities in a list of componentsTo scan a comma-delimited (CSV) or JSON file which lists dependencies and versions:cve-bin-tool--nvd-api-key<key>--input-file<filename>You can also store the nvd-api-key in an environment variable rather than passing it through on the command line:nvd_api_key instructions.Scanning an SBOM file for known vulnerabilitiesTo scan a software bill of materials file (SBOM):cve-bin-tool--nvd-api-key<key>--sbom<sbom_filetype>--sbom-file<sbom_filename>Valid SBOM types areSPDX,CycloneDX, andSWID.
Scanning of product names within an SBOM file is case insensitive.You can also store the nvd-api-key in an environment variable rather than passing it through on the command line:nvd_api_key instructions.Providing triage inputThe--triage-input-fileoption can be used to add extra triage data like remarks, comments etc. while scanning a directory so that output will reflect this triage data and you can save time of re-triaging (Usage:cve-bin-tool --triage-input-file test.vex /path/to/scan).
The supported format is theCycloneDXVEX format which can be generated using the--vexoption.Using the tool offlineSpecifying the--offlineoption when running a scan ensures that cve-bin-tool doesn't attempt to download the latest database files or to check for a newer version of the tool.Note that you will need to obtain a copy of the vulnerability data before the tool can run in offline mode.The offline how-to guide contains more information on how to set up your database.Output OptionsThe CVE Binary Tool provides console-based output by default. If you wish to provide another format, you can specify this and a filename on the command line using--format. The valid formats are CSV, JSON, console, HTML and PDF. The output filename can be specified using the--output-fileflag.You can also specify multiple output formats by using comma (',') as separator:cve-bin-toolfile-fcsv,json,html-oreportNote: Please don't use spaces between comma (',') and the output formats.The reported vulnerabilities can additionally be reported in the
Vulnerability Exchange (VEX) format by specifying--vexcommand line option.
The generated VEX file can then be used as a--triage-input-fileto support
a triage process.If you wish to use PDF support, you will need to install thereportlablibrary separately.If you intend to use PDF support when you install cve-bin-tool you can specify it and report lab will be installed as part of the cve-bin-tool install:pip install cve-bin-tool[PDF]If you've already installed cve-bin-tool you can add reportlab after the fact
using pip:pip install --upgrade reportlabNote that reportlab was taken out of the default cve-bin-tool install because
it has a known CVE associated with it
(CVE-2020-28463). The
cve-bin-tool code uses the recommended mitigations to limit which resources
added to PDFs, as well as additional input validation. This is a bit of a
strange CVE because it describes core functionality of PDFs: external items,
such as images, can be embedded in them, and thus anyone viewing a PDF could
load an external image (similar to how viewing a web page can trigger external
loads). There's no inherent "fix" for that, only mitigations where users of
the library must ensure only expected items are added to PDFs at the time of
generation.Since users may not want to have software installed with an open, unfixable CVE
associated with it, we've opted to make PDF support only available to users who
have installed the library themselves. Once the library is installed, the PDF
report option will function.Full option listUsage:cve-bin-tool <directory/file to scan>options:-h, --helpshow this help message and exit-e EXCLUDE, --excludeEXCLUDE
                        Comma separated Exclude directory path-V, --versionshow program's version number and exit--disable-version-checkskips checking for a new version--disable-validation-checkskips checking xml files against schema
  --offline             operate in offline mode
  --detailed            display detailed report

CVE Data Download:
  Arguments related to data sources and Cache Configuration-n {api,api2,json}, --nvd {api,api2,json}choose method for getting CVE lists from NVD-u {now,daily,never,latest}, --update {now,daily,never,latest}update schedule for data sources and exploits database (default: daily)--nvd-api-key NVD_API_KEYspecify NVD API key (used to improve NVD rate limit)-d {NVD,OSV} [{NVD,OSV} ...], --disable-data-source {NVD,OSV} [{NVD,OSV} ...]comma-separated list of data sources (GAD, NVD, OSV, REDHAT) to disable (default: NONE)

  --use-mirror USE_MIRROR
                        use an mirror to update the database

Input:directorydirectory to scan-i INPUT_FILE, --input-fileINPUT_FILE
                        provide input filename--triage-input-file TRIAGE_INPUT_FILEprovide input filename for triage data-C CONFIG, --config CONFIGprovide config file-L PACKAGE_LIST, --package-list PACKAGE_LISTprovide package list
  --sbom {spdx,cyclonedx,swid}
                        specify type of software bill of materials (sbom) (default: spdx)--sbom-file SBOM_FILEprovide sbom filename

Output:-q, --quietsuppress output-l {debug,info,warning,error,critical}, --log {debug,info,warning,error,critical}log level (default: info)-o OUTPUT_FILE, --output-file OUTPUT_FILEprovide output filename (default: output to stdout)--html-theme HTML_THEMEprovide custom theme directory for HTML Report-f {csv,json,console,html,pdf}, --format {csv,json,console,html,pdf}update output format (default: console)
                        specify multiple output formats by using comma (',') as a separator
                        note: don't use spaces between comma (',') and the output formats.-c CVSS, --cvss CVSSminimum CVSS score (as integer in range 0 to 10) to report (default: 0)-S {low,medium,high,critical}, --severity {low,medium,high,critical}minimum CVE severity to report (default: low)--reportProduces a report even if there are no CVE for the respective output format-A [-], --available-fix [-]Lists available fixes of the package from Linux distribution-b [-], --backport-fix [-]Lists backported fixes if available from Linux distribution--affected-versionsLists versions of product affected by a given CVE (to facilitate upgrades)--vex VEXProvide vulnerability exchange (vex) filename--sbom-output SBOM_OUTPUTprovide software bill of materials (sbom) filename to generate--sbom-type {spdx,cyclonedx}specify type of software bill of materials (sbom) to generate (default: spdx)--sbom-format {tag,json,yaml}specify format of software bill of materials (sbom) to generate (default: tag)

Merge Report:
  Arguments related to Intermediate and Merged Reports-a [APPEND], --append [APPEND]save output as intermediate report in json format-t TAG, --tag TAGadd a unique tag to differentiate between multiple intermediate reports-m MERGE, --merge MERGEcomma separated intermediate reports path for merging-F FILTER, --filter FILTERcomma separated tag string for filtering intermediate reports

Checkers:-s SKIPS, --skips SKIPScomma-separated list of checkers to disable-r RUNS, --runs RUNScomma-separated list of checkers to enable

Database Management:--export EXPORTexport database filename--import IMPORTimport database filename

Exploits:
  --exploits            check for exploits from found cves

Deprecated:-x, --extractautoextract compressed files
   CVE Binary Tool autoextracts all compressed files by default nowFor further information about all of these options, please seethe CVE Binary Tool user manual.Note: For backward compatibility, we still supportcsv2cvecommand for producing CVEs from csv but we recommend using the--input-filecommand going forwards.-Lor--package-listoption runs a CVE scan on installed packages listed in a package list. It takes a python package list (requirements.txt) or a package list of packages of systems that has dpkg, pacman or rpm package manager as an input for the scan. This option is much faster and detects more CVEs than the default method of scanning binaries.You can get a package list of all installed packages ina system using dpkg package manager by runningdpkg-query -W -f '${binary:Package}\n' > pkg-list.txta system using pacman package manager by runningpacman -Qqe > pkg-list.txta system using rpm package manager by runningrpm -qa --queryformat '%{NAME}\n' > pkg-list.txtin the terminal and provide it as an input by runningcve-bin-tool -L pkg-list.txtfor a full package scan.ConfigurationYou can use--configoption to provide configuration file for the tool. You can still override options specified in config file with command line arguments. See our sample config files in thetest/configUsing CVE Binary Tool in GitHub ActionsIf you want to integrate cve-bin-tool as a part of your github action pipeline.
You can checkout our examplegithub action.Data SourcesThe following data sources are used to get CVE data to find CVEs for a package:National Vulnerability Database(NVD)This data source consists of majority of the CVE entries and is essential to provide vendor data for other data sources such as OSV, therefore disabling the download of CVE data from this source is not possible,--disable-data-source "NVD"only disables CVEs from displaying in output.The National Vulnerability Database (NVD) has changed its access policy and it is now recommended that users obtain an NVD API Key to ensure access to the full database. The cve-bin-tool supports using an NVD API KEY for retrieving vulnerability data from the NVD.NVD requires users to create and use an NVD_API_KEY to use their API. To set up an API_KEY ,please visitRequest an API Key.There are three ways to set up the NVD API Key in cve-bin-tool:By using environment variableBy defining it in config fileBy stating it in command line interface(cli)By using environment variableOpen a terminal window and navigate to the directory where you have installed cve-bin-tool.Enter the following command to set your NVD API key as an environment variable:exportNVD_API_KEY=<yourapikey>Replace<your api key>with your actual NVD API key.You can verify that the environment variable has been set by entering the following command:echo$NVD_API_KEYNow, when you run cve-bin-tool, it will automatically use the NVD API key that you have set as an environment variable.Note: The steps to set environment variables may vary depending on the operating system you are using. The above steps are for Unix-based systems such as Linux and macOS. On Windows, you can set environment variables using the System Properties dialog or the Command Prompt.By defining it in config fileOpen the cve-bin-tool configuration file (config.yaml or config.toml)Under the [nvd section, add the following line:api_key=your_api_key_hereReplaceyour_api_key_herewith your NVD API Key.Save the changes to the configuration file.which can be passed to the cve-bin-toolcve-bin-tool--configconfig.tomlBy stating it in command line interface(cli)To set the flag--nvd-api-keyto the API Key you have been provided.You can implement that in the following way :cve-bin-tool--nvd-api-keyyour_api_key_hereOnce you have set up your NVD API Key, cve-bin-tool will use it to retrieve vulnerability data from the NVD. This will ensure that you have access to the full database and will reduce the likelihood of encountering errors due to limited access.If for any reason, the NVD API Key is not working, cve-bin-tool will automatically switch to the JSON fallback. However, it is highly recommended that you verify that your API Key is working properly to ensure access with the NVD database. To use the json method, use the flag-n jsonor--nvd json. You can use it in the following waycve-bin-tool--nvd-api-keyyour_api_key_here-njsonNote: If you have problems downloading the initial data , it may be due to the NVD's current rate limiting scheme which block users entirely if they aren't using an API key.If you don't want to use the NVD API, you can also download their json files without setting up a key. Please note that this method is slower for getting updates but is more ideal if you just want to try out thecve-bin-toolfor the first time.If the API key is not used, the time to access and download the data from the NVD database will be significantly increased due to the rate limiting algorithm implemented by the NVD. This algorithm limits the number of requests that can be made to the NVD database per unit time, and if this limit is exceeded, the user will be blocked from accessing the data for a period of time.So without an API key, users may experience slower download speeds and longer wait times for their requests to be processed, as they will be subject to these rate limits. Therefore, it is highly recommended to obtain and use an NVD API key for optimal performance and functionality when working with the cve-bin-tool.Open Source Vulnerability Database(OSV)This data source is based on the OSV schema from Google, and consists of CVEs from different ecosystems that might not be covered by NVD.
NVD is given priority if there are duplicate CVEs as some CVEs from OSV may not contain CVSS scores.
Using OSV will increase number of CVEs and time taken to update the database but searching database for vulnerabilities will have similar performance.Gitlab Advisory Database(GAD)This data source consists of security advisories used by the GitLab dependency scanner.
The number of CVEs added from this data source is similar to OSV.RedHat Security Database(REDHAT)This data source contains CVEs pertaining to RedHat Products.Access to the data is subject toLegal Notice.Curl Database(Curl)This data source provides the CVEs for the CURL product.Binary checker listThe following checkers are available for finding components in binary files:Available checkersaccountsserviceacpidapache_http_serverapcupsdapparmorasn1cassimpasteriskatftpavahibashbindbinutilsbirdbisonbluezboincbotanbrobubblewrapbusyboxbzip2c_arescapnprotocephchesschronyclamavcollectdcommons_compressconnmancroniecryptsetupcupscurlcvsdarkhttpddavfs2dbusdhclientdhcpcddhcpddnsmasqdomoticzdovecotdoxygendpkgdropbeare2fsprogselfutilsenscripteximexiv2expatf2fs_toolsfaad2fastdffmpegfilefirefoxflacfreeradiusfreerdpfribidifrrgccgdbgimpgitglibglibcgmpgnomeshellgnupggnutlsgpgmegpsdgraphicsmagickgrub2gstreamergupnpgvfshaproxyharfbuzzhaserlhdf5hostapdhunspelli2pdicecasticuiperf3ipmitoolipsec_toolsiptablesirssiiucode_tooljack2jacksondatabindjanusjheadjson_ckbdkeepalivedkerberoskexectoolskodikuberneteslftplibarchivelibasslibbpglibconfuselibdblibebmllibgcryptlibgit2libicallibidn2libinputlibjpeglibjpeg_turbolibksbaliblaslibmatroskalibmemcachedlibnsslibpcaplibrawlibrsvglibrsynclibsampleratelibseccomplibsndfilelibsolvlibsouplibsrtplibsshlibssh2libtifflibtomcryptlibupnplibvirtlibvncserverlibvorbislibxsltlighttpdlinux_kernellldpdlogrotatelualuajitlxclynxlz4mailxmariadbmdadmmemcachedminicomminidlnaminiupnpcminiupnpdmodsecuritymosquittomotionmpvmsmtpmtrmuttmysqlnanonasmnbdncursesneonnessusnetatalknetkit_ftpnetpbmnettlenghttp2nginxnmapnodentpntpsecopen_iscsiopen_vm_toolsopenafsopencvopenjpegopenldapopenscopensshopensslopenswanopenvpnp7zippangopatchpcrepcre2pcsc_liteperlpicocompigzpngpolarssl_fedorapopplerpostgresqlpppprivoxyprocps_ngproftpdpspppure_ftpdputtypythonqemuqtquaggaradare2radvdraptorraucrdesktoprsyncrsyslogrtl_433rtmpdumpruncrustsambasane_backendssdlseahorseshadowsocks_libevsnortsofia_sipspeexspicesqlitesquashfssquidsslhstellariumstrongswanstunnelsubversionsudosuricatasylpheedsyslogngsysstatsystemdtcpdumptcpreplaythriftthttpdthunderbirdtimescaledbtinyproxytortpm2_tsstransmissiontrousersu_bootunboundunixodbcupxutil_linuxvarnishvimvorbis_toolsvsftpdwebkitgtkwgetwiresharkwolfsslwpa_supplicantxercesxml2xscreensaveryasmzabbixzeekzlibznczshAll the checkers can be found in the checkers directory, as can theinstructions on how to add a new checker.
Support for new checkers can be requested viaGitHub issues.Language Specific checkersA number of checkers are available for finding vulnerable components in specific language packages.JavaThe scanner examines thepom.xmlfile within a Java package archive to identify Java components. The package names and versions within the archive are used to search the database for vulnerabilities.JAR, WAR and EAR archives are supported.JavascriptThe scanner examines thepackage-lock.jsonfile within a javascript application
to identify components. The package names and versions are used to search the database for vulnerabilities.RustThe scanner examines theCargo.lockfile which is created by cargo to manage the dependencies of the project with their specific versions. The package names and versions are used to search the database for vulnerabilities.RubyThe scanner examines theGemfile.lockfile which is created by bundle to manage the dependencies of the project with their specific versions. The package names and versions are used to search the database for vulnerabilities.RThe scanner examines therenv.lockfile which is created by renv to manage the dependencies of the project with their specific versions. The package names and versions are used to search the database for vulnerabilities.GoThe scanner examines thego.modfile which is created by mod to manage the dependencies of the project with their specific versions. The package names and versions are used to search the database for vulnerabilities.SwiftThe scanner examines thePackage.resolvedfile which is created by the package manager to manage the dependencies of the project with their specific versions. The package names and versions are used to search the database for vulnerabilities.PythonThe scanner examines thePKG-INFOandMETADATAfiles for an installed Python package to extract the component name and version which
are used to search the database for vulnerabilities.
Support for scanning therequirements.txtfile generated by pip is also present.The tool supports the scanning of the contents of any Wheel package files (indicated with a file extension of .whl) and egg package files (indicated with a file extension of .egg).The--package-listoption can be used with a Python dependencies filerequirements.txtto find the vulnerabilities in the list of components.PerlThe scanner examines thecpanfilefile within a perl application to identify components. The package names and versions are used to search the database for vulnerabilities.Thecpanfilemust specify the version data for the vulnerability scanner to work. At this time packages without versions will be ignored. (Patches welcome to improve this behaviour in future!)Here's an example of what acpanfilemight look like.SBOM GenerationTo generate a software bill of materials file (SBOM) ensure these options are included:cve-bin-tool--sbom-type<sbom_type>--sbom-format<sbom-format>--sbom-output<sbom_filename><otherscanoptionsasrequired>Valid SBOM types areSPDXandCycloneDX.The generated SBOM will include product name, version and supplier (where available). License information is not provided.LimitationsThis scanner does not attempt to exploit issues or examine the code in greater
detail; it only looks for library signatures and version numbers. As such, it
cannot tell if someone has backported fixes to a vulnerable version, and it
will not work if library or version information was intentionally obfuscated.This tool is meant to be used as a quick-to-run, easily-automatable check in a
non-malicious environment so that developers can be made aware of old libraries
with security issues that have been compiled into their binaries.The tool does not guarantee that any vulnerabilities reported are actually present or exploitable, neither is it able to find all present vulnerabilities with a guarantee.Users can add triage information to reports to mark issues as false positives, indicate that the risk has been mitigated by configuration/usage changes, and so on.Triage details can be re-used on other projects so, for example, triage on a Linux base image could be applied to multiple containers using that image.For more information and usage of triage information with the tool kindly have a lookhere.If you are using the binary scanner capabilities, be aware that we only have a limited number of binary checkers (see table above) so we can only detect those libraries. Contributions of new checkers are always welcome! You can also use an alternate way to detect components (for example, a bill of materials tool such astern) and then use the resulting list as input to cve-bin-tool to get a more comprehensive vulnerability list.The tool uses a vulnerability database in order to detect the present vulnerabilities, in case the database is not frequently updated (specially if the tool is used in offline mode), the tool would be unable to detect any newly discovered vulnerabilities. Hence it is highly advised to keep the database updated.The tool does not guarantee that all vulnerabilities are reported as the tool only has access to a limited number of publicly available vulnerability databases.
Contributions to introduce new sources of data to the tool are always welcome.Whilst some validation checks are performed on the data within the vulnerability database, the tool is unable to assert the quality of the data or correct any
discrepancies if the data is incomplete or inconsistent. This may result, for example, in some vulnerability reports where the severity is reported as UNKNOWN.Additional RequirementsTo use the auto-extractor, you may need the following utilities depending on the type ofsupported archive formatsyou need to extract.The utilities below are required to run the full test suite on Linux:filestringstarunziprpm2cpiocpioarcabextractMost of these are installed by default on many Linux systems, butcabextractandrpm2cpioin particular might need to be installed.On windows systems, you may need:ar7zExpandpdftotextWindows hasExpandinstalled by default, butarand7zmight need to be installed.
If you want to run our test-suite or scan a zstd compressed file, We recommend installing this7-zip-zstdfork of 7zip. We are currently using7zfor extractingjar,apk,msi,exeandrpmfiles.
To installaryou can install MinGW (which has binutils as a part of it) fromhereand run the downloaded .exe file.If you get an error about building libraries when you try to install from pip,
you may need to install the Windows build tools. The Windows build tools are
available for free fromhttps://visualstudio.microsoft.com/visual-cpp-build-tools/If you get an error while installing brotlipy on Windows, installing the
compiler above should fix it.pdftotextis required for running tests. (users of cve-bin-tool may not need it, developers likely will.) The best approach to install it on Windows involves usingconda(clickherefor further instructions).You can checkour CI configurationto see what versions of python we're explicitly testing.Supported Archive FormatsThe following archive formats are currently supported by the auto-extractor:Archive FormatFile Extensionzip.zip, .exe, .jar, .msi, .egg, .whl, .war, .eartar.tar, .tgz, .tar.gz, .tar.xz, .tar.bz2deb.deb, .ipkrpm.rpmcab.cabapk.apkzst.zstpkg.pkgFeedback & ContributionsBugs and feature requests can be made viaGitHub
issues. Be aware that these issues are
not private, so take care when providing output to make sure you are not
disclosing security issues in other products.Pull requests are also welcome via git.New contributors should read thecontributor guideto get started.Folk who already have experience contributing to open source projects may not need the full guide but should still use thepull request checklistto make things easy for everyone.CVE Binary Tool contributors are asked to adhere to thePython Community Code of Conduct. Please contactTerriif you have concerns or questions relating to this code of conduct.Security IssuesSecurity issues with the tool itself can be reported to Intel's security
incident response team viahttps://intel.com/security.If in the course of using this tool you discover a security issue with someone
else's code, please disclose responsibly to the appropriate party.