We hold your OAuth tokens.
Here's what we do with them.
Arteros is the runtime that AI agents use to act on your customer systems — HubSpot, Gmail, Notion, Stripe, AWS, and so on. We hold the OAuth tokens that let them. We take that responsibility seriously, and we'd rather tell you what we do and don't do than ask you to trust a logo wall.
This page is the current honest state of our security posture. It includes what we haven't built yet and what's on the roadmap. We update it when something ships, not when something is decided.
How we think about it
Three principles drive everything below.
No single layer can be the only thing standing between your data and an attacker. Auth, tenant isolation, encryption, and observability all backstop each other.
A trust page that claims everything is solved is selling you fiction. The gaps section is real and the items there are tracked publicly.
When a runtime that holds many customers' OAuth tokens is compromised, the blast radius is everyone's upstream systems. We design assuming a sophisticated attacker eventually probes us, and we treat public incidents in our space — like Composio's November 2025 breach — as information about our own threat model.
Tenant isolation
Arteros is multi-tenant. Every record in our database belongs to exactly one organization, and every read or write of that data passes through a per-tenant data accessor that hard-binds the tenant ID at the SQL WHERE clause.
organization_id column with cascade-on-delete and an index. Caches use a composite unique index on (organization_id, cache_key) so two tenants can compute the same cache key without ever colliding in storage.OrgScoped wrapper. The wrapper is constructed with an org ID at request time and inserts that ID into every query. Pinned by an automated regression test that walks the repo and fails CI if any production file imports a tenant-scoped schema table and queries it directly.Credential storage
When you connect HubSpot, Gmail, or any upstream, the OAuth access and refresh tokens are encrypted with AES-256-GCM before they hit the database. The encryption key never appears in any log, response, or error message.
*.token, *.accessToken, *.refreshToken, *.password, *.apiKey and their variants, recursively to depth 3. A regression test asserts that no token-shaped string ever escapes the redaction layer.Auth and access control
magicLink, emailOTP, or any passwordless plugin — magic-link auth turns your email account into a master key for ours, which was the Composio entry vector.Adapter safety
Every third-party API Arteros talks to has an adapter. Adapters are the most likely place for an injection bug, so we hold them to a specific standard:
child_process, eval, new Function, filesystem write operations, or templating libraries.new URL() and encodeURIComponent for every interpolated path or query segment. Adapter inputs are validated by Zod schemas with concrete format constraints — bucket names match S3 naming rules, region codes match AWS region format — so attacker-supplied metacharacters can't break out of the intended host or path. SSRF regression tests run every adapter's input validators against a corpus of host- and path-injection payloads.Audit logging and observability
Every credential read, every connection create / revoke / rename, every plan execution is written to an immutable audit_events table with the actor, the target, and the action. Structured logs are JSON, level-controlled, and emitted to Railway's log infrastructure with PII redaction.
Vulnerability disclosure
We want to hear about it. If you find a security issue in Arteros:
We commit to:
- Acknowledging your report within one business day.
- Treating reports in good faith — we won't pursue legal action against research conducted in line with this policy.
- Coordinated disclosure: we'll work with you on a fix timeline and credit you in the changelog if you'd like to be named.
A formal bug bounty programme is on our roadmap. Until it launches, we will acknowledge significant reports with a public thank-you and (where appropriate) a discretionary reward.
The Composio incident — what we did
In November 2025, Composio — a SaaS gateway in our space — disclosed a breach in which an attacker chained a compromised Gmail OAuth account, a magic-link sign-in on a staging environment, lateral movement to production, and access to customer OAuth tokens. The public post-mortem includes 24 attacker IP addresses and root-cause notes that map cleanly onto categories every runtime in this space should review.
What we did within 72 hours:
- Reviewed every category against our own architecture. Where Composio's exact mechanism didn't apply to us (we have no API keys, no separate staging environment), we wrote that down and accepted the framing. Where it did apply (encryption key custody, founder MFA, adapter injection), we treated it as immediate work.
- Shipped a critical fix. The S3 bucket and region fields in our AWS adapter were unconstrained strings interpolated into the URL host — exactly the URL-injection / SSRF shape that the Composio CVE-2024-8864/65 advisories warned about. We added format validation across 43 input fields and shipped 299 regression tests in
packages/services/src/aws/ssrf.test.ts. - Hardened operator accounts. Hardware MFA + magic-link disable across every credential-bearing account.
- Documented honestly. Every gap surfaced by the review is on this page as an "Honest gap" with what we're doing about it.
- IOC sweep. Cross-checking our edge logs against the published attacker IP list. Results will be reflected here.
We will keep updating this page as we ship.
Questions, concerns, or you spotted something we got wrong?
We answer security mail within one business day.