漏洞概述 OpenBSD 的 函数在解析传入的 MPLS 标签栈时,如果栈中没有 Bottom-of-Stack (BoS) 标签,会将 16 个条目的固定数组 中的条目复制到 ICMP/MPLS 错误响应中。这会导致泄露 4 字节的相邻内核栈内存。 影响范围 受影响产品: OpenBSD 受影响版本: OpenBSD-current 在 2020-06-18 之前 修复日期: 2020-06-18 修复方案 修复提交: 2020-06-18,修复代码已提交至 详细信息 执行摘要 函数在 中解析传入的 MPLS 标签栈。当解析循环完成且未遇到 BoS 标签时, 达到 (16)。随后,代码路径计算复制长度 — 17 个条目,并使用 、 和 对 16 条目的 对象进行操作。这读取了一个 (4 字节)超出数组末尾的数据,并将该数据反射回发送者,包含在生成的 ICMP/MPLS 错误中。 细节 标签栈解析循环(第 ~353 行)填充 ,并在设置 BoS 位时中断: 如果没有 BoS 标签,循环将运行完成, 。之后,IP 版本分支使用派生的长度 将栈作为 ICMP 扩展对象附加: 相同的 长度用于预置和 栈到反射数据包: 当 时,每次读取 17 个条目,从 16 条目的数组中读取 — 一个 (4 字节)的相邻内核栈,并将其包含在发送给攻击者的响应中。 可达性 该路径可通过 (第 ~90 行)→ 远程访问,适用于在接口上启用 MPLS 的系统。触发器是一个携带 16 个标签且无 BoS 位设置、最外层 TTL 为 1 的 crafted MPLS 帧,以便采取错误路径。参见 proof of concept。 影响 每个 crafted 数据包泄露 4 字节的相邻内核栈内存。泄露的数据反射在 ICMP/MPLS 扩展对象中,因此任何可达的攻击者都可以收集泄露的字节。该原语是可重复的:发送连续的触发器泄露不同的相邻栈字节,从而实现渐进式的内核内存泄露。无崩溃或 panic 结果;泄露是静默的。 时间线 2020-06-12: 向 OpenBSD 报告,附带 proof of concept 2020-06-18: 修复代码提交至 标签