Zephyr缓冲区溢出漏洞CVE-2026-1678
Zephyr 是一款开源、可扩展、低功耗实时操作系统(Real-Time Operating System),是一款专为资源受限的嵌入式设备设计的系统。
一、基本情况
Zephyr 操作系统适用于物联网(IoT)、可穿戴设备、工业控制、智能家居等场景,它是在嵌入式领域中极具影响力的轻量级 RTOS。

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]