Audits › Controls › Authenticated remote control
Security · control 16 of 21
Authenticated remote control: does your trading bot have it?
If it is controlled through Telegram, Discord or a web UI, does it obey only authorised users (id allow-list, token, password), or anyone who finds the bot?
Why it matters
A Telegram bot without a user allow-list lets a stranger open or close positions.
How to check it in the code
- Search for chat_id, allowed_users, whitelist, auth, password, jwt.
- Check every command handler verifies the sender, not only the start command.
- Check the web UI has authentication and does not bind to all interfaces by default.
This is what the audit does for every bot in the list, on public code, without installing or running anything. Verdict values: present, partial, absent, not applicable, not verified. See the method.
Results across audited bots
Across 10 audited bots: 4 present, 1 partial, 0 absent, 3 not applicable, 2 not verified.
| Bot | Verdict | Evidence | Note |
|---|---|---|---|
| HKUDS/Vibe-Trading | Not verified | agent/src/channels/telegram.py (69.7KB) — only the markdown/HTML rendering header section was read | Did not reach the chat_id/user authorization section within budget. GET /search/code?q=allowed_user_ids+repo:HKUDS/Vibe-Trading returned 0 hits (may use a different variable name). |
| hummingbot/hummingbot | Partial | hummingbot/remote_iface/mqtt.py, class MQTTCommands (start/stop/config/import commands over MQTT topics) | The class itself implements no per-user authorization list; access control depends entirely on the external MQTT broker's own authentication (username/password/TLS), which the operator must configure separately. |
| Drakkar-Software/OctoBot | Present | telegram_bot_interface/telegram_bot.py: every single command handler (command_start, command_stop, command_restart, command_sell_all, command_sell_all_currencies, command_risk, command_pause_resume, etc.) begins with 'if TelegramBotInterface._is_valid_user(update):' and replies interfaces_bots.UNAUTHORIZED_USER_MESSAGE to unrecognized chats otherwise. | Every state-changing command, including sell_all and set_risk, is gated by an authorized-user check before execution. |
| freqtrade/freqtrade | Not verified | ||
| jesse-ai/jesse | Present | jesse/controllers/live_controller.py (router-level 'dependencies=[Depends(require_auth)]' on every /live endpoint) + jesse/controllers/ai_model_controller.py (same pattern) + jesse/services/auth.py (require_auth checks a sha256(password) bearer token against ENV_VALUES['PASSWORD']) | All control endpoints require the shared dashboard password; jesse/services/notifier.py only sends outbound Telegram/Discord/Slack messages and has no inbound command listener, so there is no unauthenticated chat-based control surface. Weakness: one single shared secret for all users/devices, no per-user allowlist or roles. |
| chrisleekr/binance-trading-bot | Not applicable | SECURITY.md ("Authentication is a single operator account. No email verification, no second factor."); apps/api/src/routes/kill-switch.ts (requireUser() middleware); docs/concepts/notifiers.md | All control actions found are authenticated web/API routes behind a single-operator session, not a chat-bot command surface. Slack/Telegram/webhook are documented and coded as outbound-only alert channels; no inbound command handling for any of them was found this session, so there is no remote-control attack surface to rate as present or absent. |
| alsk1992/CloddsBot | Present | src/security/index.ts AccessControl class (allowlist/blocklist) plus PairingManager (6-digit DM pairing code, 5-minute expiry, persisted at ~/.clodds/paired-users.json); imported into src/agents/index.ts for channel message authorization (Telegram/Discord/etc.). | A concrete allowlist + pairing mechanism restricts who can command the bot over chat channels. |
| Lumiwealth/lumibot | Not applicable | docs/AI_AGENT_NOTIFICATIONS.md describes Telegram only as an OUTBOUND notification channel (bot -> user messages); no inbound command/control feature (e.g. a Telegram command that stops the bot or closes a position) was found in the docs reviewed. | |
| YizhiSong/FriesTrader | Not applicable | No Telegram/Discord/web control surface exists anywhere in the file tree. The only two 'inputs' to the system are the two scheduled routine invocations (PHASE_A_TASK.md/PHASE_B_TASK.md, README 'Running it') and the human hand-editing risk_rules.json via git. | No inbound command channel exists for a third party to hijack -- this checklist item's risk doesn't apply to this bot's design. |
| c9s/bbgo | Present | pkg/interact/auth.go (AuthInteract, /auth command requiring Token + TOTP one-time password before session.SetAuthorized()) | Telegram/Slack interactive commands require passing a secret token and a time-based one-time password before the session is authorized; unauthenticated users cannot issue commands. |
If your bot does not have it
The watchdog enforces daily loss, drawdown, position size and heartbeat limits from outside the bot, with a read-only key, whatever the bot's own code does.