漏洞概述 漏洞名称: rsync: Use-After-Free via xattr Out-of-Bounds in receive_xattr() 漏洞描述: 在rsync的 函数中,使用了一个由用户提供的计数值作为数组参数传递给 ,而不是实际存储的xattr数量。当xattr名称过滤导致一些条目被丢弃时,传递给 的计数值会超过有效条目的数量。这些多余的数组位置包含来自之前处理文件的陈旧数据。 将这些陈旧条目重新排序到存储位置,并持久化到全局 中,带有指向堆分配的指针,这些指针随后被释放并重新分配。这导致了 中的检查条件中的use-after-free,以及在 中用于名称复制和再次释放的双重释放或释放已分配内存的场景。 影响范围 受影响版本: rsync 3.0.1 至 3.4.1(所有带有xattr缩写功能的版本) 当前开发版本: 3.4.2-dev(commit b085b023)也受到影响 文件: ,函数 ,第864行 严重程度: 中等/高 攻击向量: 网络(恶意rsync发送者) 修复方案 建议修复: 在 的第864行,将 替换为 : 这样可以确保 只操作实际填充的条目,防止陈旧数据被排序到存储的xattr列表中。 触发条件 受害者必须使用 启用xattr传输。 在Linux上,受害者还必须使用 或配置有非用户命名空间xattr的xattr过滤器。在FreeBSD/macOS上,不需要额外的标志。 发送者必须在触发文件的xattr列表中包含至少一个非用户命名空间xattr。 发送者必须将线计数设置为高于正在过滤的xattr数量,并安排一个先前的文件在传输中填充具有可利用xattr结构的陈旧数组位置。 利用条件 发送者完全控制条件(c)和(d),通过rsync协议。条件(a)和(b)取决于受害者的rsync调用。 时间线 2008-03-07: 错误引入于commit d7246186(rsync 3.0.1pre1)。 2025-04-16: 此报告。 参考 来源: https://github.com/RsyncProject/rsync 错误提交: d7246186(“修复了 与 的交互。修复了非用户命名空间xattr的munge。修复了名称munge时的排序。”)