随着开源的日益普及,开源包的漏洞数量也在增加。这会给公司带来多种风险和挑战,比如:
越来越多的用户希望使用 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 使用的所有第三方组件以及对应的版权和许可证信息,后面表格中列出的组件均来源于此。
总结下来,大致有如下几种方法获取版本:
git submodule
;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 |
前面有提到,不同 ESP-IDF 版本依赖的组件有所不同,比如用于 XML 解析的 expat 组件,在 ESP-IDF v5.0 之前,该组件是一个内置的组件,可通过 git submodule
查询版本,而在 ESP-IDF v5.0 之后,该组件位于 IDF 组件管理器,用户可根据需要下载相应的版本。
乐鑫有开发自己的漏洞扫描工具 ESP-IDF-SDOM,ESP-IDF-SDOM 是一个 SBOM 生成工具。 它为基于 ESP-IDF 的应用程序生成 SPDX 格式 SBOM。 该工具还允许根据国家漏洞数据库 (NVD) 检查生成的 SBOM 是否存在已知安全漏洞。
如果有兴趣了解 ESP-IDF-SDOM,可以看下 Software Bill of Materials。