Arachne docs Home Open app

Help

Security & data handling

How Arachne isolates tenants, sandboxes fix jobs, stores and protects tokens, and records an audit trail, and the limits it has today.

Tenant isolation#

The fix-job sandbox and egress#

Fix jobs never run in the API or worker Lambdas. Each job is one CodeBuild build:

  1. The worker Lambda claims the job and starts the build with only three values: tenant id, job id and lease owner. No credential is passed.
  2. The build starts its own Docker daemon, an --internal Docker network with no route out, and an allowlisting forward proxy attached to both that network and the outside.
  3. The job runner (orchestrator) refuses to run as root, clones the repository anonymously, and runs every install, build and test step in toolchain containers on the internal network, as an unprivileged user.
  4. The containers can reach only the package registries on the proxy's allowlist (exact host match: npm, PyPI, Maven Central, crates.io, RubyGems, NuGet, Packagist, the Go proxy, GitHub for git dependencies, Meteor). The proxy refuses link-local, loopback and other reserved addresses whatever a name resolves to, which blocks the cloud metadata and container-credential endpoints.
  5. The result is written back through the same storage ports, and the job runs only while it still holds the dispatcher's lease, so a late duplicate build does nothing.

Pushing the branch and opening the PR happen later, in the API, only for an approved verified job, and only with the reviewed file map.

What is stored#

DataWhereNotes
Account: email, display name, identity provider subjectDynamoDBEmail must be verified to sign in.
Organisations, memberships, rolesDynamoDB
Projects: name, owner/name, settingsDynamoDBNo source code.
Dependency inventory and findingsDynamoDBPackage names, versions, advisory ids.
Jobs and evidenceDynamoDBPlan, gate results with short log tails, the diff of changed dependency files.
Usage ledgerDynamoDBKeyed by salted hashes of your email and identity, so usage follows a person across accounts.
MCP tokensDynamoDBSHA-256 hash, label, created / last used / revoked times. Never the token.
Audit logDynamoDBHash-chained, append-only.

DynamoDB point-in-time recovery is enabled. Repository working copies exist only in temporary directories for the duration of a scan or job.

Tokens#

Audit log#

Security-relevant actions are appended to a hash-chained audit log: project changes, job submissions, approvals and rejections, PR openings, MCP token creation and revocation, every MCP tool call (with its arguments, after validation) and every denied call. MCP calls are chained per person. Arguments are validated before they are audited, so oversized or malformed input is never persisted.

Request protection#

Honest limits#

Known gaps

  • The egress proxy is not exfiltration-proof. It sees only host:port (HTTPS CONNECT), so code running during an install that holds its own credential could still push data to an allowed host such as github.com or a package registry. Closing this needs TLS inspection.
  • The fix-job build runs on one shared role. Per-job, tenant-scoped build credentials are designed but not built; the build container (not the sandbox containers) can reach the application tables.
  • No S3 evidence store or audit anchor yet. The audit chain is not yet anchored to Object Lock storage, and very large job results cannot be offloaded.
  • Tokens do not expire; rotation is up to you.
  • No MFA on the Cognito user pool yet, and email/password is the only sign-in method.
  • Cognito's built-in email sender is rate limited (about 50 emails a day account-wide) until SES is configured, which can delay verification codes.

Found a security issue? Please report it privately to the project owner rather than opening a public issue.