This release includes 4 security fixes for security teams reviewing exposed deployments.
Topics
Affected surfaces
Summary
AI summaryFixes four high‑severity authorization issues (MM-SEC-1/2/3/4) and a medium‑severity privilege escalation.
Full changelog
MeshMonitor v4.2.1 — Security release
All 4.x deployments should upgrade. This release fixes three high-severity authorization issues reachable by unauthenticated visitors under the standard public-viewer configuration, plus one medium-severity authenticated-user privilege escalation. See SECURITY_ADVISORY.md for full per-finding details.
Summary
v4.2.1 is a focused security and stability release. It closes the MM-SEC-1/2/3/4 advisory series reported by an external researcher: anonymous disclosure of the auto-generated VAPID private key via GET /api/settings (MM-SEC-1), anonymous disclosure of every channel's PSK via GET /api/channels and /api/poll (MM-SEC-2), anonymous disclosure of hidden-channel message content via /api/poll (MM-SEC-3), and authenticated-user privilege escalation across the channel-mutation endpoints (MM-SEC-4). Two adjacent fixes also land: a long-standing decode bug where empty channel names were silently dropped during channel-URL import (#2900), and admin-packet pacing during config import to work around a firmware-side timing race that started causing system-test flakiness on Meshtastic firmware v2.7.22 (#2903). A new regression test locks in the system-backup tarball's exclusion of push_subscriptions, sessions, and backup_history (#2908). All v4.x deployments should upgrade — operators who ran a public-viewer dashboard with channel_0:read granted to anonymous should rotate exposed PSKs after upgrading, since PSK disclosure cannot be undone retroactively.
Security
- MM-SEC-1 (High): Strip secret keys (
vapid_private_key,securityDigestAppriseUrl,analyticsConfig, plus a*_private_key/*_secret/*_tokentail-pattern denylist) fromGET /api/settingsfor non-admin callers (#2904) - MM-SEC-2 (High): Stop returning
channel.pskfrom/api/channels,/api/channels/all, and/api/poll. HoisttransformChannelto a shared module + per-row read permission check + new derivedpskSet: booleanso callers can answer "is a PSK configured?" without seeing the key (#2905) - MM-SEC-3 (High): Filter messages by per-channel read in
/api/poll,/api/messages, and/api/messages/unread-countsso a caller withchannel_0:readcan no longer see hidden-channel message content (#2906) - MM-SEC-4 (Medium): Per-channel write gate on
PUT/DELETE /api/channels/:id,/api/channels/:id/export,/api/channels/:slotId/import, and/api/channels/reorderso a user withchannel_0:writecan no longer mutate any channel (#2907) - Coverage lock-in:
BACKUP_TABLESregression test assertspush_subscriptions,sessions,backup_historyare never re-added to the system-backup tarball + operator-facingSECURITY_ADVISORY.md(#2908)
Bug Fixes
- Channel URL decode: Preserve empty channel names instead of silently dropping them — fixes round-trip imports of channel-set URLs whose primary channel is unnamed (#2900)
- Config import pacing: Bump admin-packet inter-message delays from 500/300/500 ms to 2000/1000/1500 ms across
/channels/import-config,/channels/reorder, and the local + remote/admin/import-configpaths. Works around a firmware-side timing race in Meshtastic v2.7.22 where the first SetChannel admin packet after a tight BeginEditSettings was being silently dropped, causing intermittent CI failures (#2903)
Upgrade notes
After upgrading, rotate any channel PSKs that were exposed while a public-viewer dashboard with channel_0:read was reachable. The PSK disclosure under MM-SEC-2 is the highest-impact finding because anyone who saved the keys before the patch can still decrypt mesh traffic captured at the time. The leak is irreversible — only key rotation closes it.
If you never set VAPID_PUBLIC_KEY / VAPID_PRIVATE_KEY / VAPID_SUBJECT via environment variables, also rotate the auto-generated VAPID key: delete the three vapid_* rows from the settings table and restart. Existing browser push subscriptions are invalidated — clients re-subscribe transparently on next visit.
The MM-SEC-4 fix tightens the per-channel write check from a static channel_0:write gate to a per-row check using the URL's actual :id. Users who previously relied on having only channel_0:write to manage every channel will now need explicit per-channel grants. Audit accounts and grant per-channel permissions as needed.
Full Changelog
https://github.com/Yeraze/meshmonitor/compare/v4.2.0...v4.2.1
🚀 MeshMonitor v4.2.1
📦 Installation
Docker (recommended):
docker run -d \
--name meshmonitor \
-p 8080:3001 \
-v meshmonitor-data:/data \
ghcr.io/Yeraze/meshmonitor:4.2.1
🧪 Testing
✅ All tests passed
✅ TypeScript checks passed
✅ Docker images built for linux/amd64, linux/arm64, linux/arm/v7
📋 Changes
See commit history for detailed changes.
Breaking Changes
- Per‑channel write gate introduced on `PUT/DELETE /api/channels/:id` and related endpoints; global `channel_0:write` no longer permits mutation of arbitrary channels.
Security Fixes
- MM-SEC-1 (High): Strip secret keys (`vapid_private_key`, `securityDigestAppriseUrl`, `analyticsConfig`, and any `_private_key/_secret/_token` fields) from `GET /api/settings` for non‑admin callers.
- MM-SEC-2 (High): Remove `channel.psk` from responses of `/api/channels`, `/api/channels/all`, and `/api/poll`; add `pskSet: boolean` indicator instead.
- MM-SEC-3 (High): Enforce per‑channel read permission in `/api/poll`, `/api/messages`, and `/api/messages/unread-counts` to prevent hidden‑channel content disclosure.
- MM-SEC-4 (Medium): Tighten write checks on channel mutation endpoints (`PUT/DELETE /api/channels/:id`, export/import, reorder) to per‑row authorization.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About Yeraze/meshmonitor
All releases →Related context
Related tools
Earlier breaking changes
- v4.7.2 Route `destination` field now rejects non‑8‑hex nodeId or 64‑hex publicKey, returning HTTP 400.
Beta — feedback welcome: [email protected]