| T1 | Forged webhook (fake message or call) | 13 channels | Platform signature over the raw body, constant-time comparison, provider refuses to start without credentials | Replay where the platform signs no timestamp (see below) |
| T2 | Payload flood / oversized body | Webhook ingress | @botmesh/server limits body size, per-body and ingest timeouts, concurrency cap, 413/408/503 | The operator still sizes the process and the reverse proxy |
| T3 | SSRF from a user-supplied URL (media, TTS, embeddings) | Every outbound fetch | secureFetch: HTTPS, private ranges rejected, socket pinned to the checked IP, redirects re-validated, size/time caps | DNS answers can change after the check only if a provider bypasses secureFetch |
| T4 | Path traversal through ids (tenant, bot, chat, flow) | REST /v1, manager, MCP docs | Bot and tenant ids restricted to [A-Za-z0-9][A-Za-z0-9_.-]{0,63} (flow ids also allow :), filenames derived from them, docs paths resolved and rejected outside the root | None known |
| T5 | Code execution from a stored flow | JSON flow documents | Data-only schema: no code, no module import, no eval; safe expression grammar (no regex, no prototype access, bounded length/depth); http step goes through secureFetch | An http step can still call a public endpoint the operator allowed |
| T6 | Cross-tenant read/write | Store, manager, product packages | Namespace per bot, tenant-scoped keys in tenant-kv, compare-and-set, REST scopes and 404 for other tenants | A custom IStore implementation can break its own isolation |
| T7 | Secret or personal data in logs/traces | Logger, OpenTelemetry | No bodies, prompts, QR payloads or tokens in framework logs; spans carry ids through the ids policy (hash by default) and never message content | Operator code that logs ctx.body |
| T8 | Prompt injection driving tools | @botmesh/ai | Tools are opt-in per call, destructive ones need confirm: true, the model cannot invent tool ids (tools: ['id'] filters the configured set) | A read-only tool can still leak whatever the operator gave it |
| T9 | Untrusted code inside the process | Plugins | Plugin.install is synchronous, plugins only get the scoped facade, no sandbox | Plugins run in-process with full Node permissions: install only code you trust |
| T10 | Ban of the WhatsApp number | Baileys / gateways | Opt-in rate limiter, typing/pacing, no button spam, exclusiveSession for single-connection transports | Automating WhatsApp Web is unofficial and always carries ban risk |
| T11 | Agent reads or writes something it should not | @botmesh/mcp | Local stdio only (no network listener), read-only tools, no eval, docs reads confined to the configured root, no writes to disk | The client decides what to do with the answers |
| T12 | Replay of a captured webhook | Meta, Telegram, Twilio, HighLevel, Gupshup, WPPConnect | In-memory dedupe by chat and message id (BotConfig.dedupe, per process); with durability, the inbox journal also drops redeliveries across restarts and replicas | No platform timestamp to enforce a window; keep endpoints on HTTPS |