在 Arduino_Core_STM32 的 1.7.0 之前的旧版本中存在一个基于栈的 use-after-return 漏洞。
该问题位于 pwm_start() 实现中,其中 TIM_HandleTypeDef 对象在栈上分配,其地址被传入 HAL 初始化逻辑。该指针随后可能被保留在全局定时器句柄注册表中,并在原始栈帧返回后由中断服务例程异步解引用。
该漏洞已被 MITRE 分配编号 CVE-2026-26399。
Arduino_Core_STM32stm32duino / STMicroelectronics 生态系统v0.1.0 至 v1.6.1v1.7.0在 pwm_start() 的旧实现中,TIM_HandleTypeDef 结构体作为局部栈变量创建:
void pwm_start(...) {
TIM_HandleTypeDef timHandle = {};
HAL_TIM_PWM_Init(&timHandle);
...
}
该局部对象的地址被传入 HAL 支持逻辑,并可能被存储在全局定时器管理状态中,例如全局定时器句柄注册表。
在 pwm_start() 返回后,该栈对象不再有效。然而,后续的异步定时器中断处理程序仍可能解引用该过期指针,从而导致内存损坏和未定义行为。
可能的安全影响包括:
由于这是一个库级问题,实际可利用性取决于易受攻击的库如何集成到固件中,以及攻击者控制的输入如何影响栈重用和中断时序。
cores/arduino/stm32/analog.cpwm_start()TIM_HandleTypeDeftimer_handles)该问题似乎在版本 1.7.0 中通过重构间接解决,重构用不同的定时器管理设计取代了之前基于栈的处理路径。对于该旧漏洞,似乎没有发布专门的安全公告。
该问题是在固件安全研究过程中发现的,涉及对基于 Arduino_Core_STM32 构建的旧版 STM32 固件进行模糊测试和根因分析。
已联系厂商 PSIRT。回复表明当前版本不受影响,因为该问题已在版本 1.7.0 中修复,但厂商当时似乎未请求分配专门的 CVE 编号。
由 Jin Chang 发现。
CVE-2026-26399