mirror of
https://git.yoctoproject.org/poky
synced 2026-05-30 12:29:55 +00:00
manuals: further documentation for cve-check
This adds details about the actual implementation of vulnerability checks, about how to fix or ignore vulnerabilities in recipes, and documents the CVE_CHECK_PN_WHITELIST and CVE_CHECK_WHITELIST variables. (From yocto-docs rev: 55886d211218b3a604c2f8a29c854685ebf284dd) Signed-off-by: Michael Opdenacker <michael.opdenacker@bootlin.com> Reviewed-by: Quentin Schulz <foss@0leil.net> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
committed by
Richard Purdie
parent
23e640b809
commit
4c7e3b64bc
@@ -11131,6 +11131,75 @@ Enabling vulnerabily tracking in recipes
|
|||||||
The :term:`CVE_PRODUCT` variable defines the name used to match the recipe name
|
The :term:`CVE_PRODUCT` variable defines the name used to match the recipe name
|
||||||
against the name in the upstream `NIST CVE database <https://nvd.nist.gov/>`__.
|
against the name in the upstream `NIST CVE database <https://nvd.nist.gov/>`__.
|
||||||
|
|
||||||
|
Editing recipes to fix vulnerabilities
|
||||||
|
--------------------------------------
|
||||||
|
|
||||||
|
To fix a given known vulnerability, you need to add a patch file to your recipe. Here's
|
||||||
|
an example from the :oe_layerindex:`ffmpeg recipe</layerindex/recipe/47350>`::
|
||||||
|
|
||||||
|
SRC_URI = "https://www.ffmpeg.org/releases/${BP}.tar.xz \
|
||||||
|
file://0001-libavutil-include-assembly-with-full-path-from-sourc.patch \
|
||||||
|
file://fix-CVE-2020-20446.patch \
|
||||||
|
file://fix-CVE-2020-20453.patch \
|
||||||
|
file://fix-CVE-2020-22015.patch \
|
||||||
|
file://fix-CVE-2020-22021.patch \
|
||||||
|
file://fix-CVE-2020-22033-CVE-2020-22019.patch \
|
||||||
|
file://fix-CVE-2021-33815.patch \
|
||||||
|
|
||||||
|
The :ref:`cve-check <ref-classes-cve-check>` class defines two ways of
|
||||||
|
supplying a patch for a given CVE. The first
|
||||||
|
way is to use a patch filename that matches the below pattern::
|
||||||
|
|
||||||
|
cve_file_name_match = re.compile(".*([Cc][Vv][Ee]\-\d{4}\-\d+)")
|
||||||
|
|
||||||
|
As shown in the example above, multiple CVE IDs can appear in a patch filename,
|
||||||
|
but the :ref:`cve-check <ref-classes-cve-check>` class will only consider
|
||||||
|
the last CVE ID in the file name as patched.
|
||||||
|
|
||||||
|
The second way to recognize a patched CVE ID is when a line matching the
|
||||||
|
below pattern is found in any patch file provided by the recipe::
|
||||||
|
|
||||||
|
cve_match = re.compile("CVE:( CVE\-\d{4}\-\d+)+")
|
||||||
|
|
||||||
|
This allows a single patch file to address multiple CVE IDs at the same time.
|
||||||
|
|
||||||
|
Of course, another way to fix vulnerabilities is to upgrade to a version
|
||||||
|
of the package which is not impacted, typically a more recent one.
|
||||||
|
The NIST database knows which versions are vulnerable and which ones
|
||||||
|
are not.
|
||||||
|
|
||||||
|
Last but not least, you can choose to ignore vulnerabilities through
|
||||||
|
the :term:`CVE_CHECK_PN_WHITELIST` and :term:`CVE_CHECK_WHITELIST`
|
||||||
|
variables.
|
||||||
|
|
||||||
|
Implementation details
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
Here's what the :ref:`cve-check <ref-classes-cve-check>` class does to
|
||||||
|
find unpatched CVE IDs.
|
||||||
|
|
||||||
|
First the code goes through each patch file provided by a recipe. If a valid CVE ID
|
||||||
|
is found in the name of the file, the corresponding CVE is considered as patched.
|
||||||
|
Don't forget that if multiple CVE IDs are found in the file name, only the last
|
||||||
|
one is considered. Then, the code looks for ``CVE: CVE-ID`` lines in the patch
|
||||||
|
file. The found CVE IDs are also considered as patched.
|
||||||
|
|
||||||
|
Then, the code looks up all the CVE IDs in the NIST database for all the
|
||||||
|
products defined in :term:`CVE_PRODUCT`. Then, for each found CVE:
|
||||||
|
|
||||||
|
- If the package name (:term:`PN`) is part of
|
||||||
|
:term:`CVE_CHECK_PN_WHITELIST`, it is considered as patched.
|
||||||
|
|
||||||
|
- If the CVE ID is part of :term:`CVE_CHECK_WHITELIST`, it is
|
||||||
|
considered as patched too.
|
||||||
|
|
||||||
|
- If the CVE ID is part of the patched CVE for the recipe, it is
|
||||||
|
already considered as patched.
|
||||||
|
|
||||||
|
- Otherwise, the code checks whether the recipe version (:term:`PV`)
|
||||||
|
is within the range of versions impacted by the CVE. If so, the CVE
|
||||||
|
is considered as unpatched.
|
||||||
|
|
||||||
The CVE database is stored in :term:`DL_DIR` and can be inspected using
|
The CVE database is stored in :term:`DL_DIR` and can be inspected using
|
||||||
``sqlite3`` command as follows::
|
``sqlite3`` command as follows::
|
||||||
|
|
||||||
|
|||||||
@@ -404,6 +404,22 @@ cross-compilation tools used for building SDKs. See the
|
|||||||
section in the Yocto Project Overview and Concepts Manual for more
|
section in the Yocto Project Overview and Concepts Manual for more
|
||||||
discussion on these cross-compilation tools.
|
discussion on these cross-compilation tools.
|
||||||
|
|
||||||
|
.. _ref-classes-cve-check:
|
||||||
|
|
||||||
|
``cve-check.bbclass``
|
||||||
|
=====================
|
||||||
|
|
||||||
|
The ``cve-check`` class looks for known CVEs (Common Vulnerabilities
|
||||||
|
and Exposures) while building an image. This class is meant to be
|
||||||
|
inherited globally from a configuration file::
|
||||||
|
|
||||||
|
INHERIT += "cve-check"
|
||||||
|
|
||||||
|
You can also look for vulnerabilities in specific packages by passing
|
||||||
|
``-c cve_check`` to BitBake. You will find details in the
|
||||||
|
":ref:`dev-manual/common-tasks:checking for vulnerabilities`"
|
||||||
|
section in the Development Tasks Manual.
|
||||||
|
|
||||||
.. _ref-classes-debian:
|
.. _ref-classes-debian:
|
||||||
|
|
||||||
``debian.bbclass``
|
``debian.bbclass``
|
||||||
|
|||||||
@@ -1471,11 +1471,22 @@ system and gives an overview of their function and contents.
|
|||||||
variable only in certain contexts (e.g. when building for kernel
|
variable only in certain contexts (e.g. when building for kernel
|
||||||
and kernel module recipes).
|
and kernel module recipes).
|
||||||
|
|
||||||
|
:term:`CVE_CHECK_PN_WHITELIST`
|
||||||
|
The list of package names (:term:`PN`) for which
|
||||||
|
CVEs (Common Vulnerabilities and Exposures) are ignored.
|
||||||
|
|
||||||
|
:term:`CVE_CHECK_WHITELIST`
|
||||||
|
The list of CVE IDs which are ignored. Here is
|
||||||
|
an example from the :oe_layerindex:`Python3 recipe</layerindex/recipe/23823>`::
|
||||||
|
|
||||||
|
# This is windows only issue.
|
||||||
|
CVE_CHECK_WHITELIST += "CVE-2020-15523"
|
||||||
|
|
||||||
:term:`CVE_PRODUCT`
|
:term:`CVE_PRODUCT`
|
||||||
In a recipe, defines the name used to match the recipe name
|
In a recipe, defines the name used to match the recipe name
|
||||||
against the name in the upstream `NIST CVE database <https://nvd.nist.gov/>`__.
|
against the name in the upstream `NIST CVE database <https://nvd.nist.gov/>`__.
|
||||||
|
|
||||||
The default is ${:term:`BPN`}. If it does not match the name in NIST CVE
|
The default is ${:term:`BPN`}. If it does not match the name in the NIST CVE
|
||||||
database or matches with multiple entries in the database, the default
|
database or matches with multiple entries in the database, the default
|
||||||
value needs to be changed.
|
value needs to be changed.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user