GHSA-rhgp-6wq6-9j67: motionEye's World-Readable Configuration File Exposes Admin Password Hash
Security Advisory: World-Readable Configuration File Exposes Admin Password Hash in motionEyeSummarymotionEye v0.43.1 and prior versions create the configuration file `/etc/motioneye/motion.conf` with `644` permissions (`-rw-r--r--`), making it readable by any local user on the system. This file contains sensitive data including the admin password hash, which can be leveraged by other vulnerabilities to escalate privileges.Affected VersionsmotionEye <= 0.43.1b4Fixed in motionEye 0.44.0b1 (applies `0600` mode to `motion.conf` and `camera-*.conf` files)Vulnerability DetailsWorld-Readable Configuration File (CWE-732)When motionEye writes its configuration, the file `/etc/motioneye/motion.conf` is created with `644` permissions regardless of the installation method. This file contains the admin password hash in the `@admin_password` field:Any local user can read this hash without elevated privileges:Additionally, per-camera configuration files (`camera-*.conf`) are also created with the same `644` permissions, potentially exposing camera-specific credentials and settings.ImpactThe exposed admin password hash enables several attack paths:**Offline password cracking:** The SHA1 hash can be cracked to recover the plaintext admin password**Authentication bypass:** When combined with the signature authentication weakness (see GHSA-45h7-499j-7ww3), the hash can be used directly to forge authenticated admin API requests**Full system compromise:** When further chained with CVE-2025-60787 (OS command injection), a local unprivileged user can escalate to the Motion daemon user (often root)Proof of ConceptThe following demonstrates that an unprivileged user can read the admin password hash from the config file and verify it matches the admin's password:Verified OutputThe following output was captured on a fresh motionEye v0.43.1b4 installation (official `motioneye_init` method, admin password set to `testpassword123`):The hash extracted by the unprivileged `testuser` matches the SHA1 of the admin password, confirming full credential exposure.Reproduction StepsThis vulnerability has been tested and confirmed with both installation methods described in the official motionEye documentation.Method 1: Manual InstallationInstall motionEye on a Linux system:Set an admin password via the web UI at `http://localhost:8765`Verify the config file is world-readable:As an unprivileged user, read the hash:Method 2: Official `motioneye_init` InstallationInstall motionEye using the official init script:The `motioneye_init` script automatically creates the required directories, installs the systemd service, and starts motionEye. Set an admin password via the web UI at `http://localhost:8765`Verify the config file is still world-readable:Note that while the ownership changes to `motion:motion` (instead of `root:root` in the manual method), the permissions remain `644`, meaning any local user can still read the file.Confirm as an unprivileged user:Both installation methods produce the same vulnerable state, confirming this is the default behavior of the software and not a user misconfiguration.Related Vulnerabilities**GHSA-45h7-499j-7ww3:** Password hash accepted as API signing key (CWE-836), which allows the hash exposed by this vulnerability to be used for forging authenticated admin API requests**CVE-2025-60787:** OS command injection via `image_file_name`, which requires admin authentication. When chained with both this vulnerability and GHSA-45h7-499j-7ww3, enables local privilege escalation to rootSuggested Remediation**Fix file permissions:** Create `motion.conf` and `camera-*.conf` with `600` permissions (`-rw-------`), readable only by the motionEye service user (addressed in motionEye 0.44.0b1)Timeline**2026-03-11:** Vulnerability discovered during security research**2026-03-11:** Vendor notified via GitHub Security Advisory**2026-03-12:** Vendor acknowledged, confirmed fix in motionEye 0.44.0b1
CVSS v3.1: 5.5