summaryrefslogtreecommitdiffstats
path: root/documentation/dev-manual/vulnerabilities.rst
diff options
context:
space:
mode:
Diffstat (limited to 'documentation/dev-manual/vulnerabilities.rst')
-rw-r--r--documentation/dev-manual/vulnerabilities.rst214
1 files changed, 214 insertions, 0 deletions
diff --git a/documentation/dev-manual/vulnerabilities.rst b/documentation/dev-manual/vulnerabilities.rst
new file mode 100644
index 0000000000..f8dac5edc6
--- /dev/null
+++ b/documentation/dev-manual/vulnerabilities.rst
@@ -0,0 +1,214 @@
1.. SPDX-License-Identifier: CC-BY-SA-2.0-UK
2
3Checking for Vulnerabilities
4****************************
5
6Vulnerabilities in Poky and OE-Core
7===================================
8
9The Yocto Project has an infrastructure to track and address unfixed
10known security vulnerabilities, as tracked by the public
11:wikipedia:`Common Vulnerabilities and Exposures (CVE) <Common_Vulnerabilities_and_Exposures>`
12database.
13
14The Yocto Project maintains a `list of known vulnerabilities
15<https://autobuilder.yocto.io/pub/non-release/patchmetrics/>`__
16for packages in Poky and OE-Core, tracking the evolution of the number of
17unpatched CVEs and the status of patches. Such information is available for
18the current development version and for each supported release.
19
20Security is a process, not a product, and thus at any time, a number of security
21issues may be impacting Poky and OE-Core. It is up to the maintainers, users,
22contributors and anyone interested in the issues to investigate and possibly fix them by
23updating software components to newer versions or by applying patches to address them.
24It is recommended to work with Poky and OE-Core upstream maintainers and submit
25patches to fix them, see ":ref:`dev-manual/changes:submitting a change to the yocto project`" for details.
26
27Vulnerability check at build time
28=================================
29
30To enable a check for CVE security vulnerabilities using :ref:`cve-check <ref-classes-cve-check>` in the specific image
31or target you are building, add the following setting to your configuration::
32
33 INHERIT += "cve-check"
34
35The CVE database contains some old incomplete entries which have been
36deemed not to impact Poky or OE-Core. These CVE entries can be excluded from the
37check using build configuration::
38
39 include conf/distro/include/cve-extra-exclusions.inc
40
41With this CVE check enabled, BitBake build will try to map each compiled software component
42recipe name and version information to the CVE database and generate recipe and
43image specific reports. These reports will contain:
44
45- metadata about the software component like names and versions
46
47- metadata about the CVE issue such as description and NVD link
48
49- for each software component, a list of CVEs which are possibly impacting this version
50
51- status of each CVE: ``Patched``, ``Unpatched`` or ``Ignored``
52
53The status ``Patched`` means that a patch file to address the security issue has been
54applied. ``Unpatched`` status means that no patches to address the issue have been
55applied and that the issue needs to be investigated. ``Ignored`` means that after
56analysis, it has been deemed to ignore the issue as it for example affects
57the software component on a different operating system platform.
58
59After a build with CVE check enabled, reports for each compiled source recipe will be
60found in ``build/tmp/deploy/cve``.
61
62For example the CVE check report for the ``flex-native`` recipe looks like::
63
64 $ cat poky/build/tmp/deploy/cve/flex-native
65 LAYER: meta
66 PACKAGE NAME: flex-native
67 PACKAGE VERSION: 2.6.4
68 CVE: CVE-2016-6354
69 CVE STATUS: Patched
70 CVE SUMMARY: Heap-based buffer overflow in the yy_get_next_buffer function in Flex before 2.6.1 might allow context-dependent attackers to cause a denial of service or possibly execute arbitrary code via vectors involving num_to_read.
71 CVSS v2 BASE SCORE: 7.5
72 CVSS v3 BASE SCORE: 9.8
73 VECTOR: NETWORK
74 MORE INFORMATION: https://nvd.nist.gov/vuln/detail/CVE-2016-6354
75
76 LAYER: meta
77 PACKAGE NAME: flex-native
78 PACKAGE VERSION: 2.6.4
79 CVE: CVE-2019-6293
80 CVE STATUS: Ignored
81 CVE SUMMARY: An issue was discovered in the function mark_beginning_as_normal in nfa.c in flex 2.6.4. There is a stack exhaustion problem caused by the mark_beginning_as_normal function making recursive calls to itself in certain scenarios involving lots of '*' characters. Remote attackers could leverage this vulnerability to cause a denial-of-service.
82 CVSS v2 BASE SCORE: 4.3
83 CVSS v3 BASE SCORE: 5.5
84 VECTOR: NETWORK
85 MORE INFORMATION: https://nvd.nist.gov/vuln/detail/CVE-2019-6293
86
87For images, a summary of all recipes included in the image and their CVEs is also
88generated in textual and JSON formats. These ``.cve`` and ``.json`` reports can be found
89in the ``tmp/deploy/images`` directory for each compiled image.
90
91At build time CVE check will also throw warnings about ``Unpatched`` CVEs::
92
93 WARNING: flex-2.6.4-r0 do_cve_check: Found unpatched CVE (CVE-2019-6293), for more information check /poky/build/tmp/work/core2-64-poky-linux/flex/2.6.4-r0/temp/cve.log
94 WARNING: libarchive-3.5.1-r0 do_cve_check: Found unpatched CVE (CVE-2021-36976), for more information check /poky/build/tmp/work/core2-64-poky-linux/libarchive/3.5.1-r0/temp/cve.log
95
96It is also possible to check the CVE status of individual packages as follows::
97
98 bitbake -c cve_check flex libarchive
99
100Fixing CVE product name and version mappings
101============================================
102
103By default, :ref:`cve-check <ref-classes-cve-check>` uses the recipe name :term:`BPN` as CVE
104product name when querying the CVE database. If this mapping contains false positives, e.g.
105some reported CVEs are not for the software component in question, or false negatives like
106some CVEs are not found to impact the recipe when they should, then the problems can be
107in the recipe name to CVE product mapping. These mapping issues can be fixed by setting
108the :term:`CVE_PRODUCT` variable inside the recipe. This defines the name of the software component in the
109upstream `NIST CVE database <https://nvd.nist.gov/>`__.
110
111The variable supports using vendor and product names like this::
112
113 CVE_PRODUCT = "flex_project:flex"
114
115In this example the vendor name used in the CVE database is ``flex_project`` and the
116product is ``flex``. With this setting the ``flex`` recipe only maps to this specific
117product and not products from other vendors with same name ``flex``.
118
119Similarly, when the recipe version :term:`PV` is not compatible with software versions used by
120the upstream software component releases and the CVE database, these can be fixed using
121the :term:`CVE_VERSION` variable.
122
123Note that if the CVE entries in the NVD database contain bugs or have missing or incomplete
124information, it is recommended to fix the information there directly instead of working
125around the issues possibly for a long time in Poky and OE-Core side recipes. Feedback to
126NVD about CVE entries can be provided through the `NVD contact form <https://nvd.nist.gov/info/contact-form>`__.
127
128Fixing vulnerabilities in recipes
129=================================
130
131If a CVE security issue impacts a software component, it can be fixed by updating to a newer
132version of the software component or by applying a patch. For Poky and OE-Core master branches, updating
133to a newer software component release with fixes is the best option, but patches can be applied
134if releases are not yet available.
135
136For stable branches, it is preferred to apply patches for the issues. For some software
137components minor version updates can also be applied if they are backwards compatible.
138
139Here is an example of fixing CVE security issues with patch files,
140an example from the :oe_layerindex:`ffmpeg recipe</layerindex/recipe/47350>`::
141
142 SRC_URI = "https://www.ffmpeg.org/releases/${BP}.tar.xz \
143 file://0001-libavutil-include-assembly-with-full-path-from-sourc.patch \
144 file://fix-CVE-2020-20446.patch \
145 file://fix-CVE-2020-20453.patch \
146 file://fix-CVE-2020-22015.patch \
147 file://fix-CVE-2020-22021.patch \
148 file://fix-CVE-2020-22033-CVE-2020-22019.patch \
149 file://fix-CVE-2021-33815.patch \
150
151A good practice is to include the CVE identifier in both the patch file name
152and inside the patch file commit message using the format::
153
154 CVE: CVE-2020-22033
155
156CVE checker will then capture this information and change the CVE status to ``Patched``
157in the generated reports.
158
159If analysis shows that the CVE issue does not impact the recipe due to configuration, platform,
160version or other reasons, the CVE can be marked as ``Ignored`` using the :term:`CVE_CHECK_IGNORE` variable.
161As mentioned previously, if data in the CVE database is wrong, it is recommend to fix those
162issues in the CVE database directly.
163
164Recipes can be completely skipped by CVE check by including the recipe name in
165the :term:`CVE_CHECK_SKIP_RECIPE` variable.
166
167Implementation details
168======================
169
170Here's what the :ref:`cve-check <ref-classes-cve-check>` class does to
171find unpatched CVE IDs.
172
173First the code goes through each patch file provided by a recipe. If a valid CVE ID
174is found in the name of the file, the corresponding CVE is considered as patched.
175Don't forget that if multiple CVE IDs are found in the filename, only the last
176one is considered. Then, the code looks for ``CVE: CVE-ID`` lines in the patch
177file. The found CVE IDs are also considered as patched.
178
179Then, the code looks up all the CVE IDs in the NIST database for all the
180products defined in :term:`CVE_PRODUCT`. Then, for each found CVE:
181
182- If the package name (:term:`PN`) is part of
183 :term:`CVE_CHECK_SKIP_RECIPE`, it is considered as ``Patched``.
184
185- If the CVE ID is part of :term:`CVE_CHECK_IGNORE`, it is
186 set as ``Ignored``.
187
188- If the CVE ID is part of the patched CVE for the recipe, it is
189 already considered as ``Patched``.
190
191- Otherwise, the code checks whether the recipe version (:term:`PV`)
192 is within the range of versions impacted by the CVE. If so, the CVE
193 is considered as ``Unpatched``.
194
195The CVE database is stored in :term:`DL_DIR` and can be inspected using
196``sqlite3`` command as follows::
197
198 sqlite3 downloads/CVE_CHECK/nvdcve_1.1.db .dump | grep CVE-2021-37462
199
200When analyzing CVEs, it is recommended to:
201
202- study the latest information in `CVE database <https://nvd.nist.gov/vuln/search>`__.
203
204- check how upstream developers of the software component addressed the issue, e.g.
205 what patch was applied, which upstream release contains the fix.
206
207- check what other Linux distributions like `Debian <https://security-tracker.debian.org/tracker/>`__
208 did to analyze and address the issue.
209
210- follow security notices from other Linux distributions.
211
212- follow public `open source security mailing lists <https://oss-security.openwall.org/wiki/mailing-lists>`__ for
213 discussions and advance notifications of CVE bugs and software releases with fixes.
214