CVE-2026-48696: sprintf Into a 256-Byte Stack Buffer in FastNetMon's ExaBGP Action Handler 漏洞概述 FastNetMon 是一个 BGP 路由器注入器,通过简单的命令行协议与 ExaBGP 通信。函数 在 中,将 ExaBGP 的 announce/withdraw 命令格式化为一个固定 256 字节的栈缓冲区,使用 ,然后将结果写入 ExaBGP 的输入管道。 格式字符串为 ,其中包含约 40 字节的固定文本,剩余约 216 字节用于三个可变长度字符串替换(prefix、next-hop、community list)。前缀和 next-hop 有长度限制(IPv4 前缀最多 18 字符,IPv6 前缀最多 39 字符),但 community list 无限制。 配置值从 读取,无长度验证。 社区列表有 30 个条目(每个约 11 字符,格式如 )时,数据总量约 330 字节。 将完整 330 字节写入 256 字节缓冲区,溢出 74 字节。40 个社区时,溢出接近 200 字节,足以覆盖 x86_64 上的返回地址。 影响范围 CVE: CVE-2026-48696 CVSS: 6.0 (Medium) CWE: CWE-120 (Buffer Copy without Checking Size), CWE-676 (Use of Potentially Dangerous Function) 受影响版本: FastNetMon Community Edition <= 1.2.9 组件: , 函数 , 行 21-31 攻击向量: 本地(配置文件) 发现者: Lorikeet Security 漏洞代码 可达性 漏洞可通过攻击响应触发,因为溢出触发值是 配置字段,从 读取。攻击者可以修改配置文件或诱导操作员提供长社区列表。与 CVE-2026-48690 不同,此漏洞在 FastNetMon 实际调用 ExaBGP 时触发(DDoS 缓解期间)。 攻击场景: 恶意或受损的配置管理:Ansible playbook 模板从数据库查询社区列表,查询返回超过预期的条目。 教程转录错误:博客文章描述设置细粒度社区黑名单,包含 20+ 社区,操作员复制粘贴后漏洞激活。 希望有更多社区的操作员:合法需要附加多个社区,配置长列表。 利用原语 与 CVE-2026-48690 类似,栈溢出,无 ,无 ,攻击者控制的字节覆盖保存的返回地址。溢出字节来自社区字符串,是操作员提供的配置值,非完全攻击者选择,除非攻击者也是操作员。但攻击者可写入配置文件(本地 shell 访问),选择社区字符串和溢出字节。 利用链: 1. 写入恶意社区字符串到 2. 等待攻击或生成攻击 3. FastNetMon 调用 ,恶意社区导致栈溢出 4. 保存的返回地址指向攻击者选择的地址 5. 函数返回时执行代码 修复方案 推荐修复 使用 格式化,C++11 后字符串类处理任意长度,零内存开销。 备选修复(使用固定缓冲区) 使用 并检查返回值检测截断。 补偿控制 审计 配置值:计数配置的社区,超过 15 个(每个约 11 字符)接近溢出阈值。 锁定 权限:仅 FastNetMon 守护进程用户和 root 应有访问权限。 使用编译器加固:启用 , 调用在目标大小静态已知时会被 FORTIFY 保护。 启用 :编译器将标记 调用为安全问题。 不使用 ExaBGP 时禁用 action:FastNetMon 支持多个 BGP 路由器后端,如使用 GoBGP,ExaBGP 代码路径为死代码。 披露时间线