Back to skill

Security audit

FlowFi

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent FlowFi API documentation skill, but it exposes agents to broad account and workflow control with weak guidance around bearer tokens and irreversible actions.

Review this skill before installing if you will let an agent act on your FlowFi account. Use short-lived, narrowly scoped tokens where possible, avoid placing JWTs in WebSocket URLs or logs, and require explicit confirmation before deploy, start, edit, cancel, stop, or delete operations, especially workflows that can trigger transactions or public notifications.

Vulnerability Patterns
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
docs/websocket.md:3
Finding
Bearer JWT Exposure Through WebSocket Query-String Authentication<![CDATA[ ## Vulnerability Details **File Location**: `docs/websocket.md:3-6`; duplicated in `README.md:89` **Vulnerability Type**: Bearer credential exposure through URL query parameters **Risk Level**: Medium ### Vulnerable Code Snippets `docs/websocket.md:3-6`: ```markdown **Namespace:** `/workflow-status` (e.g. `wss://api.example.com/workflow-status`). **Authentication:** Connect with JWT in handshake: - `auth.token` or query `token`. Invalid/missing token disconnects. ``` `README.md:89`: ```markdown **WebSocket:** Connect to `/workflow-status` with JWT in `auth.token` or query `token`. Subscribe with `subscribe:execution`, `subscribe:workflow`, or `subscribe:simulation` (body: `{ executionId }`, `{ workflowId }`, `{ simulationId }`). You receive `execution:status`, `execution:node-status`, `workflow:update`, `workflow:history:refresh`, and simulation events. See [SKILL.md](SKILL.md) for full event list and optional client `workflow:update` to push edits. ``` ### Technical Analysis The Skill explicitly permits a bearer JWT to be supplied as a WebSocket handshake query parameter. Query-string credentials commonly become part of request URLs recorded by reverse proxies, API gateways, load balancers, observability platforms, access logs, debugging tools, and browser or client diagnostics. TLS protects a URL while it is transmitted but does not prevent infrastructure at either endpoint from recording the decrypted request URL. A JWT is a bearer credential, so possession is generally sufficient for replay without proof that the requester is the original user. The exposure window is potentially significant because `docs/authorization.md:5-12` permits creation of long-lived bearer tokens with lifetimes of up to 31,536,000 seconds, or one year. The documentation does not require a short-lived or WebSocket-specific token and does not warn users against URL-based authentication. Sending a user-provided JWT to the selected FlowFi backend is necessary for th ...[truncated 1748 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the query-string authentication option from `docs/websocket.md`, `README.md`, and all related examples. 2. Require credentials to be supplied only through the WebSocket client's dedicated authentication payload, such as `auth.token`. 3. Prefer short-lived, narrowly scoped WebSocket tokens instead of general-purpose JWTs that authorize all protected REST operations. 4. Set conservative token lifetimes and document token rotation and immediate revocation procedures. 5. Configure proxies, gateways, WebSocket servers, and observability systems to redact authentication data and avoid logging handshake query strings. 6. Ensure error messages, traces, analytics, and client diagnostics never include complete JWT values. 7. Enforce server-side ownership checks for every workflow, execution, simulation, and smart-account identifier rather than relying solely on room subscription identifiers. 8. Consider token audience restrictions, endpoint-specific scopes, and replay-resistant session establishment. 9. Update the documentation with explicit guidance that bearer tokens must not be placed in URLs, logs, prompts, workflow variables, or other persistent records. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (6)

Tool Parameter Abuse

High
Category
Tool Misuse
Content
| **Pause running** | `POST /workflows/:id/pause`. Resume with `POST /workflows/:id/resume`. |
| **Stop and make editable** | `POST /workflows/:id/undeploy` — status goes back to **draft**. |
| **End the workflow** | `POST /workflows/:id/stop` — status **ended**; no more runs (you can deploy again later). |
| **Remove permanently** | **Delete** — `DELETE /workflows/:id`. Safe for any status; backend stops the scheduler if needed. |
| **List workflows** | `GET /workflows` with optional `?status=draft`, `?smartAccountId=...`, pagination. |
| **Run once / watch runs** | **Start run** — `POST /executions/workflows/:workflowId/start`. **List runs** — `GET /executions` or `GET /executions/workflows/:workflowId`. **Real-time** — WebSocket namespace `/workflow-status`; subscribe to `execution` or `workflow` for live status and history refresh. |
| **Start from a template** | **List** — `GET /templates` or `GET /templates/categories`. **Clone** — `POST /templates/:id/clone` with `smartAccountId` (and optional `name`, `network`) to create a **draft** workflow; then edit and deploy. |
Confidence
80% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Tool Parameter Abuse

High
Category
Tool Misuse
Content
| **Pause running** | `POST /workflows/:id/pause`. Resume with `POST /workflows/:id/resume`. |
| **Stop and make editable** | `POST /workflows/:id/undeploy` — status goes back to **draft**. |
| **End the workflow** | `POST /workflows/:id/stop` — status **ended**; no more runs (you can deploy again later). |
| **Remove permanently** | **Delete** — `DELETE /workflows/:id`. Safe for any status; backend stops the scheduler if needed. |
| **List workflows** | `GET /workflows` with optional `?status=draft`, `?smartAccountId=...`, pagination. |
| **Run once / watch runs** | **Start run** — `POST /executions/workflows/:workflowId/start`. **List runs** — `GET /executions` or `GET /executions/workflows/:workflowId`. **Real-time** — WebSocket namespace `/workflow-status`; subscribe to `execution` or `workflow` for live status and history refresh. |
| **Start from a template** | **List** — `GET /templates` or `GET /templates/categories`. **Clone** — `POST /templates/:id/clone` with `smartAccountId` (and optional `name`, `network`) to create a **draft** workflow; then edit and deploy. |
Confidence
80% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Tool Parameter Abuse

High
Category
Tool Misuse
Content
- **Undeploy** — `POST /workflows/:id/undeploy` → back to **draft** so you can edit.
- **Pause / Resume** — `POST /workflows/:id/pause`, `POST /workflows/:id/resume` (active ↔ paused).
- **Stop** — `POST /workflows/:id/stop` → **ended** (no more runs; can deploy again later).
- **Delete** — `DELETE /workflows/:id` removes the workflow permanently (any status).
- **List workflows** — `GET /workflows` with optional `?status=draft`, `?smartAccountId=...`, pagination.
- **Price** — `GET /price?symbol=BNB` (one token USD price, no auth); `GET /price/prices` (BNB + ETH, no auth).
- **Templates** — `GET /templates` (list, no auth), `GET /templates/display`, `GET /templates/categories`, `GET /templates/:id` (full); `POST /templates/:id/clone` (JWT) creates a draft workflow.
Confidence
80% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The skill tells users to send a JWT to OpenClaw and says it will be reused for all API requests, but it provides no warning that bearer tokens are highly sensitive credentials equivalent to account access. In an agent context, this increases the risk of accidental token disclosure, unsafe logging, reuse across sessions, or transmission to unintended tools/services.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The README describes deploy, undeploy, pause, resume, stop, and delete operations, including that deployment activates triggers and deletion is permanent, but it does not provide an explicit cautionary warning section about the potential operational impact on live workflows or downstream actions. For markdown files, safety-relevant behaviors that can affect user systems or data should be accompanied by clear warnings, especially for irreversible or live-execution actions.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
This markdown documents `DELETE /workflows/:id` as permanently removing a workflow and its variables, but it does not include a prominent caution or user warning about irreversible data loss beyond the endpoint description itself. For markdown files, destructive behaviors that affect user data should be accompanied by clear warnings about impact on data and recovery.

Static analysis

No suspicious patterns detected.