9 月 20 日,VulnCheck 公开 CVE-2026-94106:PHP 生态中使用最广的音视频元数据解析库 getID3 在 1.9.26 之前的所有版本存在操作系统命令注入(CWE-78),CVSS 3.1 评分 8.8。攻击者只要构造一个文件名里嵌入 Shell 元字符的音频文件,当服务端用 getID3 写入 Ogg 或 FLAC 标签时,恶意命令就会以 Web 服务进程的权限执行。
事件概述
getID3 于 2001 年首次发布,Composer 累计下载超 1400 万次、月下载约 60.9 万次,WordPress 核心在 wp-includes/ID3/ 目录内置了它的副本。修复版本为 9 月 6 日发布的 1.9.26,提交 2c6f3f96 与 ce598c4f 为所有进入命令行的路径参数套上 escapeshellarg()。需注意,截至发稿 WordPress 最新稳定版 7.1.1 捆绑的仍是含缺陷的 1.9.25。
技术细节
以 write.vorbiscomment.php 为例,修复前第 105 行附近的 Linux 分支把命令拼成 vorbiscomment -w –raw -c "临时文件" "目标文件" 2>&1 后交给 shell_exec()。两个路径只用双引号包裹,而双引号在 Shell 内并不阻止变量展开与命令替换:攻击者可在文件名中放入一个双引号提前闭合,再接分号追加命令。官方概念验证是把 Ogg 文件命名为 test.ogg"; id > /tmp/rce_proof; echo ",执行 WriteVorbisComment() 时注入的 id 就会先跑完。
注入发生在 Shell 解析命令行字符串的阶段,与系统里是否真的存在 vorbiscomment 无关:即使二进制缺失,注入的命令依然执行。同类写法共四处:getid3.php 主文件 getHashdata() 的 Windows 分支,write.vorbiscomment.php 的 Windows 与 Linux 两个分支,write.metaflac.php 的 DeleteMetaFLAC(),以及 module.audio.shorten.php 对 shorten.exe 的调用。
影响评估
CVSS 3.1 向量为 AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H,逐项拆开即:网络可达、复杂度低、只需一个能上传并触发标签写入的账号(注册会员即可)、无需用户交互、机密性与完整性影响均为高。只做只读解析(Analyze() 主链路为纯 PHP 实现,不走 shell)的站点攻击面明显更小;调用写入标签能力的应用风险最高,音乐社区、播客平台、网盘类产品正属此类。
修复建议
- 升级到 1.9.26 及以上:composer require james-heinrich/getid3:^1.9.26。
- 无法走 Composer 的存量系统,从官方仓库下载 v1.9.26 覆盖本地副本,重点是 getid3.php 与三个 write 模块文件。
- WordPress 站长需单独排查主题与插件是否自行引入完整版 getID3——核心内置副本只捆绑解析模块,不捆绑 write.vorbiscomment.php。
- 升级前的过渡措施:把上传文件名强制规范化为时间戳加随机串,或按白名单字符集过滤。
- 自查命令:grep -rn "WriteVorbisComment\|WriteMetaFLAC" 项目目录,命中即为高风险调用点。