zoneminder/web/api
Isaac Connor 419846c875 fix: sanitize monitor Device path to prevent command injection (GHSA-g66m-77fq-79v9)
The Device field from the Monitors table was interpolated directly into
shell commands (qx(), backticks, exec()) without sanitization, allowing
authenticated users with monitor-edit permissions to execute arbitrary
commands as www-data via the Device Path field.

Defense in depth:
- Input validation: reject Device values not matching /^\/dev\/[\w\/.\-]+$/
  at save time in both web UI and REST API
- Output sanitization: use escapeshellarg() in PHP and quote validated
  values in Perl at every shell execution point

Affected locations:
- scripts/ZoneMinder/lib/ZoneMinder/Monitor.pm (control, zmcControl)
- scripts/zmpkg.pl.in (system startup)
- web/includes/Monitor.php (zmcControl)
- web/includes/functions.php (zmcStatus, zmcCheck, validDevicePath)
- web/includes/actions/monitor.php (save action)
- web/api/app/Model/Monitor.php (daemonControl, validation rules)
- web/api/app/Controller/MonitorsController.php (daemonStatus)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 13:19:03 -04:00
..
app fix: sanitize monitor Device path to prevent command injection (GHSA-g66m-77fq-79v9) 2026-03-08 13:19:03 -04:00
lib/Cake Upgrade cakephp to 2.10.24 2021-03-31 12:11:12 -04:00
.editorconfig Moved the api to underneath the web directory 2014-04-29 20:41:04 +00:00
CMakeLists.txt Update CMakeLists.txt 2017-05-03 12:35:54 -05:00
CONTRIBUTING.md Upgrade cakephp to 2.10.24 2021-03-31 12:11:12 -04:00
README.md Text corrections 2023-08-27 02:00:59 +02:00
build.properties Upgrade cakephp to 2.10.24 2021-03-31 12:11:12 -04:00
build.xml Upgrade cakephp to 2.10.24 2021-03-31 12:11:12 -04:00
composer.json fix: remove vulnerable phpunit dev dependency (CVE-2026-24765) 2026-02-11 21:59:03 -05:00
index.php Upgrade cakephp to 2.10.24 2021-03-31 12:11:12 -04:00

README.md

ZoneMinder API

This is the ZoneMinder API. It should be, for now, installed under the webroot e.g. /api.

app/Config/database.php.default must be configured and copied to app/Config/database.php

In addition, Security.salt and Security.cipherSeed in app/Config/core.php should be changed.

The API can run on a dedicated / separate instance, so long as it can access the database as configured in app/Config/database.php