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, 中断服务例程, 代码执行, 全局句柄注册表, 内存安全, 固件安全, 定时器, 嵌入式, 异步中断, 指针漏洞, 栈帧返回后重用, 栈溢出, 漏洞披露