MotionEye vulnerable to RCE via unsanitized motion config parameter
漏洞详情
包管理器: pip
受影响版本: < 0.43.1b5
修复版本: 0.43.1b5
描述
摘要
MotionEye中存在命令注入漏洞,允许攻击者通过Web界面配置字段提供恶意值来实现远程代码执行(RCE)。由于MotionEye将用户提供的值直接写入Motion配置文件而未进行清理,攻击者可以注入在Motion进程重启时执行的shell语法。此问题可能导致MotionEye容器完全被接管,并可能影响主机环境(取决于容器权限)。
详情
根本原因:
MotionEye接受来自Web界面中image_file_name和movie_filename等字段的任意字符串,这些值被直接写入/etc/motioneye/camera-*.conf。当MotionEye重启Motion服务(motionctl.start)时,Motion二进制文件读取此配置。由于Motion将这些字段视为可进行shell扩展,注入的字符(如$()、反引号)被解释为shell命令。
漏洞流程:
|
|
受影响代码:
问题出现在config.py在处理用户输入并将其写入配置文件之前。文件名字段未应用任何清理或白名单验证。
概念验证(PoC)
以下步骤重现了MotionEye中的远程代码执行(RCE)漏洞。 使用官方Docker镜像进行测试。
环境设置
启动MotionEye容器 启动易受攻击的容器:
|
|
验证版本 在日志中确认运行版本:
|
|
结果:
|
|
容器shell访问(用于后续验证) 保留一个shell以便验证结果:
|
|
利用步骤
访问Web界面
- 在浏览器中打开:http://127.0.0.1:9999
- 使用默认凭据登录:admin / (空密码)
- 添加示例RTSP网络摄像头(需要启用摄像头特定设置)
尝试恶意文件名输入
- 转到:摄像头设置 → 静态图像
- 在图像文件名字段中,尝试:
|
|
观察:这被浏览器中的客户端验证阻止。
客户端验证发现
检查在JavaScript中实现:
/static/js/main.js?v=0.43.1b4 → 引用 /static/js/ui.js?v=0.43.1b4
示例验证函数:
|
|
绕过验证
- 打开浏览器控制台(F12 → 控制台选项卡)
- 覆盖函数始终返回true:
|
|
这绕过了客户端验证并允许任意值。
注入Payload
- 设置捕获模式:间隔快照
- 设置间隔:10
- 设置图像文件名为payload:
|
|
- 点击应用保存设置。
验证执行
在容器shell中:
|
|
结果:文件/tmp/test以root权限创建,确认代码执行。
武器化RCE(反向Shell示例)
启动攻击者监听器
|
|
注入反向shell payload 在图像文件名字段中输入以下内容:
|
|
结果
- 反向shell连接回攻击者的机器
- 攻击者获得MotionEye容器环境的完全控制
根本原因
MotionEye将来自Web界面的未清理值(例如image_file_name)直接写入camera-<id>.conf。
重启时,motion二进制文件将这些字段解析为可进行shell扩展的字符串,导致任意命令执行。
影响
类型: 操作系统命令注入 → 远程代码执行
受影响对象:
- 任何攻击者可以以admin身份认证的MotionEye部署(或UI暴露且使用默认/无密码的情况)
- 容器化和裸机安装同样受影响
潜在后果:
- MotionEye容器完全被攻陷
- 如果容器以特权权限运行或挂载敏感主机卷,可能导致横向移动或主机被攻陷
参考资料
- GHSA-j945-qm58-4gjx
- https://nvd.nist.gov/vuln/detail/CVE-2025-60787
- https://github.com/prabhatverma47/motionEye-RCE-through-config-parameter
严重性
高危 - CVSS评分:7.2/10
CVSS v3基础指标:
- 攻击向量:网络
- 攻击复杂度:低
- 所需权限:高
- 用户交互:无
- 范围:未改变
- 机密性:高
- 完整性:高
- 可用性:高
弱点
- CWE-78: 在OS命令中使用的特殊元素的不当中和(‘OS命令注入’)
- CWE-116: 输出的不当编码或转义
CVE ID: CVE-2025-60787
GHSA ID: GHSA-j945-qm58-4gjx