首页 网络安全 正文
  • 本文约2093字,阅读需10分钟
  • 7
  • 0

Zephyr缓冲区溢出漏洞CVE-2026-1678

摘要

栋科技漏洞库关注到 Zephyr 系统中存在的缓冲区溢出漏洞,该漏洞现在已经被追踪为CVE-2026-1678,漏洞的CVBSS 3.X评分为9.8。

Zephyr 是一款开源、可扩展、低功耗实时操作系统(Real-Time Operating System),是一款专为资源受限的嵌入式设备设计的系统。

一、基本情况

Zephyr 操作系统适用于物联网(IoT)、可穿戴设备、工业控制、智能家居等场景,它是在嵌入式领域中极具影响力的轻量级 RTOS。

OneUptime命令注入漏洞CVE-2026-27728

Zephyr 内核仅占用 KB 级 Flash 和 几百字节 RAM,适配 8-bit、16-bit、32-bit 微控制器(如 ARM Cortex-M、RISC-V、x86 等架构)。

栋科技漏洞库关注到 Zephyr 系统中存在的缓冲区溢出漏洞,该漏洞现在已经被追踪为CVE-2026-1678,漏洞的CVBSS 3.X评分为9.8。

二、漏洞分析

CVE-2026-1678漏洞是 Zephyr系统中位于 dns_unpack_name 函数中的缓冲区溢出漏洞,该漏洞可能导致远程代码执行(RCE)风险。

简言之,在处理DNS响应时,dns_unpack_name() 函数会缓存一次缓冲区的剩余空间(tailroom)并在追加 DNS 标签时重复使用该值。

也就是说,位于subsys/net/lib/dns/dns_pack.c 中的 dns_unpack_name() 函数会一次性获取 dest_size = net_buf_tailroom(buf) 的值,

并在添加标签时重复使用该值,随着 buf->len 缓冲区内容的增长,旧边界不再与剩余空间匹配,缓存的剩余空间大小变得不再准确。

这就导致函数在新的尾空间检查的情况写入最终的空终止符(null terminator)时,可能会越界写入到缓冲区边界之外。

在禁用断言(默认配置)且启用 CONFIG_DNS_RESOLVER 的情况下,攻击者可通过构造恶意的 DNS 响应触发堆栈或堆缓冲区溢出。

1、技术细节

断言默认关闭(代码路径:include/zephyr/sys/__assert.h:26-149);

CONFIG_ASSERT 配置项默认值为 n(代码路径:subsys/debug/Kconfig:172-205)。

net_buf 新增的辅助函数仅依赖断言做校验(代码路径:lib/net_buf/buf_simple.c:56-74),

因此,当断言关闭时,这些函数会执行无校验写入操作。

DNS 名称缓冲区默认大小为 255 字节(由 CONFIG_DNS_RESOLVER_MAX_QUERY_LEN 配置,

代码路径:subsys/net/lib/dns/resolve.c:72-82、subsys/net/lib/dns/Kconfig:72-88),

但 DNS 消息长度上限可达 512 字节(DNS_RESOLVER_MAX_ANSWER_SIZE 默认值)。

2、易受攻击的代码

subsystem/net/lib/dns/dns_pack.c 的第 486-554 行

int dns_unpack_name(const uint8_t *msg, int maxlen, const uint8_t *src,
          struct net_buf *buf, const uint8_t **eol)
{
   int dest_size = net_buf_tailroom(buf);
   ...
   label_len = val;
   ...
   if (((buf->data + label_len + 1) >= (buf->data + dest_size)) ||
       ((curr_src + label_len) >= (msg + maxlen))) {
      return -EMSGSIZE;
   }
   ...
   if (buf->len > 0) {
      net_buf_add_u8(buf, '.');       // advances buf->len
   }
   net_buf_add_mem(buf, curr_src, label_len); // advances buf->len
   ...
   buf->data[buf->len] = '\0';           // unchecked write
}

3、潜在影响

攻击者可控数据的越界写入 → 高完整性 / 可用性风险;根据内存布局不同,存在远程代码执行(RCE)的可能性。

当 DNS 功能启用时,该漏洞可通过网络访问,且无需身份验证。

启用断言仅会将溢出问题转化为程序崩溃(拒绝服务 DoS),并非彻底修复方案;

代码需在每次写入(包括终止符)前执行实时的剩余空间检查。

三、POC概念验证

编译任意启用 DNS 解析器且默认 CONFIG_ASSERT=n 的 Zephyr 应用程序;

发送构造的 DNS 响应包,包含重复的 63 字节标签(例如 5 个标签),

使文本形式的域名长度超过 255 字节缓冲区上限,但仍在允许的消息总长度范围内;

解析响应包时,dest_size 变量值保持不变;net_buf_add_* 系列函数会将 buf->len 推进至缓冲区边界之外,

最终的写入操作会导致约 100–200 字节的缓冲区溢出(具体长度取决于标签数量)。

四、影响范围

未知

五、修复建议

未知

六、参考链接

[lv][https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-536f-h63g-hj42/lv]



扫描二维码,在手机上阅读
评论
更换验证码
友情链接