{"id":8037,"date":"2026-10-20T06:00:00","date_gmt":"2026-10-20T05:00:00","guid":{"rendered":"https:\/\/www.blaess.fr\/christophe\/?p=8037"},"modified":"2026-10-19T15:14:44","modified_gmt":"2026-10-19T14:14:44","slug":"analyser-les-rapports-cve-de-yocto-avec-cve-parse","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2026\/10\/20\/analyser-les-rapports-cve-de-yocto-avec-cve-parse\/","title":{"rendered":"Analyser les rapports CVE de Yocto avec cve-parse"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"alignright size-full is-resized\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/10\/thubmnail-08-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"280\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/10\/thubmnail-08-1.png\" alt=\"\" class=\"wp-image-8090\" style=\"width:300px;height:auto\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/10\/thubmnail-08-1.png 400w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/10\/thubmnail-08-1-300x210.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Pour faciliter l\u2019analyse des rapports concernant les CVE produits lors d\u2019un <em>build<\/em> Yocto Project, j\u2019ai d\u00e9velopp\u00e9 un petit outil nomm\u00e9 <code><strong>cve-parse<\/strong><\/code>. Il permet d\u2019obtenir rapidement une vue d\u2019ensemble des composants d\u2019une image, de consulter les vuln\u00e9rabilit\u00e9s associ\u00e9es \u00e0 un composant particulier ou de rechercher directement une CVE.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dans <a href=\"https:\/\/www.blaess.fr\/christophe\/2026\/10\/13\/que-faire-face-a-une-vulnerabilite-dans-un-equipement-embarque\/\" data-type=\"post\" data-id=\"7964\"><strong>le pr\u00e9c\u00e9dent article<\/strong><\/a>, consacr\u00e9 au <em>Cyber Resilience Act<\/em>, nous avons vu qu\u2019en cas de d\u00e9couverte d\u2019une vuln\u00e9rabilit\u00e9 activement exploit\u00e9e, l\u2019une des premi\u00e8res questions auxquelles le fabricant doit pouvoir r\u00e9pondre est tr\u00e8s simple en apparence&nbsp;: mon produit contient-il le composant vuln\u00e9rable&nbsp;?<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">Dans un syst\u00e8me Linux embarqu\u00e9, la r\u00e9ponse est rarement simple \u00e0 obtenir. Une image contient plusieurs dizaines ou centaines de composants logiciels, auxquels peuvent \u00eatre associ\u00e9es des centaines, voire des milliers d\u2019entr\u00e9es CVE.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le projet Yocto fournit heureusement les outils n\u00e9cessaires pour produire une <strong>SBOM<\/strong> (<em>Software Bill of Materials<\/em>, \u00ab\u00a0inventaire logiciel\u00a0\u00bb en fran\u00e7ais) et analyser les vuln\u00e9rabilit\u00e9s connues associ\u00e9es aux composants d\u2019une image. Les informations produites sont tr\u00e8s compl\u00e8tes. Parfois m\u00eame un peu trop si l&rsquo;on veut simplement obtenir un premier aper\u00e7u de la situation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C\u2019est pour faciliter cette exploration que j\u2019ai d\u00e9velopp\u00e9 (avec pas mal d&rsquo;aide de <strong>Codex<\/strong>), un petit outil nomm\u00e9 <code><strong>cve-parse<\/strong><\/code>. Son code est disponible ici&nbsp;: <strong><a href=\"https:\/\/github.com\/cpb-\/yocto-cve-parser\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/cpb-\/yocto-cve-parser<\/a><\/strong>. Il est plac\u00e9 sous licence MIT.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dans cet article, nous allons construire une image Yocto de test, g\u00e9n\u00e9rer son rapport de vuln\u00e9rabilit\u00e9s puis voir comment <code>cve-parse<\/code> permet de l\u2019explorer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je suis parfaitement conscient qu&rsquo;il existe probablement <strong>d&rsquo;autres outils<\/strong> permettant d&rsquo;analyser les CVE et les rapports de <em>Yocto Project<\/em>, j&rsquo;avais simplement envie d&rsquo;un outil <strong>adapt\u00e9 \u00e0 mon besoin<\/strong>  (le suivi du socle logiciel offert par <a href=\"https:\/\/www.blaess.fr\/christophe\/2026\/08\/25\/eris-linux\/\" data-type=\"post\" data-id=\"7123\"><strong>Eris Linux<\/strong><\/a>) et c&rsquo;\u00e9tait <strong>l&rsquo;occasion de m&rsquo;amuser avec Codex<\/strong> pour le d\u00e9veloppement et la documentation d&rsquo;un petit outil <em>Open Source<\/em>.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Produire un rapport CVE avec Yocto<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Pour cet exemple, je vais utiliser <strong>Yocto Cooker<\/strong>, afin d&rsquo;acc\u00e9l\u00e9rer la mise en place du <em>build<\/em>. Commen\u00e7ons par cr\u00e9er un environnement Python d\u00e9di\u00e9, et installer Cooker&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>sudo apt install  python3.12-venv<\/strong>\n  &#91;...]\n\n$ <strong>python3  -m  venv  cooker-env<\/strong>\n\n$ <strong>. cooker-env\/bin\/activate<\/strong>\n\n$ <strong>python3  -m  pip  install  --upgrade  yocto-cooker<\/strong>\n  &#91;...]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00e9cup\u00e9rons ensuite les <strong>menus d&rsquo;exemple<\/strong> fournis dans le d\u00e9p\u00f4t de Yocto Cooker&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>git  clone  https:\/\/github.com\/cpb-\/yocto-cooker<\/strong>\n\n$ <strong>cp  yocto-cooker\/sample-menus\/qemu-sample-menu-wrynose.json  .<\/strong><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nous allons utiliser une cible <strong>QEMU Arm<\/strong>, pour produire rapidement une image, mais ce qui nous int\u00e9resse ce sont les rapports de vuln\u00e9rabilit\u00e9s. Je n&rsquo;ai m\u00eame pas l&rsquo;intention de faire d\u00e9marrer l&rsquo;image produite.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Les lignes \u00e0 ajouter dans le fichier <code>conf\/local.conf<\/code> pour produire le rapport de vuln\u00e9rabilit\u00e9 <a href=\"https:\/\/docs.yoctoproject.org\/singleindex.html#cve-check-class-removed\" target=\"_blank\" rel=\"noopener nofollow\">ont chang\u00e9<\/a> depuis la branche Wrynose. &#x1f644; <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Avec le menu utilisant la branche <strong>Yocto Wrynose<\/strong>, nous ajoutons au fichier <code>local.conf<\/code> la ligne <code><strong>OE_FRAGMENTS<\/strong><\/code> suivante&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\"local.conf\": &#91;\n    \"MACHINE = 'qemuarm'                     \",\n    \"DISTRO  = 'poky'                        \",\n    \"IMAGE_FEATURES += 'empty-root-password' \",\n<strong>    \"OE_FRAGMENTS += 'core\/yocto\/sbom-cve-check' \"\n<\/strong>]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Alors qu&rsquo;avec une branche ant\u00e9rieure comme <strong>Scarthgap<\/strong>, il fallait ajouter la ligne <code><strong>INHERIT<\/strong><\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\"local.conf\": &#91;\n    \"MACHINE = 'qemuarm'                     \",\n    \"DISTRO  = 'poky'                        \",\n    \"IMAGE_FEATURES += 'empty-root-password' \",\n<strong>    \"INHERIT += 'cve-check'                  \"<\/strong>\n]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Construction de l\u2019image<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nous pouvons construire l&rsquo;image avec la commande suivante, qui va prendre un peu de temps et qui produira par la m\u00eame occasion le rapport de vuln\u00e9rabilit\u00e9s&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>cooker  cook  qemu-sample-menu-wrynose.json<\/strong>\n\n  &#91;...]\n\nInitialising tasks: 100% |########################################| Time: 0:00:04\nNOTE: Executing Tasks\n\n  &#91;...]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Une fois la compilation termin\u00e9e, plusieurs nouveaux \u00e9l\u00e9ments apparaissent dans le r\u00e9pertoire <code>tmp\/<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>ls  builds\/build-qemuarm\/tmp\/deploy\/<\/strong>\n\nimages  licenses  rpm  sbom-cve-check  spdx<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Notamment, dans le r\u00e9pertoire <code>images\/<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>ls  builds\/build-qemuarm\/tmp\/deploy\/images\/qemuarm<\/strong>\n  &#91;...]\ncore-image-base-qemuarm.rootfs-20261017082851.sbom-cve-check.spdx.json\ncore-image-base-qemuarm.rootfs-20261017082851.sbom-cve-check.yocto.json\ncore-image-base-qemuarm.rootfs-20261017082851.spdx.json\n  &#91;...]\ncore-image-base-qemuarm.rootfs.sbom-cve-check.spdx.json\ncore-image-base-qemuarm.rootfs.sbom-cve-check.yocto.json\ncore-image-base-qemuarm.rootfs.spdx.json<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le fichier qui nous int\u00e9resse principalement est <strong><code>core-image-base-qemuarm.rootfs.sbom-cve-check.yocto.json<\/code><\/strong>. Il contient le rapport produit par Yocto. En jetant un coup d\u2019\u0153il \u00e0 son contenu nous voyons qu&rsquo;il est particuli\u00e8rement d\u00e9taill\u00e9, et sera difficile \u00e0 consulter tel quel&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"version\": \"1\",\n  \"package\": &#91;\n    {\n      \"name\": \"acl\",\n      \"layer\": \"core\",\n      \"version\": \"2.3.2\",\n      \"products\": &#91;\n        {\n          \"product\": \"acl\",\n          \"cvesInRecord\": \"Yes\"\n        }\n      ],\n      \"issue\": &#91;\n        {\n          \"id\": \"CVE-2009-4411\",\n          \"status\": \"Patched\",\n          \"link\": \"https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2009-4411\",\n          \"summary\": \"...\",\n          \"scorev2\": \"3.7\",\n          \"scorev3\": \"0.0\",\n          \"scorev4\": \"0.0\",\n          \"modified\": \"2026-06-16T23:13:36.000\",\n          \"vector\": \"LOCAL\",\n          \"vectorString\": \"AV:L\/AC:H\/Au:N\/C:P\/I:P\/A:P\",\n          \"detail\": \"version-not-in-range\"\n        },\n\n        &#91;...]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le format est adapt\u00e9 \u00e0 un traitement automatis\u00e9 et contient beaucoup d\u2019informations int\u00e9ressantes&nbsp;: composant, num\u00e9ro de version, num\u00e9ro de CVE, pr\u00e9sence d&rsquo;un <em>patch<\/em>, score CVSS, vecteur d\u2019attaque, description, etc. En revanche, pour un humain il est difficile de savoir quelles vuln\u00e9rabilit\u00e9s non corrig\u00e9es sont pr\u00e9sentes dans l&rsquo;image.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On peut \u00e9videmment \u00e9crire des requ\u00eates <code>jq<\/code>, mais j\u2019avais envie d\u2019un petit outil sp\u00e9cialis\u00e9 permettant de naviguer rapidement dans ces informations.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour les branches de Yocto ant\u00e9rieures (jusqu&rsquo;\u00e0 <em>Scarthgap<\/em>), le fichier \u00e9tait&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>ls  builds\/build-qemuarm-scarthgap\/tmp\/deploy\/images\/qemuarm\/<\/strong>\ncore-image-base-qemuarm.rootfs-20261017161823.cve\n  &#91;...]\ncore-image-base-qemuarm.rootfs.cve\n  &#91;...]\n$\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">C&rsquo;est le lien symbolique <code>core-image-base-qemuarm.rootfs.cve<\/code> qui nous int\u00e9resse. Il contient les vuln\u00e9rabilit\u00e9s concernant <strong>les <em>packages<\/em> embarqu\u00e9s sur la cible<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c0 l&rsquo;inverse, dans le <em>build<\/em> <strong>Wrynose<\/strong> utilis\u00e9 ici, j\u2019ai constat\u00e9 que le rapport <code><strong><code>core-image-base-qemuarm.rootfs.sbom-cve-check.yocto.json<\/code><\/strong><\/code> contient \u00e9galement des composants qui ne sont <strong>pas pr\u00e9sents dans le syst\u00e8me de fichiers<\/strong> final. \u00c0 titre d&rsquo;exemple, <code><strong>bash<\/strong><\/code> appara\u00eet dans le rapport alors qu\u2019il n\u2019est pas install\u00e9 sur notre cible.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>jq  -r  \".package&#91;].name\"  core-image-base-qemuarm.rootfs.sbom-cve-check.yocto.json  |  grep  'bash'<\/strong>\nbash\nbash-completion\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Il faudra donc <strong>filtrer les packages<\/strong> pour ne conserver que ceux qui sont dans le manifeste de la cible. Nous utiliserons le second fichier fourni par Yocto (depuis <em>Wrynose<\/em>)&nbsp;: <code><strong>core-image-base-qemuarm.rootfs.spdx.json<\/strong><\/code> et une option sp\u00e9cifique de <code>cve-parse<\/code>.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Installation de <code>cve-parse<\/code><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00e9cup\u00e9rons le projet&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>git  clone  https:\/\/github.com\/cpb-\/yocto-cve-parser<\/strong><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Copions dans notre r\u00e9pertoire de travail les deux fichiers produits par la branche <em>Wrynose<\/em> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>cp  builds\/build-qemuarm\/tmp\/deploy\/images\/qemuarm\/core-image-base-qemuarm.rootfs.sbom-cve-check.yocto.json  .<\/strong>\n\n$ <strong>cp  builds\/build-qemuarm\/tmp\/deploy\/images\/qemuarm\/core-image-base-qemuarm.rootfs.spdx.json  .<\/strong><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nous pouvons maintenant commencer l\u2019analyse.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Aper\u00e7u de la situation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sans option suppl\u00e9mentaire et avec uniquement le fichier de CVE, <code>cve-parse<\/code> affiche un <strong>r\u00e9sum\u00e9 par composant<\/strong> mentionn\u00e9 dans le fichier&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>.\/cve-parse  core-image-base-qemuarm.rootfs.sbom-cve-check.yocto.json  <\/strong>\nCOMPONENT               VERSION       TOTAL  PATCHED  UNPATCHED  IGNORED  OTHER\nacl                     2.3.2         4      2        2          0        0\nalsa-lib                1.2.15.3      6      2        4          0        0\nalsa-state              0.2.0         0      0        0          0        0\nalsa-ucm-conf           1.2.15.3      0      0        0          0        0\nalsa-utils              1.2.15.2      0      0        0          0        0\nattr                    2.5.2         1      0        1          0        0\navahi                   0.8           26     24       1          1        0\navahi-libnss-mdns       0.15.1        0      0        0          0        0\nbase-files              3.0.14        1      0        0          1        0\nbase-passwd             3.6.8         0      0        0          0        0\nbash                    5.3           18     18       0          0        0\nbash-completion         2.17.0        0      0        0          0        0\nbluez5                  5.86          43     39       1          3        0\n  &#91;...]\nzlib                    1.3.2         16     14       2          0        0\nzstd                    1.5.7         4      4        0          0        0\nTOTAL                                 22445  18522    1073       2850     0\n\nComponents: 93; unique CVEs: 22328\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le total fait un peu peur, mais en <strong>filtrant<\/strong> avec l&rsquo;option <code><strong>-f<\/strong><\/code> et la liste des packages r\u00e9ellement embarqu\u00e9s sur la cible, les nombres diminuent&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>.\/cve-parse  core-image-base-qemuarm.rootfs.sbom-cve-check.yocto.json   -f  core-image-base-qemuarm.rootfs.spdx.json <\/strong>\nCOMPONENT               VERSION      TOTAL  PATCHED  UNPATCHED  IGNORED  OTHER\nacl                     2.3.2        4      2        2          0        0\nalsa-lib                1.2.15.3     6      2        4          0        0\nalsa-state              0.2.0        0      0        0          0        0\nalsa-ucm-conf           1.2.15.3     0      0        0          0        0\nalsa-utils              1.2.15.2     0      0        0          0        0\nattr                    2.5.2        1      0        1          0        0\navahi                   0.8          26     24       1          1        0\navahi-libnss-mdns       0.15.1       0      0        0          0        0\nbase-files              3.0.14       1      0        0          1        0\nbase-passwd             3.6.8        0      0        0          0        0\nbluez5                  5.86         43     39       1          3        0\nbusybox                 1.37.0       51     47       4          0        0\ndbus                    1.16.2       26     26       0          0        0\ndosfstools              4.2          2      2        0          0        0\neudev                   3.2.14       0      0        0          0        0\nexpat                   2.7.5        70     59       11         0        0\nglib-2.0                2.88.2       35     35       0          0        0\nglibc                   2.43+git     179    159      16         4        0\ninit-ifupdown           1.0          0      0        0          0        0\ninit-system-helpers     1.69         0      0        0          0        0\ninitscripts             1.0          2      2        0          0        0\nkmod                    34.2         0      0        0          0        0\nlibcap                  2.77         5      5        0          0        0\nlibdaemon               0.14         0      0        0          0        0\nlibffi                  3.5.2        1      1        0          0        0\nlibgcc                  15.3.0       16     16       0          0        0\nlibpcre2                10.47        19     11       8          0        0\nlibtirpc                1.3.7        5      5        0          0        0\nlibx11                  1.8.13       22     18       4          0        0\nlibxau                  1.0.12       0      0        0          0        0\nlibxcb                  1.17.0       1      1        0          0        0\nlibxcrypt               4.5.2        0      0        0          0        0\nlibxdmcp                1.1.5        1      1        0          0        0\nlibxml2                 2.15.2       120    111      9          0        0\nlinux-yocto             6.18.39+git  20851  17061    952        2838     0\nmodutils-initscripts    1.0          0      0        0          0        0\nncurses                 6.6          31     31       0          0        0\nnetbase                 6.5          0      0        0          0        0\nopenssl                 3.5.7        322    299      23         0        0\nopkg-utils              0.7.0        0      0        0          0        0\npackagegroup-base       1.0          0      0        0          0        0\npackagegroup-core-boot  1.0          0      0        0          0        0\npsplash                 0.1+git      0      0        0          0        0\nreadline                8.3          1      1        0          0        0\nrpcbind                 1.2.8        4      4        0          0        0\nshadow                  4.19.4       13     12       0          1        0\nshadow-securetty        4.6          0      0        0          0        0\nshared-mime-info        2.4          0      0        0          0        0\nsysvinit                3.14         0      0        0          0        0\nsysvinit-inittab        2.88dsf      0      0        0          0        0\ntar                     1.35         20     17       2          1        0\nttyrun                  2.41.0       1      1        0          0        0\nupdate-rc.d             0.8+git      0      0        0          0        0\nutil-linux              2.41.5       35     28       7          0        0\nxz                      5.8.2        9      8        0          1        0\nzlib                    1.3.2        16     14       2          0        0\nTOTAL                                21939  18042    1047       2850     0\n\nComponents: 56; unique CVEs: 21936\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Pour chaque composant logiciel, nous obtenons&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>son num\u00e9ro de version,<\/li>\n\n\n\n<li>le nombre total d\u2019enregistrements CVE,<\/li>\n\n\n\n<li>le nombre de CVE auxquelles Yocto attribut l&rsquo;\u00e9tat \u00ab\u00a0corrig\u00e9e\u00a0\u00bb (<em>Patched<\/em>),<\/li>\n\n\n\n<li>celles encore non corrig\u00e9es (<em>Unpatched<\/em>),<\/li>\n\n\n\n<li>celles explicitement ignor\u00e9es (<em>Ignored<\/em>),<\/li>\n\n\n\n<li>les \u00e9ventuels autres \u00e9tats (je n&rsquo;en ai pas rencontr\u00e9 encore).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le nombre concernant le noyau Linux est particuli\u00e8rement spectaculaire&nbsp;: plus de 20&nbsp;000 entr\u00e9es&nbsp;! Il ne faut \u00e9videmment pas interpr\u00e9ter cette colonne comme signifiant que notre syst\u00e8me embarqu\u00e9 contient 20&nbsp;000 vuln\u00e9rabilit\u00e9s exploitables. Le nombre de CVE attribu\u00e9es au noyau Linux a consid\u00e9rablement augment\u00e9 ces derni\u00e8res ann\u00e9es et le travail important consiste justement \u00e0 d\u00e9terminer quelles vuln\u00e9rabilit\u00e9s concernent r\u00e9ellement la configuration, les sources compil\u00e9es et l\u2019utilisation du noyau dans notre produit.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Examiner un composant<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Int\u00e9ressons-nous par exemple au composant <code>acl<\/code>, pour lequel le r\u00e9sum\u00e9 indiquait quatre CVE, dont deux non corrig\u00e9es. L\u2019option <code><strong>-c<\/strong><\/code> ou <code><strong>--component<\/strong><\/code> permet d\u2019obtenir la liste correspondante&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>.\/yocto-cve-parser\/cve-parse  core-image-base-qemuarm.rootfs.sbom-cve-check.yocto.json -f core-image-base-qemuarm.rootfs.spdx.json  -c acl<\/strong>\n\nCOMPONENT  VERSION  CVE             STATUS     CVSS  SCORE  SEVERITY\nacl        2.3.2    CVE-2018-25320  Patched    4.0   9.3    Critical\nacl        2.3.2    CVE-2026-54369  Unpatched  4.0   8.4    High\nacl        2.3.2    CVE-2026-54370  Unpatched  4.0   7.2    High\nacl        2.3.2    CVE-2009-4411   Patched    2.0   3.7    Low<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On voit imm\u00e9diatement que les deux entr\u00e9es qui m\u00e9ritent notre attention sont&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>CVE-2026-54369<\/code><\/li>\n\n\n\n<li><code>CVE-2026-54370<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">toutes deux class\u00e9es en criticit\u00e9 \u00e9lev\u00e9e et signal\u00e9es comme <code>Unpatched<\/code>. Le tableau indique \u00e9galement la version CVSS utilis\u00e9e et le score correspondant.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Obtenir tous les d\u00e9tails<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L\u2019option <code>-d<\/code> ou <code>--details<\/code> permet d\u2019afficher les <strong>informations compl\u00e8tes<\/strong> disponibles dans le rapport Yocto&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>.\/cve-parse  core-image-base-qemuarm.rootfs.sbom-cve-check.yocto.json  -f ~\/core-image-base-qemuarm.rootfs.spdx.json  -c acl  -d<\/strong>\ncomponent: acl\nversion: 2.3.2\nlayer: core\ncve: CVE-2018-25320\nstatus: Patched\ncvss: 4.0\nscore: 9.3\nseverity: Critical\nissue.id: CVE-2018-25320\nissue.status: Patched\nissue.link: https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2018-25320\nissue.summary: ACL Analytics versions 11.x through 13.0.0.579 contain an arbitrary code execution vulnerability that allows attackers to execute arbitrary commands by leveraging the EXECUTE function. Attackers can use bitsadmin to download malicious PowerShell scripts and execute them with system privileges to establish reverse shells and gain complete system control.\nissue.scorev2: 0.0\nissue.scorev3: 9.8\nissue.scorev4: 9.3\nissue.modified: 2026-10-01T15:19:15.000\nissue.vector: NETWORK\nissue.vectorString: CVSS:4.0\/AV:N\/AC:L\/AT:N\/PR:N\/UI:N\/VC:H\/VI:H\/VA:H\/SC:N\/SI:N\/SA:N\/E:X\/CR:X\/IR:X\/AR:X\/MAV:X\/MAC:X\/MAT:X\/MPR:X\/MUI:X\/MVC:X\/MVI:X\/MVA:X\/MSC:X\/MSI:X\/MSA:X\/S:X\/AU:X\/R:X\/V:X\/RE:X\/U:X\nissue.detail: version-not-in-range: Only affects 11.0 onwards\n\ncomponent: acl\nversion: 2.3.2\nlayer: core\ncve: CVE-2026-54369\nstatus: Unpatched\ncvss: 4.0\nscore: 8.4\nseverity: High\nissue.id: CVE-2026-54369\nissue.status: Unpatched\nissue.link: https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2026-54369\nissue.summary: acl before version 2.4.0 contains a symlink traversal vulnerability in the libacl pathname-based functions acl_get_file(), acl_set_file(), acl_extended_file(), and acl_delete_def_file() that allows local attackers to escalate privileges by replacing any pathname component with a symbolic link. Attackers who control any component of a pathname processed by a privileged caller can redirect ACL read or write operations to arbitrary files or directories, enabling unauthorized manipulation of access control lists and local privilege escalation.\nissue.scorev2: 0.0\nissue.scorev3: 7.1\nissue.scorev4: 8.4\nissue.modified: 2026-09-14T13:18:40.000\nissue.vector: LOCAL\nissue.vectorString: CVSS:4.0\/AV:L\/AC:L\/AT:N\/PR:L\/UI:N\/VC:H\/VI:H\/VA:N\/SC:N\/SI:N\/SA:N\/E:X\/CR:X\/IR:X\/AR:X\/MAV:X\/MAC:X\/MAT:X\/MPR:X\/MUI:X\/MVC:X\/MVI:X\/MVA:X\/MSC:X\/MSI:X\/MSA:X\/S:X\/AU:X\/R:X\/V:X\/RE:X\/U:X\nissue.detail: version-in-range\nissue.description: Needs backporting (fixed from 2.4.0)\n\ncomponent: acl\nversion: 2.3.2\nlayer: core\ncve: CVE-2026-54370\nstatus: Unpatched\ncvss: 4.0\nscore: 7.2\nseverity: High\nissue.id: CVE-2026-54370\nissue.status: Unpatched\nissue.link: https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2026-54370\nissue.summary: acl before version 2.4.0 contains a time-of-check to time-of-use (TOCTOU) race condition vulnerability that allows local attackers to escalate privileges by replacing a pathname component with a symbolic link between an lstat() check and subsequent symlink-following operations such as stat(), chown(), chmod(), acl_get_file(), and acl_set_file(). Attackers who control a pathname component can redirect file access control list operations to arbitrary files when getfacl, setfacl, or chacl is invoked by a privileged process over an attacker-controlled path, resulting in local privilege escalation.\nissue.scorev2: 0.0\nissue.scorev3: 6.3\nissue.scorev4: 7.2\nissue.modified: 2026-07-14T21:33:49.000\nissue.vector: LOCAL\nissue.vectorString: CVSS:4.0\/AV:L\/AC:H\/AT:N\/PR:L\/UI:N\/VC:H\/VI:H\/VA:N\/SC:N\/SI:N\/SA:N\/E:X\/CR:X\/IR:X\/AR:X\/MAV:X\/MAC:X\/MAT:X\/MPR:X\/MUI:X\/MVC:X\/MVI:X\/MVA:X\/MSC:X\/MSI:X\/MSA:X\/S:X\/AU:X\/R:X\/V:X\/RE:X\/U:X\nissue.detail: version-in-range\nissue.description: Needs backporting (fixed from 2.4.0)\n\n  &#91;...]\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Prenons par exemple  la vuln\u00e9rabilit\u00e9 <code>CVE-2026-54369<\/code>, on voit que&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>la vuln\u00e9rabilit\u00e9 est consid\u00e9r\u00e9e comme applicable \u00e0 la version utilis\u00e9e (<code>issue.detail: version-in-range<\/code>)<\/li>\n\n\n\n<li>son vecteur d&rsquo;attaque est local (<code>issue.vector: LOCAL<\/code>),<\/li>\n\n\n\n<li>elle peut conduire \u00e0 un gain de privil\u00e8ge (<code>issue.summary: [...] to escalate privileges [...]<\/code>),<\/li>\n\n\n\n<li>une correction existe \u00e0 partir de la version 2.4.0 mais n\u00e9cessite un <em>backport<\/em>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ce sont ces donn\u00e9es que nous pourrons ensuite utiliser pour d\u00e9terminer si notre produit est vuln\u00e9rable ou non en \u00e9tudiant le contexte d&rsquo;utilisation de ce composant logiciel. Et faire \u00e9ventuellement un signalement conforme au <em><strong>Cyber Resilience Act<\/strong><\/em>, comme je l&rsquo;avais d\u00e9velopp\u00e9 dans l&rsquo;<a href=\"https:\/\/www.blaess.fr\/christophe\/2026\/10\/13\/que-faire-face-a-une-vulnerabilite-dans-un-equipement-embarque\/\" data-type=\"post\" data-id=\"7964\"><strong>article pr\u00e9c\u00e9dent<\/strong><\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Rechercher directement une CVE<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le chemin inverse est \u00e9galement fr\u00e9quent. Supposons que nous recevions une alerte nous indiquant que <code>CVE-2026-54370<\/code> m\u00e9rite une attention particuli\u00e8re. La question devient \u00ab\u00a0<strong>cette vuln\u00e9rabilit\u00e9 est-elle pr\u00e9sente<\/strong> dans mon image, et quel composant concerne-t-elle&nbsp;?\u00a0\u00bb<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;option  <code><strong>cve<\/strong><\/code> de <code>cve-parse<\/code> permet cette recherche directement&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>.\/cve-parse  core-image-base-qemuarm.rootfs.sbom-cve-check.yocto.json  -f core-image-base-qemuarm.rootfs.spdx.json  cve CVE-2026-54370<\/strong>\ncomponent: acl\nversion: 2.3.2\nlayer: core\ncve: CVE-2026-54370\nstatus: Unpatched\ncvss: 4.0\nscore: 7.2\nseverity: High\nissue.id: CVE-2026-54370\nissue.status: Unpatched\nissue.link: https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2026-54370\nissue.summary: acl before version 2.4.0 contains a time-of-check to time-of-use (TOCTOU) race condition vulnerability that allows local attackers to escalate privileges by replacing a pathname component with a symbolic link between an lstat() check and subsequent symlink-following operations such as stat(), chown(), chmod(), acl_get_file(), and acl_set_file(). Attackers who control a pathname component can redirect file access control list operations to arbitrary files when getfacl, setfacl, or chacl is invoked by a privileged process over an attacker-controlled path, resulting in local privilege escalation.\nissue.scorev2: 0.0\nissue.scorev3: 6.3\nissue.scorev4: 7.2\nissue.modified: 2026-07-14T21:33:49.000\nissue.vector: LOCAL\nissue.vectorString: CVSS:4.0\/AV:L\/AC:H\/AT:N\/PR:L\/UI:N\/VC:H\/VI:H\/VA:N\/SC:N\/SI:N\/SA:N\/E:X\/CR:X\/IR:X\/AR:X\/MAV:X\/MAC:X\/MAT:X\/MPR:X\/MUI:X\/MVC:X\/MVI:X\/MVA:X\/MSC:X\/MSI:X\/MSA:X\/S:X\/AU:X\/R:X\/V:X\/RE:X\/U:X\nissue.detail: version-in-range\nissue.description: Needs backporting (fixed from 2.4.0)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ce mode me semble particuli\u00e8rement int\u00e9ressant dans le cadre du suivi de s\u00e9curit\u00e9 d\u2019un produit. Lorsqu\u2019une nouvelle vuln\u00e9rabilit\u00e9 est publi\u00e9e ou qu\u2019une CVE fait l\u2019objet d\u2019une alerte, on peut tr\u00e8s rapidement v\u00e9rifier si elle appara\u00eet dans le rapport de l\u2019image produite.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Les CVE du Kernel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le cas du noyau Linux m\u00e9rite un traitement particulier. Plus de <strong>20&nbsp;000 entr\u00e9es CVE<\/strong> apparaissent ici&nbsp;! Ceci ne signifie heureusement pas que notre noyau est affect\u00e9 par 20&nbsp;000 vuln\u00e9rabilit\u00e9s exploitables. La configuration du noyau, les fichiers r\u00e9ellement compil\u00e9s et les correctifs <em>backport\u00e9s<\/em> doivent \u00eatre pris en compte.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Comment r\u00e9duire cette liste \u00e0 quelque chose de r\u00e9ellement exploitable&nbsp;? Cela fera l&rsquo;objet d&rsquo;un prochain article&#8230;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Limitations<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Il est important de pr\u00e9ciser ce que fait et ce que ne fait pas <code><strong>cve-parse<\/strong><\/code>. L\u2019outil ne dispose pas de sa propre base de vuln\u00e9rabilit\u00e9s et ne remplace aucun des m\u00e9canismes fournis par Yocto. Il ne permet pas non plus de savoir de mani\u00e8re automatique si une vuln\u00e9rabilit\u00e9 est exploitable ou non sur un \u00e9quipement. Il se contente d&rsquo;un r\u00f4le plus simple&nbsp;: <strong>pr\u00e9senter de mani\u00e8re pratique<\/strong> les informations d\u00e9j\u00e0 produites par Yocto Project pour filtrer celles qui n\u00e9cessiteront des investigations plus pouss\u00e9es.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le d\u00e9p\u00f4t est disponible ici&nbsp;: <a href=\"https:\/\/github.com\/cpb-\/yocto-cve-parser\" target=\"_blank\" rel=\"noopener\"><strong>https:\/\/github.com\/cpb-\/yocto-cve-parser<\/strong><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">N\u2019h\u00e9sitez pas \u00e0 le tester sur vos propres rapports Yocto et \u00e0 me signaler les cas particuliers, formats ou options qui pourraient \u00eatre utiles.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Conclusion<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Produire une SBOM et un rapport de vuln\u00e9rabilit\u00e9s est une premi\u00e8re \u00e9tape indispensable pour ma\u00eetriser la s\u00e9curit\u00e9 d\u2019un syst\u00e8me Linux embarqu\u00e9. Mais collecter les informations ne suffit pas&nbsp;: il faut \u00e9galement \u00eatre capable de les exploiter rapidement lorsqu\u2019une nouvelle vuln\u00e9rabilit\u00e9 appara\u00eet. Avec <code><strong>cve-parse<\/strong><\/code>, on peut passer en quelques secondes d\u2019un aper\u00e7u g\u00e9n\u00e9ral des vuln\u00e9rabilit\u00e9s dans une image, \u00e0 la liste des CVE associ\u00e9es \u00e0 un composant, puis au d\u00e9tail d\u2019une vuln\u00e9rabilit\u00e9 pr\u00e9cise.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L\u2019outil \u00e9voluera probablement en fonction de mes besoins et des retours d\u2019utilisation. Son objectif restera n\u00e9anmoins le m\u00eame&nbsp;: <strong>rendre les rapports de s\u00e9curit\u00e9 produits par Yocto Project plus faciles \u00e0 lire et \u00e0 exploiter.<\/strong><\/p>","protected":false},"excerpt":{"rendered":"<p>Pour faciliter l&rsquo;analyse des rapports concernant les CVE produits lors d&rsquo;un build Yocto Project, j&rsquo;ai d&eacute;velopp&eacute; un petit outil nomm&eacute; cve-parse. Il permet d&rsquo;obtenir rapidement une vue d&rsquo;ensemble des composants d&rsquo;une image, de consulter les vuln&eacute;rabilit&eacute;s associ&eacute;es &agrave; un composant particulier ou de rechercher directement une CVE. Dans le pr&eacute;c&eacute;dent article, consacr&eacute; au Cyber Resilience [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-8037","post","type-post","status-publish","format-standard","hentry","category-linux-2"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/8037","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/comments?post=8037"}],"version-history":[{"count":32,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/8037\/revisions"}],"predecessor-version":[{"id":8098,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/8037\/revisions\/8098"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=8037"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=8037"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=8037"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}