Security questionnaire
For security reviewers.
In short
This page answers the questions most vendor security assessments ask, so your reviewer can fill in their questionnaire from evidence rather than from a sales call. Each answer is short and names where to check it: a claim on this site, a section of another deep dive, or a document we can send.
Some answers are “no” or “not yet”, and they are written as such. No external security audit or penetration test has been carried out, and CryptoRail holds no certification such as SOC 2 or ISO 27001. Self-hosted deployments and pilots are offered today; running CryptoRail for you in production waits for the external audit.
Most questions assume a vendor that runs a service for you. When CryptoRail is self-hosted, it runs in your infrastructure, over your database, with your keys and your monitoring, and we have no access to it. The picture below is the split of responsibilities that the answers follow.
flowchart LR
subgraph US[CryptoRail, the vendor]
P[The product: code, tests, journeys]
D[Dependency audit, pinned contracts]
S[The sandbox, never for value]
end
subgraph YOU[You, when self-hosted]
I[Infrastructure, network, TLS]
DB[(PostgreSQL: encryption at rest, backups, retention)]
K[Keys: HSM, cloud KMS or your signer]
M[Monitoring, alerting, incident response]
end
P -->|container image, configuration| I
I --> DB
I <-->|bytes to sign, signature| K
I -->|traces, metrics, logs| M
Governance and audits
| Question | Answer | Evidence |
|---|---|---|
| Has an independent security audit or penetration test been carried out? | No. One is required before CryptoRail is run for customers in production; its scope is written down. | Security model: what an external audit must cover |
| Do you hold SOC 2, ISO 27001 or another certification? | No, and none is on the roadmap today. | This page |
| Do you run a formal information security management system? | No. Security requirements are numbered, approved and tested (below); there is no certified management system around them. | The evidence page |
| Who is accountable for security? | The product owner. CryptoRail is built by a small team with no dedicated security function; security decisions are recorded with their date and their reason. | Architecture decision records |
| Are security requirements documented? | Yes: ten numbered security requirements among the product’s approved requirements, each covered by tests, plus decision records for custody and the deployment profiles. | ADR-0002, ADR-0004, ADR-0005, ADR-0006 |
| Is there a signed contract, licence or data processing agreement? | Not yet. The commercial licence is being written by a lawyer. | This page |
Every Must requirement has at least one automated test that names it, and a change is merged only with its tests, every check green and no loss of requirement coverage.
Access control and authentication
| Question | Answer | Evidence |
|---|---|---|
| How do clients authenticate? | API keys over HTTPS. A key has a 256-bit random secret; the database stores only a keyed hash under a pepper from your secret manager. | Security model: API keys under a pepper |
| Is single sign-on, OIDC or mutual TLS supported? | Not today. Both are built on request, beside API keys. | Below |
| Is access role-based? | Yes: read-only, submitter, signer, sponsor, operator and admin, checked on every call. | Below |
| How are credentials rotated and revoked? | Rotation with an overlap window, immediate revocation on every API process, and no way to lock a tenant out of its own administration. | Below |
| Are tenants isolated from each other? | Yes. Tenants share one database; every resource belongs to a tenant and a caller sees only its own, which a test over every route of the API proves on every change. | J44 |
| Do processes and database users follow least privilege? | Yes: each process has its own database role, and only the signing gate holds signer credentials. | Security model: database least privilege |
| Who at CryptoRail can access a self-hosted deployment? | Nobody. We have no account, no key and no network path into it. | Architecture |
| Is abuse of the API limited? | Rate limits per API key and quotas per tenant. | Below |
API keys are stored only as a keyed hash under a pepper kept in your secret manager, so whoever reads the database cannot call the API with what they find.
Authentication with mutual TLS or OIDC tokens, beside API keys. On request
Who may do what is checked per call: read-only, submitter, signer, sponsor, operator and admin roles.
An API key's secret is shown once when it is created; a rotation keeps the old key working through a configurable overlap, a revocation ends it at once on every API process, and a tenant's last admin key cannot be revoked.
A tenant sees only its own resources, proven on every route of the API on every change.
Each process has its own database role: the API cannot allocate a nonce, the worker cannot read API keys, the indexer cannot touch transactions, identities or signing requests, and no process can change the schema.
Rate limiting per API key, configurable, reported with standard rate-limit headers and a refusal that says when to come back.
Per-tenant limits set by the operator, with refusals that name the limit reached.
Cryptography and key management
| Question | Answer | Evidence |
|---|---|---|
| Where are signing keys generated and stored? | In your HSM, your cloud KMS or your own signer. CryptoRail sends the bytes to sign and receives a signature; it holds no key outside a sandbox. | Signing, custody and approvals |
| Which key stores are supported? | Your own signer through an inbox is available; HSMs over PKCS#11 and AWS KMS are built and tested, and are declared after a manual test on the real device or account. | Below |
| Is every signature checked? | Yes, against the expected address before anything is sent. | Below |
| Which algorithms are used? | ECDSA on secp256k1 for chain signatures and EIP-712 approvals; HMAC-SHA256 for API keys and webhook signatures; AES-256-GCM for the secrets CryptoRail seals. | Security model |
| How are application secrets stored? | By reference into your secret manager (environment, files or HashiCorp Vault); a literal secret in the configuration is refused at startup. | Security model: secrets by reference |
| Does the service terminate TLS? | No. The service speaks HTTP and binds to the local interface by default; TLS is terminated by your ingress or reverse proxy. Webhooks it sends must go to HTTPS addresses. | Configuration reference |
| Can a development key reach production? | The development signer warns at every start and refuses to load in production without an explicit override; a dependency check keeps key material in its package alone. | Below |
| When CryptoRail is run for you, can it hold a key? | No: that profile refuses at startup any key of its own. It is available for pilots, not yet for production. | Security model: three deployment profiles |
Keys never enter CryptoRail: signing happens in your HSM, your cloud KMS or your own signer, and only the development signer ever touches a key.
Your own signer keeps the key: CryptoRail prepares the exact bytes, your system signs them, CryptoRail verifies and broadcasts.
Keys in a hardware security module over PKCS#11 (Thales, Utimaco, Entrust, AWS CloudHSM): tested on every change against SoftHSM2, each vendor declared after a manual test on its device. Built, certification pending
Signing keys in AWS KMS, with the curve checked at startup. Built, certification pending
Every signature is checked against the expected address before anything is sent.
Secrets passed by reference and never written to logs, traces, metrics or responses.
A secret written into the configuration instead of a reference to your secret manager is refused at startup.
Each webhook endpoint gets a secret shown once, sealed at rest under a key from your secret manager, and rotated without a gap; endpoints must be HTTPS unless the deployment explicitly allows otherwise.
The development signer warns on every start and refuses to load in production unless an explicit override is set.
Only the development signer's package may touch key material, enforced by a dependency check on every change.
The hosted profile refuses to start if it is given a key of its own, listing every reason.
Data protection and retention
| Question | Answer | Evidence |
|---|---|---|
| What data does CryptoRail store? | Operations and their call data, addresses, the payloads it asks to have signed, signatures, events, deliveries, approvals and the audit log; API keys only as keyed hashes; webhook secrets sealed. No private key outside a sandbox. | Security model |
| Where is it stored? | In your PostgreSQL, when self-hosted. | Below |
| Is data encrypted at rest? | Not by CryptoRail, except webhook secrets and sandbox keys, which it seals. Encryption at rest is your database platform’s. | Security model: what it does not do |
| Does it process personal data? | It asks for none. Addresses and any metadata your systems attach are stored as sent; whether they are personal data in your jurisdiction is yours to assess. | This page |
| How long is data kept, and can it be deleted? | There is no built-in retention period or purge. History is kept, because it is the audit trail; offboarding a tenant stops new work and exports its history. Retention is set by whoever runs the database. | Offboarding runbook |
| Can data be exported for audit? | Yes, the complete history of any operation in a machine-readable file. | Below |
| Can secrets leak through logs or responses? | A redaction test over every log sink checks they do not. | Below |
Runs in your infrastructure, as a container image over your PostgreSQL, with schema migrations applied by an explicit command.
The complete history of any operation, exported in a machine-readable file for audit.
Logging and monitoring
| Question | Answer | Evidence |
|---|---|---|
| Are security-relevant actions logged? | Every mutating API call, including refused ones, lands in an audit log with who, when, what and the result; every approval and signature is recorded. | Below |
| Is the audit log tamper-evident? | No. It is stored in your database like the rest of the data, without cryptographic chaining; protecting it is your database’s access control. | This page |
| What telemetry is emitted, and where does it go? | Traces, metrics and structured JSON logs with trace ids, through OpenTelemetry, to the collector you configure. Nothing is sent to us. | Below |
| Is the full history of an operation available? | Yes: every transition and attempt, with its time and cause. | Below |
| Are anomalies alerted? | Yes, for example a signature by the wrong key, a nonce gap, a payer running low, a lagging indexer or a deep reorganisation; the alerts reach your monitoring. | The life of a transaction |
| Do health checks tell the truth? | Readiness reports storage, networks and the signing gate, and the configuration is checked at startup with every problem listed. | Below |
Every approval, signature and decision is recorded with who, when and what, and every change made through the API lands in an audit log.
Traces, metrics and structured logs through OpenTelemetry, into the monitoring tools you already run.
The full history of every operation, every transition and every attempt with its time and cause, can be queried.
The actual cost of every operation is recorded, and a payer running low on funds raises an alert before operations fail.
Health and readiness that tell the truth, and a configuration checked at startup with every problem listed at once.
Vulnerability and dependency management
| Question | Answer | Evidence |
|---|---|---|
| Are dependencies scanned for known vulnerabilities? | Yes, on every change; a high or critical finding blocks the release. | Below |
| Are dependency versions pinned? | Yes, by a committed lockfile installed exactly. | Below |
| Is a software bill of materials provided? | No, not today. | This page |
| Are container images scanned and signed? | Not yet. The per-customer release pipeline, with signed images in a scanning registry, is on the roadmap. | Below |
| Are the smart contracts it relies on pinned? | Yes: the account, paymaster and EntryPoint contracts are audited public code, pinned per network and checked against their code hash at every start. The validator used for on-chain approvals has an audit of an earlier version, not of the one deployed; a report or review of the exact version is required before production use. | Below, ADR-0003 |
| Is there a vulnerability disclosure policy? | Not a published one. Report a suspected vulnerability to the contact address on the pilot page. | This page |
| Is there a committed patch timeline? | No contractual timeline today. | This page |
Dependencies scanned on every change; a high or critical vulnerability blocks the release.
Every dependency version is fixed in a committed lockfile, and every build installs exactly that set.
Releases per customer: the service image signed with cosign and pushed to that customer's project of a private registry that scans it, and the npm packages and an image archive published with their checksums. On the roadmap
Only the canonical EntryPoint and public account and paymaster contracts from audited lineages, pinned per network; no custom contract.
Secure development and testing
| Question | Answer | Evidence |
|---|---|---|
| Is there a documented development process? | Yes: every change starts from an approved, numbered requirement and is merged through a pull request only when every automated check passes. | Above |
| Are changes reviewed? | Every change to the code runs the full check suite before merge. There is no mandatory second human reviewer of every change, as the team is small. | This page |
| Is security tested? | Yes, as requirements: key separation, signature verification, redaction, database roles, tenant isolation, webhook signatures and the deployment profiles each have tests and journeys. | Security model: evidence |
| Is static analysis used? | Strict TypeScript and type-aware linting on every change. No dedicated static security analysis or secret-scanning tool runs today. | This page |
| Are failure scenarios tested? | Yes: processes killed at each step, node outages, reorganisations, stuck and dropped transactions, against real local chains. | Incident response |
| Are tests run on real networks? | On local Anvil and Hyperledger Besu on every change, and on a public test network; never with real funds. | Below |
| Can behaviour be reviewed without reading code? | Yes: the journeys report shows each scenario step by step, failures included. | Pilot playbook |
Tested on every change to the code against Anvil and a Hyperledger Besu QBFT network, and run on public test networks by recorded manual procedures.
Every behaviour a consumer sees has a journey: a scenario run on every change whose HTML report shows, step by step, the request, the response, the resulting state, the events and, for a negative case, the failure report.
Deployment and network
| Question | Answer | Evidence |
|---|---|---|
| How is it deployed? | As a container image on your infrastructure over your PostgreSQL, or embedded as a library in your Node.js application. Schema changes are applied by an explicit command. | Below |
| Which ports are open? | Only the API process listens. The worker, the signing gate and the indexer open no port. | Security model: what each process can and cannot reach |
| Does the container run as root? | No: the image runs as an unprivileged user. | The Dockerfile |
| What does it connect to? | Your nodes or node provider over JSON-RPC, bundlers if you sponsor gas, your webhook receivers, your signer and your secret manager. | Architecture: what talks to what |
| Can the signing path be isolated? | Yes: in a split deployment the signing gate is its own process, the only one with signer credentials, and the API process builds no signer. | Below |
| Does a misconfiguration fail safe? | Yes: a production deployment refuses to start with authentication but no pepper, or without a webhook encryption key, and a deployment profile refuses what it does not admit. | Below |
| How are policy changes controlled? | A policy change is a new version that can wait for a quorum of approvers. | Below |
Embedded as a library in your Node.js application, or run as a service with an HTTP API described in OpenAPI and generated SDKs.
One process, or separate API, worker, signing gate and indexer processes sharing only the database, each with a database role limited to what it needs.
In a split deployment the signing gate is a process of its own, the only one with signer credentials: it reaches the database and your signer and nothing else, and re-checks every request before it signs.
The API process builds no signer, and a split deployment that configures one for it is refused at startup.
A production deployment refuses to start with authentication on but no pepper, or without a webhook encryption key, rather than pretend to a protection it lacks.
A change to a tenant's policy is a new version that can be made to wait for a quorum of named approvers, required by default when CryptoRail is run for you; every proposal, approval and activation is recorded.
A sandbox says it is one: in its logs, on its health endpoint and on every screen built over it. It is never supported for value.
Incident response and business continuity
| Question | Answer | Evidence |
|---|---|---|
| Do you provide incident response for self-hosted deployments? | No. You operate it; runbooks for the common situations (a stuck transaction, a lagging indexer, a dead-lettered delivery, the signing gate down, key rotation) ship with the documentation. | Runbooks |
| Is there a support SLA or 24/7 on-call? | No. | This page |
| Will you notify us of a security incident? | No contractual commitment exists yet; it belongs in the licence being written. | This page |
| What happens if a process crashes? | An acknowledged operation is never lost; a stopping process finishes what it can in a grace period and the rest resumes on restart. | Below |
| What if a node or provider fails? | Several endpoints per network, with failover. | Below |
| Can it run highly available? | Several workers and several API processes on one database, without sending anything twice. | Below |
| Can activity be stopped quickly? | Yes: an operator can pause an identity; new operations wait without being sent. | Below |
| Who backs up the data? | You, through your PostgreSQL. Recovery point and recovery time are your platform’s. | The deployment plan’s checklist, in the customer portal |
| How available is the sandbox? | It runs on a single server of ours, with no availability commitment. It is a sandbox, never for value. | Pilot playbook |
An operation CryptoRail has acknowledged is never lost: not across crashes and restarts, not through a node outage of up to ten minutes.
A stopping process finishes its broadcasts and deliveries in flight within a grace period, and whatever it could not finish is picked up again on restart.
Several node endpoints per network: calls go to the first healthy one, an operation stays on the endpoint it started on, and a dead or lagging node is left aside without losing anything.
Several workers on the same database without sending anything twice.
An identity can be paused: new operations are accepted and wait without taking a nonce until it is resumed.
An operator command line for the daily work: pause an identity, redeliver a webhook, reconcile nonces, export a history, onboard a tenant.
Third parties
| Question | Answer | Evidence |
|---|---|---|
| Which third parties process our data when self-hosted? | None on our side. The service sends nothing to us. It talks to the node providers and bundlers you choose. | Architecture |
| Which open-source components does it rely on? | npm dependencies under the dependency audit, and the audited, pinned on-chain contracts above. | Above |
| Who hosts the sandbox? | We do, on our own server, over public test networks and public test-network RPC providers. It is a sandbox, never for value. | Pilot playbook |
| Are other custody providers supported? | Azure Key Vault, Google Cloud KMS and Fireblocks are built on request. | Below |
| Can a licence problem stop our system? | No licence check exists today. The planned one warns and never stops a running system. | Below |
Works with your own nodes or a provider's, through standard Ethereum JSON-RPC over plain HTTP.
Signing with Azure Key Vault or GCP Cloud KMS, or through Fireblocks. On request
A licence file signed per customer and verified locally at startup, which warns with a grace period and never stops a running system. On the roadmap
What it does not do
- It has not been audited externally or certified. The tests, the journeys and the requirements are the evidence today.
- It does not encrypt your operational data at rest, keep a tamper-evident audit log, or purge data on a schedule; those are your database platform’s.
- It does not terminate TLS or authenticate with SSO, OIDC or mutual TLS today.
- It comes with no incident response service, support SLA or breach notification commitment for self-hosted deployments yet.
- It does not publish a software bill of materials or a vulnerability disclosure policy yet.
- Custody of your end customers' keys. Not supported
Evidence
Every claim above links to its evidence on the evidence page. The main ones:
| Subject | Requirements and decisions | Journeys |
|---|---|---|
| Keys out of CryptoRail, verification, development signer | NFR-SEC-01, NFR-SEC-02, FR-SIG-09, FR-SIG-14 | J12 |
| Authentication, roles, rotation, rate limits, tenancy | FR-API-04, FR-API-05, FR-API-06, FR-API-13, FR-API-16, ADR-0002 | J26, J27, J44 |
| Secrets, redaction, webhooks | FR-OPS-03, NFR-SEC-03, NFR-SEC-04, FR-EVT-09, ADR-0004 | J18, J34 |
| Process roles, signing gate, database least privilege | FR-OPS-04, NFR-SEC-06, FR-APR-07, ADR-0006 | J27, J38, J49 |
| Deployment profiles | NFR-SEC-07, NFR-SEC-10, ADR-0005 | J42, J43 |
| Audit log, history, export, observability | FR-API-14, FR-TX-18, FR-OPS-07, NFR-OBS-01, NFR-OBS-04 | J19, J45 |
| Dependencies, pinned contracts | NFR-SEC-05, NFR-SEC-09, ADR-0003 | |
| Testing discipline | NFR-QA-01, NFR-QA-06, NFR-QA-07, NFR-REL-01 | J15 |
| Policy changes | FR-POL-09 | J65 |
| Releases and licence (planned) | FR-OPS-09, FR-OPS-10 |