如何查询 ESP-IDF 中使用的第三方组件的版本?

引言

随着开源的日益普及,开源包的漏洞数量也在增加。这会给公司带来多种风险和挑战,比如:

  • 库版本更新导致的兼容性问题
  • 库许可证违反引发潜在法律纠纷
  • 库漏洞被利用导致被攻击(含供应链攻击)

越来越多的用户希望使用 SCA (software composition analysis) 工具,比如
BlackDuck 通过分析源码提取项目依赖的第三方组件及其版本、许可证等信息,生成软件物料清单(SBOM,Software Bill-of-Materials),根据 SBOM 分析项目是否使用了存在已知漏洞的组件,后期其它组件爆出漏洞时也可根据 SBOM 快速排查受影响项目。

ESP-IDF 下使用到多个第三方组件,对于不同的组件,查找版本的策略有所不同,SCA 工具可能无法获取到所有组件的版本,本篇文档介绍如何获取 IDF 使用的第三方组件的版本。

不同 ESP-IDF 版本依赖的组件有所不同,本文以 ESP-IDF v5.1.1 为例进行介绍。

获取第三方组件版本

Firmware Components 列举了 ESP-IDF v5.1.1 使用的所有第三方组件以及对应的版权和许可证信息,后面表格中列出的组件均来源于此。

总结下来,大致有如下几种方法获取版本:

  • 切到本地下载的相应版本的 ESP-IDF 目录下,执行 git submodule
  • 从组件的头文件获取;
  • 部分组件是从第三方代码中衍生出来的,目前作为 ESP-IDF 的一部分进行开发和维护,可使用 ESP-IDF 版本;
  • 部分组件版本无法直接获取,需向乐鑫确认。

ESP-IDF v5.1.1 下执行 git submodule 的返回结果如下,可以看到一些第三方组件的版本信息。

 $ git submodule      
 d037ec89546fad14b5c4d5456c2e23a71e554966 components/bootloader/subproject/components/micro-ecc/micro-ecc (v1.0)
 e1b3a29c58a452a6c017113686262094afd87042 components/bt/controller/lib_esp32 (e1b3a29)
 5fcfd0e457a76ebb234086ccd6dc391690d69e90 components/bt/controller/lib_esp32c2/esp32c2-bt-lib (5fcfd0e)
 b438f60a295183e7c67eb42ae05f4580f4b1ced0 components/bt/controller/lib_esp32c3_family (b438f60)
 d785de0a7c46d9badcd73bc83c2e5cb78f7054b2 components/bt/controller/lib_esp32c6/esp32c6-bt-lib (d785de0)
 35bd3cd7352014d303a96c46d8ea8446ea0a9a54 components/bt/controller/lib_esp32h2/esp32h2-bt-lib (35bd3cd)
 9478bc510fa9fc792d98efbc80dc547b97a13b99 components/bt/host/nimble/nimble (remotes/origin/master-1499-g9478bc51)
 eeecc49ce8af123cf8ad40efdb9673e37b56230f components/cmock/CMock (v2.5.2-2-geeecc49)
 37698e17a4c7fd2e0872317fc8befaac3bb10cb4 components/esp_coex/lib (heads/main)
 998e05636344949ba219e8ac56feb733e27bf5d2 components/esp_phy/lib (998e056)
 0a89d5ffd2c452407940c2e617434e54f3c34576 components/esp_wifi/lib (remotes/origin/feature/ftm_support_stage2-184-g0a89d5ff)
 8c9cd0517adf99e363812e9a295dfe3898fdd345 components/heap/tlsf (heads/idf)
 102b03c8095de8a337c293f79dce189be63186f3 components/ieee802154/lib (heads/master)
 d348621ca93571343a56862df7de4ff3bc9b5667 components/json/cJSON (v1.7.15)
 269a58f18597aedec31c439e34cdaea47229dda3 components/lwip/lwip (remotes/origin/master-264-g269a58f1)
 65b3c0857c9f207dcb0b646f2b4ebd8e5edf83c1 components/mbedtls/mbedtls (mbedtls-3.4.0-7-g65b3c0857)
 dffabb067fb3c39f486033d2e47eb4b1416f0c82 components/mqtt/esp-mqtt (ESP-MQTT_FOR_IDF_4.x-149-gdffabb0)
 c9c17a0b6634af016111c9817f0be1fe0e7112f6 components/openthread/lib (heads/master)
 5beae143700db54c6e9bd4b15a568abe2f305723 components/openthread/openthread (thread-reference-20230706-12-g5beae1437)
 abc67a11c6db271bedbb9f58be85d6f4e2ea8389 components/protobuf-c/protobuf-c (v1.4.1)
 0dbb3f71c5f6fae3747a9d935372773762baf852 components/spiffs/spiffs (0.2-255-g0dbb3f7)
 7d2bf62b7e6afaf38153041a9d53c21aeeca9a25 components/unity/unity (v2.4.3-51-g7d2bf62)

下表列出了获取不同组件的版本的方法,对于其他的 ESP-IDF 版本,方法是类似的,切到对应的 commit 或者 tag 版本即可。

