T06 · System Persistence
- Location
SKILL.md:56- Finding
Persistent systemd service runs the bot with unnecessary root privileges
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly matches its trading-alert purpose, but its docs encourage root-level auto-start deployment and include an under-explained external subscription API.
Review before installing. Prefer a virtual environment with pinned dependencies, run the bot as an unprivileged user or user-level service, avoid storing Telegram tokens in plaintext files, protect logs, and do not use the hosted Tinyore subscription/API examples unless you intentionally want to share the shown data with that service.
SKILL.md:56Persistent systemd service runs the bot with unnecessary root privileges
SKILL.md:12Unpinned third-party dependencies create a supply-chain execution risk
scripts/signal_bot.py:33Telegram bot token may be exposed through exception logging
The skill documents capabilities that involve environment secrets, local file access, persistence, and network communication, but it does not declare any tool scope or permissions boundaries in the manifest. This increases the chance that an agent invokes the skill with broader-than-necessary access, making unintended credential use, file modification, or outbound transmission harder to review and constrain.
The manifest description lists several broad activation contexts such as 'price alert system' and 'market monitor' without defining clear trigger boundaries or exclusions. In a manifest file, this can make invocation conditions ambiguous and overlap with common crypto-monitoring requests that may not specifically require this WebSocket Telegram bot skill.
The configuration example instructs users to place Telegram credentials into a local config and describes sending alerts to Telegram without an explicit warning that messages and identifiers are transmitted to a third party. This can lead users or agents to handle secrets and market activity data without informed consent or proper secret-management practices.
The deployment instructions tell the user to use sudo to write a systemd unit under /etc/systemd/system, which requires elevated privileges and creates a persistent service. If the referenced bot script or working directory is tampered with, this setup can run attacker-controlled code automatically with elevated operational trust on boot.
# systemd service
sudo tee /etc/systemd/system/signal-bot.service << 'EOF'
[Unit]
Description=Trading Signal Bot
After=network.target
Enabling the service with sudo creates persistence and causes the bot to start automatically, which amplifies the impact of any malicious or compromised script in the deployment directory. In a skill context, persistent autorun instructions are more dangerous because users may follow them directly from documentation without reviewing the full trust chain.
[Install] WantedBy=multi-user.target EOF sudo systemctl enable --now signal-bot
## Live Signal API (Optional)
The systemctl enable instruction establishes session persistence by configuring the bot to start automatically after reboot. Persistence is not inherently malicious, but in documentation for a networked bot with file/network access, providing autorun steps without stronger safety guidance increases the risk of long-lived unintended execution and harder-to-notice compromise.
[Install] WantedBy=multi-user.target EOF sudo systemctl enable --now signal-bot
## Live Signal API (Optional)
The documentation introduces a hosted subscription/API service that is outside the core local WebSocket-to-Telegram bot purpose described in the manifest. Mixing an unrelated monetized external service into operational instructions can steer users or agents toward third-party data sharing and network calls they did not intend, increasing supply-chain and privacy risk.
The hosted API example requests the user's email and transmits it to a third-party subscription endpoint without an explicit privacy notice, retention statement, or consent language. This creates a clear privacy and data-sharing risk, especially because the section is embedded in what otherwise appears to be local bot setup documentation.
This section instructs outbound requests to a third-party hosted service, including a POST that transmits an email address. External transmission is expected for some integrations, but here it is not clearly scoped in the manifest and is presented without trust, privacy, or validation guidance, increasing the risk of unintended data disclosure.
# Free tier (15-min delayed)
curl https://api.tinyore.com/signals/free
# Get API key (7-day free trial)
curl -X POST https://api.tinyore.com/subscribe -H "Content-Type: application/json" -d '{"email":"you@example.com"}'
This section instructs outbound requests to a third-party hosted service, including a POST that transmits an email address. External transmission is expected for some integrations, but here it is not clearly scoped in the manifest and is presented without trust, privacy, or validation guidance, increasing the risk of unintended data disclosure.
# Free tier (15-min delayed)
curl https://api.tinyore.com/signals/free
# Get API key (7-day free trial)
curl -X POST https://api.tinyore.com/subscribe -H "Content-Type: application/json" -d '{"email":"you@example.com"}'
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl https://api.tinyore.com/signals/free
# Get API key (7-day free trial)
curl -X POST https://api.tinyore.com/subscribe -H "Content-Type: application/json" -d '{"email":"you@example.com"}'
# Pro tier (real-time, $5/mo)
curl https://api.tinyore.com/signals/live -H "X-API-Key: YOUR_KEY"
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl https://api.tinyore.com/signals/free
# Get API key (7-day free trial)
curl -X POST https://api.tinyore.com/subscribe -H "Content-Type: application/json" -d '{"email":"you@example.com"}'
# Pro tier (real-time, $5/mo)
curl https://api.tinyore.com/signals/live -H "X-API-Key: YOUR_KEY"
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl https://api.tinyore.com/signals/free
# Get API key (7-day free trial)
curl -X POST https://api.tinyore.com/subscribe -H "Content-Type: application/json" -d '{"email":"you@example.com"}'
# Pro tier (real-time, $5/mo)
curl https://api.tinyore.com/signals/live -H "X-API-Key: YOUR_KEY"
The documentation repeatedly shows a Telegram bot token embedded directly in URLs, shell commands, Python config, and environment-variable examples without any warning that the token is a secret credential. In this context, users commonly copy-paste examples into shell history, shared docs, screenshots, or source files, which can expose the bot token and allow unauthorized parties to control the bot and read or send messages via the Telegram API.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl -s "https://api.telegram.org/bot<TOKEN>/sendMessage" \
-d "chat_id=<CHAT_ID>" \
-d "text=Test signal 🚀" \
-d "parse_mode=HTML"
The function sends message content to the Telegram Bot API, which is a network operation transmitting potentially sensitive operational data off-system. Although logging exists for failures and disabled mode, there is no confirmation prompt or explicit user-facing warning that signal/status content will be sent to a third-party service.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
log.info(f"[TG disabled] {msg}")
return
try:
requests.post(
f"https://api.telegram.org/bot{config.TG_BOT_TOKEN}/sendMessage",
json={"chat_id": config.TG_CHAT_ID, "text": msg, "parse_mode": "HTML"},
timeout=10,
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
return
try:
requests.post(
f"https://api.telegram.org/bot{config.TG_BOT_TOKEN}/sendMessage",
json={"chat_id": config.TG_CHAT_ID, "text": msg, "parse_mode": "HTML"},
timeout=10,
)
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
return
try:
requests.post(
f"https://api.telegram.org/bot{config.TG_BOT_TOKEN}/sendMessage",
json={"chat_id": config.TG_CHAT_ID, "text": msg, "parse_mode": "HTML"},
timeout=10,
)
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
return
try:
requests.post(
f"https://api.telegram.org/bot{config.TG_BOT_TOKEN}/sendMessage",
json={"chat_id": config.TG_CHAT_ID, "text": msg, "parse_mode": "HTML"},
timeout=10,
)
The bot stores signal history, last-signal timestamps, prices, and update metadata in signal_state.json, which affects local user/system data. The write is not accompanied by any confirmation, warning comment, or explicit disclosure that runtime data will be persisted.
No suspicious patterns detected.