ArduPilot ArduPlane 中通过 MAVLink PARAM_SET 进行的未认证 NaN 注入
| CVE | CVE-2026-36522 |
| CWE | CWE-1287(对指定输入类型的验证不当) |
| CVSS 3.1 | 9.1 严重 — AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:H |
| 受影响 | ArduPilot ArduPlane 4.0.1(已确认) |
| 组件 | GCS_MAVLINK::handle_param_set() — libraries/GCS_MAVLink/GCS_Param.cpp |
| 攻击途径 | 远程、未认证的 MAVLink |
| 影响 | 拒绝服务(SITL)/ 静默的飞行参数破坏(硬件) |
| 报告者 | Sebastien Arseneault, Deep Woods Security |
handle_param_set() 接受来自未认证 MAVLink PARAM_SET 消息中的 IEEE 754 浮点值,但未对其验证是否为 NaN 或无穷大。该畸形值会在没有类型或数值检查的情况下到达一个浮点比较(AP_Math.cpp 中的 is_equal<float,float>())。
这不是一个代码执行漏洞。其影响是拒绝服务和完整性破坏。
验证缺口位于通用参数处理器中,因此所有浮点类型参数都会受到影响。
一个针对 ARSPD_FBW_MIN 的、携带静默 NaN(0x7FC00000)的单个未认证 PARAM_SET 消息:
python3 poc/CVE-2026-36522.py [host:port] # default tcp:127.0.0.1:5760
捕获的 SITL 堆栈跟踪(stacktrace.txt)显示了外部输入到达未受防护的比较操作的过程:
#6 is_equal<float, float> (v_1=nan(0x400000), v_2=0) at AP_Math.cpp:35
#7 GCS_MAVLINK::handle_param_set ... at GCS_Param.cpp:299
packet = {param_value = nan(0x400000), param_id = "ARSPD_FBW_MIN", param_type = 9}
调用链(update_receive -> packetReceived -> handle_common_message -> handle_param_set)证实了该路径可以从未认证的网络输入到达。
在使用之前验证传入的值:
if (isnan(packet.param_value) || isinf(packet.param_value)) {
// reject: value out of range
return;
}
| 日期 | 事件 |
|---|---|
| 2026-02-26 | 已向 MITRE 提交 CVE 请求 |
| 2026-02-26 | 已通知供应商(ArduPilot) |
| 2026-06-15 | CVE-2026-36522 已分配;PoC 和堆栈跟踪已发布 |
Sebastien Arseneault — Deep Woods Security