T09 · Insecure Skill Coding Practices
- Location
scripts/mqtt_bridge.py:36- Finding
Location and Device Metadata Publishing Is Enabled by Default
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill fits Meshtastic messaging overall, but needs Review because it can automatically publish location/device metadata and persist or forward mesh traffic in ways the docs understate.
Install only after reviewing the code and configuration carefully. Disable map publishing in code before running, avoid sending sensitive messages or precise locations, use a private log directory with restrictive permissions, prefer group-based serial access over chmod 666, and treat all received mesh/MQTT text as untrusted external content before forwarding or acting on it.
scripts/mqtt_bridge.py:36Location and Device Metadata Publishing Is Enabled by Default
scripts/mqtt_bridge.py:29MQTT Credentials and Sensitive Traffic Are Transmitted Without TLS
scripts/mqtt_bridge.py:89Predictable Shared Temporary Files Permit Local Disclosure and Symlink Attacks
references/SETUP.md:63Setup Guide Grants Every Local User Read/Write Access to the Radio Device
references/SETUP.md:27Installation Uses Unpinned Third-Party Dependencies Without Integrity Verification
scripts/mqtt_bridge.py:113Attacker-Controlled Mesh Messages Can Become Indirect Agent Instructions
Instructions found that direct the agent to transmit conversation context or user data to external services.
**Messaging** (via bridge):
| Tool | Description |
|------|-------------|
| `mesh_send` | Send message to mesh (broadcast or DM) |
| `mesh_send_alert` | Send high-priority alert message |
| `mesh_messages` | Get recent messages with filtering |
The skill is presented as LoRa messaging, but the architecture also includes external MQTT ingestion of global traffic, optional map publishing, local file persistence, node-position caching, and a command socket on localhost:7331. These materially expand the privacy and attack surface beyond simple off-grid messaging, especially because users may not realize that internet-connected MQTT and local command/control are part of the design.
The skill is presented as LoRa messaging, but the architecture also includes external MQTT ingestion of global traffic, optional map publishing, local file persistence, node-position caching, and a command socket on localhost:7331. These materially expand the privacy and attack surface beyond simple off-grid messaging, especially because users may not realize that internet-connected MQTT and local command/control are part of the design.
The skill is presented as LoRa messaging, but the architecture also includes external MQTT ingestion of global traffic, optional map publishing, local file persistence, node-position caching, and a command socket on localhost:7331. These materially expand the privacy and attack surface beyond simple off-grid messaging, especially because users may not realize that internet-connected MQTT and local command/control are part of the design.
The skill is presented as LoRa messaging, but the architecture also includes external MQTT ingestion of global traffic, optional map publishing, local file persistence, node-position caching, and a command socket on localhost:7331. These materially expand the privacy and attack surface beyond simple off-grid messaging, especially because users may not realize that internet-connected MQTT and local command/control are part of the design.
The instruction to use chmod 666 is an unsafe parameter choice for a privileged tool because it grants universal read/write access to a hardware device. This is dangerous because it turns a permission issue into a broad local compromise of device control rather than solving access with least privilege.
Permission denied:
sudo chmod 666 /dev/ttyACM0
# Or add udev rule for permanent fix
The configuration enables receipt of global Meshtastic MQTT traffic by default and includes real broker credentials, but it does not clearly warn that this may ingest third-party mesh messages and associated metadata. In a messaging skill, this creates a meaningful privacy and compliance risk because operators may unknowingly collect or process non-local communications.
The alert forwarding section allows mesh-derived message content or metadata to be sent to third-party services such as Telegram or Discord without an explicit warning about external disclosure. In this skill's context, forwarding radio network data off-device can expand exposure beyond the local mesh and surprise users who expect communications to remain confined to their node or network.
The README prominently advertises global MQTT traffic and local logging to /tmp/mesh_messages.txt without an equally explicit warning that messages may be publicly relayed and stored in a world-readable or ephemeral location depending on host configuration. In a messaging skill, this can lead users or downstream agents to handle sensitive data under false assumptions of privacy, causing inadvertent data exposure.
The skill describes shell commands, file access, temp-file logging, and local service control, but it declares no explicit tool scope or permission boundaries. In an agent environment, this under-specification can cause the skill to be invoked with broader host access than users expect, increasing the chance of unintended file reads/writes or command execution.
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
sudo systemctl status meshtastic-bridge
# Restart
sudo systemctl restart meshtastic-bridge
# View logs
sudo journalctl -u meshtastic-bridge -f
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
sudo systemctl status meshtastic-bridge
# Restart
sudo systemctl restart meshtastic-bridge
# View logs
sudo journalctl -u meshtastic-bridge -f
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
sudo systemctl status meshtastic-bridge
# Restart
sudo systemctl restart meshtastic-bridge
# View logs
sudo journalctl -u meshtastic-bridge -f
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
sudo systemctl status meshtastic-bridge
# Restart
sudo systemctl restart meshtastic-bridge
# View logs
sudo journalctl -u meshtastic-bridge -f
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
sudo systemctl status meshtastic-bridge
# Restart
sudo systemctl restart meshtastic-bridge
# View logs
sudo journalctl -u meshtastic-bridge -f
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
sudo systemctl status meshtastic-bridge
# Restart
sudo systemctl restart meshtastic-bridge
# View logs
sudo journalctl -u meshtastic-bridge -f
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
sudo systemctl status meshtastic-bridge
# Restart
sudo systemctl restart meshtastic-bridge
# View logs
sudo journalctl -u meshtastic-bridge -f
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
sudo systemctl status meshtastic-bridge
# Restart
sudo systemctl restart meshtastic-bridge
# View logs
sudo journalctl -u meshtastic-bridge -f
The monitoring examples instruct the agent to read mesh messages, summarize them, translate them, and deliver alerts over external channels such as Telegram, but the warning about privacy exposure is limited and not tied directly to forwarding content off-device. That can result in sensitive radio traffic, identifiers, or inferred location information being redistributed to third-party services without clear user acknowledgement.
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
dmesg | tail -20 for errorsdialout group: sudo usermod -a -G dialout $USERPermission denied:
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
dmesg | tail -20 for errorsdialout group: sudo usermod -a -G dialout $USERPermission denied:
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
dmesg | tail -20 for errorsdialout group: sudo usermod -a -G dialout $USERPermission denied:
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
dmesg | tail -20 for errorsdialout group: sudo usermod -a -G dialout $USERPermission denied:
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
dmesg | tail -20 for errorsdialout group: sudo usermod -a -G dialout $USERPermission denied:
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
dmesg | tail -20 for errorsdialout group: sudo usermod -a -G dialout $USERPermission denied: