Acen28/CVE-2026-26399-Disclosure

GitHub: Acen28/CVE-2026-26399-Disclosure

该项目揭示了 Arduino_Core_STM32 旧版本中基于栈的悬空指针漏洞并提供修复版本与技术细节。

Stars: 1 | Forks: 0

# CVE-2026-26399:Arduino_Core_STM32(旧版本)中的基于栈的“使用已返回的栈空间”漏洞 ## 摘要 在 `Arduino_Core_STM32` 旧版本(低于 `1.7.0`)中存在一个基于栈的“使用已返回的栈空间”漏洞。 该问题出现在 `pwm_start()` 实现中,其中 `TIM_HandleTypeDef` 对象在栈上分配,并将其地址传递给 HAL 初始化逻辑。该指针可能被保留在全局定时器句柄注册表中,并在原始栈帧返回后被中断服务例程异步解引用。 此漏洞已被 MITRE 分配为 **CVE-2026-26399**。 ## 影响产品 - 产品:`Arduino_Core_STM32` - 厂商/项目:`stm32duino` / STMicroelectronics 生态系统 - 受影响版本:`v0.1.0` 至 `v1.6.1` - 修复版本:`v1.7.0` ## 漏洞类型 - CWE-562:使用已返回的栈空间(Use After Return) - 基于栈的悬空指针 / 使用已返回的栈空间 ## 技术细节 在 `pwm_start()` 的旧版本实现中,会创建一个 `TIM_HandleTypeDef` 结构作为局部栈变量: ``` void pwm_start(...) { TIM_HandleTypeDef timHandle = {}; HAL_TIM_PWM_Init(&timHandle); ... } ``` 该局部对象的地址被传递给 HAL 支持逻辑,并可能被存储在全局定时器管理状态中,例如全局定时器句柄注册表。 `pwm_start()` 返回后,栈对象不再有效。然而,后续的异步定时器中断处理程序仍可能解引用该陈旧指针,导致内存损坏和未定义行为。 ## 影响 可能的安全影响包括: - 拒绝服务(例如崩溃或 HardFault) - 在有利的内存布局和控制条件下可能实现代码执行 由于这是一个库级别的问题,实际可利用性取决于漏洞库如何被集成到固件中,以及攻击者可控输入如何影响栈重用和中断时序。 ## 受影响组件 - `cores/arduino/stm32/analog.c` - `pwm_start()` - `TIM_HandleTypeDef` - 全局定时器句柄跟踪逻辑(例如 `timer_handles`) ## 修复 该问题似乎在版本 `1.7.0` 中被间接修复,当时重构将之前的基于栈的处理路径替换为不同的定时器管理设计。尚未为此旧漏洞发布专门的安全公告。 ## 发现过程 此问题是在对基于 `Arduino_Core_STM32` 的固件进行模糊测试和根因分析的安全研究中发现的。 ## 厂商联系 已联系供应商 PSIRT。其回复表示当前版本不受影响,因为问题已在 `1.7.0` 版本中修复,但当时厂商未申请专门的 CVE。 ## 致谢 由 **Jin Chang** 发现。 ## 参考链接 - 项目仓库:https://github.com/stm32duino/Arduino_Core_STM32 - CVE ID:`CVE-2026-26399`
标签:Arduino_Core_STM32, CVE-2026-26399, CWE-562, Denial of Service, DoS, HAL库, HardFault, IoT, PWM, STM32, stm32duino, UML, Use-After-Return, 中断服务例程, 代码执行, 全局句柄注册表, 内存安全, 固件安全, 定时器, 嵌入式, 异步中断, 指针漏洞, 栈帧返回后重用, 栈溢出, 漏洞披露