AgentRaaS

Security Policy

AgentRaaS sits between AI agents and real-world services — it stores encrypted credentials (Stripe, Twilio, and similar) on behalf of the people running it. We take security reports seriously and would rather hear about a problem privately, with time to fix it, than have it show up as a public GitHub issue.

Reporting a vulnerability

Do not open a public GitHub issue for security vulnerabilities.

Instead, email support@agentraas.io with:

We'll acknowledge your report within 5 business days and aim to have a fix or mitigation plan within 30 days for confirmed issues, sooner for anything critical (auth bypass, credential exposure, remote code execution).

Scope

In scope:

Out of scope:

How AgentRaaS protects what it holds

This section describes the mechanisms as they are in the code today, including the known gaps. File references are to src/api-gateway-rs/.

Outbound requests (SSRF)

Every URL AgentRaaS will call on someone's behalf (custom actions, MCP servers, notification webhooks, inbound-webhook destinations) goes through validate_target_url (crates/api/src/util.rs):

The same guard covers SSO: the issuer URL an org admin enters, and the token and JWKS endpoints its discovery document names, are checked before the server calls them. Slack approval callbacks are only sent to https://hooks.slack.com/.

The check runs when a URL is registered and again on every forward (crates/api/src/agent/forward.rs), so a DNS record changed after registration is caught on the next call. The shared HTTP client never follows redirects, so a destination cannot 302 the gateway to an internal address.

The shared HTTP client also uses its own DNS resolver that drops private and reserved addresses at connect time, so a name that resolved public for the check can't rebind to an internal address for the real request (DNS rebinding). Only localhost, which user-supplied URLs can't name, is exempt, for the built-in demo service.

Secrets at rest

Duplicate suppression under concurrency (Redis)

Network exposure

The compose files bind Postgres, Redis and MinIO to 127.0.0.1 only. The client IP for rate limiting comes only from the header named in CLIENT_IP_HEADER (set it to the header your proxy writes, e.g. cf-connecting-ip); X-Forwarded-For is never trusted. /metrics is off unless METRICS_TOKEN is set and then requires it as a bearer token. Every response carries X-Frame-Options: DENY (the dashboard can't be framed for clickjacking), X-Content-Type-Options: nosniff and a strict Referrer-Policy; production adds HSTS. Since 0.11.0 there is a Content-Security-Policy: scripts, styles, frames and outgoing requests only from this origin and the few hosts the pages use (Paddle, Google Fonts, analytics), no plugins, no <base> override, no framing. No inline scripts (since 0.12.0): every page loads its JavaScript from /js/, so markup injected into a page can't run code. Inline style attributes are still allowed.

Every way in gets the same checks

Webhook, SDK-style REST and MCP tool calls all pass through action policies, spend caps, validation, dedup, the circuit breaker and usage limits. Over MCP, a rule that would send a call for human approval blocks it instead (an MCP client waits for its answer), so it never runs unapproved.

Disclosure

We ask for a reasonable window to fix a confirmed vulnerability before any public disclosure. We're happy to credit reporters (by name or handle) in the fix's release notes, if you'd like that.

Supported versions

AgentRaaS is under active development; only the latest commit on main is supported with security fixes at this stage.