第三方组件 版本 如何获取版本(如没有,请说明原因)
Newlib 4.1.0 1. 从 _newlib_version.h 获取版本,该文件位于工具链中。
例如,可在 IDF 环境中运行下面指令:
xtensa-esp32-elf-gcc -dM -E -x c - <<< "#include <_newlib_version.h>" | grep NEWLIB_VERSION
对于 ESP-IDF v5.1.1,将打印如下内容:
#define _NEWLIB_VERSION "4.1.0"
2. 在工具链版本中查找
a. 查找 IDF 使用的工具链版本
例如,对于 ESP-IDF v5.1.1,可找到 xtensa-esp32-elf 工具链版本为 esp-12.2.0_20230208
b. 在工具链版本的 release note 页面获取 newlib 版本
这里列出了自 esp-2022r1 以来的更改,newlib 版本与 esp-2022r1 相同,为 4.1.0
Xtensa header files 12.0.9 从头文件 esp-idf/components/xtensa/include/xtensa/hal.h 中获取版本
FreeRTOS V10.4.3 1. 参见 ESP-IDF 编程指南的 FreeRTOS 官方文档
2. 从头文件 esp-idf/components/freertos/FreeRTOS-Kernel/include/freertos/FreeRTOS.h 中获取版本
LWIP master-264-g269a58f1 1. git submodule
2. esp-idf/components/lwip
(可将 v5.1.1 改为任意所需要的版本或者 commit,请注意 lwip @ 269a58f 是可点击的,将跳转到当前 ESP-IDF 所使用的 lwip 的一个具体的版本,对于 v5.1.1 而言,所使用的 LWIP 的 commit id 为 269a58f18597aedec31c439e34cdaea47229dda3)
wpa_supplicant v2.10 对于该组件,乐鑫没有维护与上游代码相对应的版本。这是因为乐鑫对 wpa_supplicant 进行了大量修改,以适应 ESP 目标,并且仅支持物联网特定功能。但会定期升级与安全相关的补丁。从安全角度讲,所有 v5.X ESP-IDF 版本都是 2.10 版。
FreeBSD net80211 NA 乐鑫没有维护 net80211 的版本。有一个经过大量修改的 net80211 版本,它是从较早的 FreeBSD 代码分叉而来,针对 ESP 目标进行了修改,并升级了物联网特定功能。由于上游 net80211 没有得到积极维护,因此乐鑫不对其进行跟踪,而是独立维护自己的堆栈。
argtable3 v3.2.2 在提交信息中提及。例如,请查看 ESP-IDF v5.1.1 的历史记录
linenoise v5.1.1 由乐鑫维护,可使用 IDF 版本。
FatFS R0.15 从头文件 esp-idf/components/fatfs/src/ff.h 获取版本
cJSON v1.7.15 1. git submodule
2. esp-idf/components/json
micro-ecc v1.0 1. git submodule
Mbed TLS mbedtls-3.4.0-7-g65b3c0857 1. git submodule
2. esp-idf/components/mbedtls
SPIFFS 0.2-255-g0dbb3f7 1. git submodule
2. esp-idf/components/spiffs
SD/MMC driver v5.1.1 由乐鑫维护,可使用 IDF 版本。
(SD/MMC 是从第三方代码中衍生出来的,目前作为 IDF 的一部分进行开发和维护,因此可使用 ESP-IDF 版本,这也适用于其他的组件,比如 UBSAN runtime)
ESP-MQTT ESP-MQTT_FOR_IDF_4.x-149-gdffabb0 1. git submodule
2. esp-idf/components/mqtt
BLE Mesh v5.1.1 由乐鑫维护,可使用 IDF 版本。
mynewt-nimble nimble-1.5.0 ESP-IDF Master/v5.2/v5.1 - nimble-1.5.0
ESP-IDF 5.0 - nimble-1.4.0
ESP-IDF 4.4/ 4.3 - nimble-1.3.0

对于其他的 IDF 版本,需向乐鑫确认
TLSF allocator 8c9cd0517adf99e363812e9a295dfe3898fdd345 1. 对于 IDF v5.x:
a. git submodule
b. esp-idf/components/heap

2. v5.0 之前的版本:
deff9ab509341f264addbd3c8ada533678591905
openthread thread-reference-20230706-12-g5beae1437 1. git submodule
2. esp-idf/components/openthread
UBSAN runtime v5.1.1 由乐鑫维护,可使用 IDF 版本。
HTTP Parser 2.7.0 从 esp-idf/components/http_parser/http_parser.h 头文件中获取版本
SEGGER SystemView 3.42 从 esp-idf/components/app_trace/sys_view/SEGGER/SEGGER.h 头文件获取版本
protobuf-c 1.4.1 1. git submodule
2. esp-idf/components/protobuf-c
CMock v2.5.2-2-geeecc49 1. git submodule
2. esp-idf/components/cmock
unity v2.4.3-51-g7d2bf62 1. git submodule
2. esp-idf/components/unity

补充说明

  1. 前面有提到,不同 ESP-IDF 版本依赖的组件有所不同,比如用于 XML 解析的 expat 组件,在 ESP-IDF v5.0 之前,该组件是一个内置的组件,可通过 git submodule 查询版本,而在 ESP-IDF v5.0 之后,该组件位于 IDF 组件管理器,用户可根据需要下载相应的版本。

  2. 乐鑫有开发自己的漏洞扫描工具 ESP-IDF-SDOM,ESP-IDF-SDOM 是一个 SBOM 生成工具。 它为基于 ESP-IDF 的应用程序生成 SPDX 格式 SBOM。 该工具还允许根据国家漏洞数据库 (NVD) 检查生成的 SBOM 是否存在已知安全漏洞。
    如果有兴趣了解 ESP-IDF-SDOM,可以看下 Software Bill of Materials。

你可能感兴趣的:(芯片基础,(Chip,Foundation),开源软件)