漏洞概述 漏洞名称: Arbitrary file write in createPlaylist: any authenticated user can write playlist M3U content to attacker-controlled path on the host 漏洞描述: 在 中存在一个逻辑错误,允许任何已认证的 Subsonic 用户(包括非管理员)将 M3U 播放列表内容写入到 gonic 主机上的攻击者控制的绝对文件系统路径,并创建中间目录,权限为 0o777。 该漏洞与播放列表所有权修复无关,是一个不可达的守卫子句与 中无路径限制的组合。 影响范围 完整性: 任何已认证用户可以覆盖(截断和重写)任何 gonic 进程有权访问的文件,包括 gonic 的 SQLite 数据库、配置文件、日志文件、缓存、审计日志和其他用户的 M3U 文件。写入的 M3U 结构为 / / 属性,加上路径,但名称值是攻击者控制的,并且结构上放置(没有换行注入, 字符转义特殊)。 可用性: 覆盖 gonic.db(或 SQLite 文件所在的其他位置)会破坏所有用户状态——账户、评分、播放列表等。写入不可恢复。 文件系统状态: 创建中间目录为 world-writable,无论 umask 如何,这本身就是一个加固问题,与遍历一起。 信任边界: gonic 显式支持非管理员用户角色( , 标志)。此漏洞使每个非管理员用户都能向主机工作集执行破坏性文件系统写入原语。 内容控制是结构性的: 无法注入换行符到 M3U 工作集,因此直接 shell/命令注入需要一个目标文件格式来容忍 头。纯破坏性原语(如 、 、 )可以普遍使用。 修复方案 1. 修复不可达守卫: 在 中修复不可达守卫。 这恢复了所有权检查,当路径解析到现有播放列表时。它不修复当 指向不存在文件的情况(读取失败,播放列表保持为零值,所有权检查将被跳过)。因此,第二个修复也是必要的。 2. 添加路径限制: 在 中添加路径限制(相同的辅助函数在比较建议中提出)。 将相同的守卫应用于 和 以关闭相关原语。考虑收紧 从 到 。 POC 代码 输出结果 文件在 中创建,而播放列表存储的 是 —— 写入成功超出了预期的目录。