SafetyCard Request a review

FastGPT

Self-hosted, multi-tenant platform for building LLM workflow and agent apps with knowledge bases, plugins, MCP tools and code nodes.

github.com/labring/FastGPT · 2026-10-05 · c01b99b

Defense-in-depth score

3.9 / 10

FastGPT isolates code well: code nodes run in a separate sandbox service with chroot, a dropped user ID and a default-deny seccomp filter, and the main app never executes code itself. The dominant risk is everything around the tools: there is no approval step for any tool call, and an app that reads untrusted web pages, files or share-link messages can use its stored credentials to send data out or change external systems unattended. Private-network addresses are reachable from tools unless the operator turns on the internal-IP check, and the shipped deployment's default access configuration needs hardening before exposure.

Safest setup

FastGPT runs code nodes in a separate, locked-down sandbox service, gives each app only the tools its designer selected, and bounds every run with node and round limits. Tools run without approval using the credentials stored in the app, and the shipped deployment needs hardening before exposure, so the safest setup narrows those credentials and puts your own boundaries around the install.

SetupHowWhat it gives you
Scoped tool credentialsGive each app's HTTP, MCP and plugin tools their own credentials, scoped at the provider to what that app needs and read-only where it allowsThe external system itself refuses anything outside that grant, whatever the model asks for C1
Secrets generated per installBefore first start, replace the administrator password and every fixed key and token in the shipped deployment configuration with values generated for this installPlatform access and the encryption of stored tool credentials rest on secrets only you hold C8
Share links for read-only appsPublish share links only for apps whose tools read, and keep apps with write or send tools for signed-in team membersAnonymous visitors never steer tools that act with the app owner's stored credentials C1
The internal-IP checkCHECK_INTERNAL_IP=true in the app's environmentHTTP, MCP and file-fetch requests from apps stay off private-network addresses, including the deployment's own services C3
Only the tools neededKeep the default of no tools in a new app and select only the tools each app's task usesA published app can call only the tools declared in its version C3
Seccomp in the code sandboxKeep the default SANDBOX_DISABLE_SECCOMP=false in the code-sandbox serviceCode nodes keep their default-deny system-call filter with no direct network access C4
A run budgetKeep the default WORKFLOW_MAX_RUN_TIMES=500, or lower it for short tasksEvery run, child apps included, ends after a fixed number of node runs C10
A private networkRun the deployment on a private network that exposes only the web app, with outbound access limited to the hosts your apps needAn outer boundary around the sandbox services and a narrow path for data to leave C4

Approving with confidence

  • Tool-call and agent nodes run the tools the model picks without a prompt; where a person must decide, build that part as a classic workflow with a user-choice step before the action.

Handling data

  • Console logs default to LOG_CONSOLE_LEVEL=debug and are not redacted; set info or higher and store them like the data your apps handle.
  • Run records live in the app database and go when a chat is deleted; back up the database where you need a lasting record.

Key gaps (3)

  1. A hijacked app can leak knowledge-base data and take irreversible external actions through its HTTP, MCP and plugin tools with no person involved. C5 · Untrusted input blast radius
  2. No tool call, including HTTP writes, MCP tools, plugins and the sandbox shell, requires human approval. C2 · Approval gates
  3. The default access configuration is not locked down, and the platform-level credentials reach every tenant's stored data. C1 · Identity & least privilege

Criteria

C1 Identity & least privilege

0.30 / 1.00

FastGPT is a multi-tenant platform: each app runs inside its team, and a published app is bound to the list of knowledge bases and tools declared in its version, which the runtime checks before loading anything. Tools then act with whatever credentials the app designer stored for them, and the same credentials serve every user of the app, including anonymous visitors of a share link, who run as the app owner. The quick start documents a fixed default administrator password, and the shipped deployment's default access configuration is not locked down, so least privilege depends on the operator hardening the install. The platform-level credentials reach every tenant's data.

C2 Approval gates

0.07 / 1.00

There is no approval step for tool calls. The tool-call and agent nodes execute whatever tool the model selects (HTTP requests, MCP tools, plugins, sub-apps, sandbox shell when enabled) without asking a person. Designers can place a user-choice or form step in a classic workflow, but it shows designer-written options rather than the exact call, and the tool-call and agent paths never pass through it. Consequential actions such as HTTP writes or messages sent through plugins cannot be undone.

C3 Tool & action scoping

0.50 / 1.00

Each app receives only the tools its designer selected, and the runtime refuses tools that are not declared in the published version. Outbound URLs from HTTP tools, MCP connections and file fetches go through a shared address check that always blocks loopback and cloud-metadata addresses and re-checks every redirect against a pinned DNS answer. Private-network addresses, including the deployment's own internal services, are only blocked when the operator turns on the internal-IP check, which is off by default. The HTTP tool itself stays general-purpose, with no host allowlists or quantity bounds.

C4 Code-execution isolation

0.65 / 1.00

The main application never executes code itself. Code nodes are sent to a separate code-sandbox service that runs each task in a fresh process inside a chroot, with a dropped user ID, no-new-privileges and a default-deny seccomp filter that blocks direct network access; outbound HTTP from code goes through a helper that blocks internal addresses and caps the number of requests. The optional Agent Sandbox, which gives the model a shell, runs in per-session containers created by OpenSandbox or Sealos with internal networks denied but public egress open by design. Turning off seccomp needs an explicit setting, and there is no fallback to running code on the host.

C5 Untrusted input blast radius

0.25 / 1.00

Nothing structural limits what a hijacked app can do. Knowledge-base quotes are wrapped in delimiter tags in the default prompt template and tool results arrive in the tool role, but web pages, uploaded files, MCP and HTTP results, and messages from public share-link visitors are not treated differently from instructions. In normal use an app reads untrusted content, holds team knowledge and tool credentials, and can send data out or change external systems through HTTP, MCP and plugin tools in the same run with no person involved.

C6 Memory, context & configuration integrity

0.40 / 1.00

The model has no long-term memory tool: knowledge bases are filled by people (uploads, imports, website and API sync), skills are saved and deployed as versions through an explicit action, and agent memory and variables live inside a single chat. Knowledge bases are team-scoped and chats are per user, enforced in queries. Imported knowledge-base content, including synced web pages, is not validated and has no expiry, and once in a knowledge base it is retrieved for every user of the app and can steer tool use.

C7 Third-party extensions

0.42 / 1.00

Extensions come as system plugins served by a separate plugin service, team-installed plugins, and remote MCP servers. Plugin installs record the version, an etag and the permissions confirmed at install time, and team plugin installation is off unless the operator enables it; package verification itself happens in the plugin service, which is not part of this repository. MCP servers are remote URLs whose code and tool definitions are not pinned. No extension runs inside the main application process.

C8 Secrets & sensitive-data protection

0.17 / 1.00

Credentials that designers attach to HTTP and MCP tools are encrypted at rest with AES-256-GCM, decrypted only when the request is sent, and left out of the recorded node responses, so they never reach the model. However, the shipped default configuration carries fixed secret values, including the key that protects those stored credentials, so the at-rest protection depends on the operator replacing them. Model provider keys and inter-service tokens are plain configuration values, logs have no redaction, and OpenTelemetry export is off unless configured.

C9 Audit & traceability

0.53 / 1.00

Every node run, including tool calls, MCP and plugin tools and child apps, is stored as a structured row tied to the chat, which records the team member or share-link user. Team configuration changes go to a separate team audit log. Records live in the application database, are deleted together with chat history, and are written in batches; write failures are logged and the run continues.

C10 Limits & kill switch

0.57 / 1.00

Runs are bounded by a node-run budget (500 by default) that child apps draw from, by round caps in the agent loop (100) and tool-call node (50), by loop and parallelism caps, and by per-request timeouts. A stop request is polled every 100 ms and checked between nodes and model calls. There is no token or cost cap in the community setup (team AI-point budgets only apply with subscription plans), in-flight tool calls finish after a stop, and Agent Sandbox containers stay up until the inactivity timeout (60 minutes by default).