Documentation menu
Security model
How Settlens protects the systems it assesses and the secrets it is given, the risks that remain, and how to report a vulnerability.
In short
Settlens has no custody: it holds no funds, wallet or payment key, never calls /settle, and the only signature it sends is a deliberately invalid one, under explicit authorization. Custom headers reach allowlisted hosts only, and their values never appear in reports. Report vulnerabilities to contact@settlens.com.
On this page
Settlens is a security tool, so its own behavior has to be easy to check. It is read-only by design: it holds no funds, no wallet and no payment key, it never signs or settles a payment, and it is not a blockchain and has no token. This page lists the guarantees, the threats they answer, what remains, and how to report a problem. For how assessments are performed, see the methodology.
Guarantees
- No custody, no payment keys. No command needs a wallet or a payment key. Every report records
settlementCalls: 0andprivateKeysUsed: 0. The only key Settlens handles is your own optional evidence signing key, generated and used locally. - No payments. Passive scans never send
PAYMENT-SIGNATURE. The authorized active probe sends one signature that cannot be valid. Nothing calls a facilitator's/settle. - Explicit consent for active traffic. The probe needs
--active,--authorizedand an--authorization-ref, and is not available through the GitHub Action, Monitor, the HTTP API or the MCP server. - Secrets stay where you put them. Custom headers reach only allowlisted hosts and are never written to reports.
- Evidence is checkable. Reports carry a SHA-256 digest; attestations carry an ed25519 signature; both verify offline.
Security objectives
Settlens must:
- assess an explicitly selected HTTP(S) target without moving funds;
- never accept or transmit a caller-provided
PAYMENT-SIGNATURE; - prevent a modified assessment config from exfiltrating CI secrets;
- avoid persisting credentials or response bodies in evidence;
- distinguish passive observation from authorized active probing;
- make post-generation report modification detectable;
- fail CI deterministically when findings meet the selected severity.
Trust boundaries
The resource server, the facilitator, DNS, TLS termination, the CI runner and the artifact store are independent trust domains. Settlens does not assume that a resource server and the facilitator it names are run by the same party.
| Asset | Boundary | Main risk |
|---|---|---|
| CI tokens and custom headers | config and process → remote host | Exfiltration |
| x402 payment requirements | remote host → parser | Malformed or hostile input |
| Authorization reference | operator → report | Missing accountability |
| Reports and attestations | scanner → artifact store → recipient | Tampering or accidental secrets |
| Evidence signing key | signer's machine or CI secret store | Theft, then forged attestations |
| Dependency graph | registry → build | Supply-chain compromise |
| Assessed endpoint | scanner → network | Unauthorized or excessive traffic |
Threats and controls
| Threat | Control |
|---|---|
| A real payment is sent by accident | A PAYMENT-SIGNATURE supplied in options or config is refused. The only signature Settlens ever sends is the synthetic invalid one of the authorized probe. /settle is never called. |
| A modified config forwards CI secrets to a new host | Custom headers go only to hosts listed outside the config (SETTLENS_ALLOWED_HOSTS or the Action's allowed-hosts input). |
| Credentials leak into evidence | Reports keep header names, not values; URLs with credentials are refused; common secret query values are redacted; response bodies are hashed, not stored. |
| A redirect sends the request to an attacker's host | Requests use manual redirect handling and never follow a Location header. |
| Hostile or oversized payment data | Header size limit, Base64 and JSON validation, the official SDK parser, a request timeout and a 1 MiB cap on bodies read. |
| A resource unlocks for any signature | The authorized invalid-signature probe must stay denied; a 2xx answer is a critical finding. |
| Payment terms are swapped or drift | Exact resource.url binding, policy checks and repeated-sample comparison. |
| A facilitator accepts a forged signature | Under authorization, the invalid payload is posted to /verify, which must answer isValid: false. |
| A report is edited after the fact | Canonical JSON plus a SHA-256 digest, checked by verify-report; optional ed25519 attestation by evidence attest. |
| Server-side request forgery through the hosted scan API or remote MCP tools | Destinations must be public, on ports 80 and 443 only: no local names, no private, loopback, link-local, CGNAT, reserved or documentation addresses, checked on the literal and on every DNS answer. Both interfaces require a bearer token. |
| Abuse of the remote MCP endpoint | POST only, JSON only, 256 KiB body cap, an allowlist for browser Origins and a per-IP rate limit (60 requests per minute, each batch entry counted as one request). |
| Dependency or action drift | Exact dependency versions from the lockfile, install scripts disabled, actions pinned to commit SHAs, container base pinned by digest. |
| Container privilege abuse | The image runs as the unprivileged node user, with npm and npx removed from the runtime. |
Residual risks
- A report digest detects changes but does not identify the author. An attestation identifies a key, not a person: its value depends on comparing the public key with one the signer published.
attestedAtcomes from the signer's clock. - The hosted scan API and remote MCP tools check DNS before connecting, and the HTTP client resolves again when it connects. That window is accepted because these interfaces are authenticated, passive and follow no redirects.
- A compromised CI runner can read the secrets already granted to that job.
- DNS and TLS trust are delegated to the platform running Settlens.
- Passive samples cannot exercise every server-side code path.
- The active probe tests one invalid payload class, not every way a signature can be wrong.
- Rate limiting and multi-tenant isolation are properties of the assessed service that a few samples cannot establish.
Supply chain
- 5 direct runtime dependencies, at exact versions:
@noble/curves2.2.0,@noble/hashes2.2.0,@x402/core2.28.0,nodemailer10.1.1,proper-lockfile4.1.2. Their own dependencies are locked inpackage-lock.json; everything else uses the Node.js standard library. - Installs use the lockfile with install scripts disabled (
npm ci --ignore-scripts). - The GitHub Action and the repository's CI pin third-party actions to full commit SHAs.
- The container image starts from a digest-pinned
node:24-alpine, installs production dependencies only, removes npm and npx, and runs as thenodeuser. - The code is in a private repository; pilot participants receive access. Settlens is not distributed through npm.
Safe testing rules
- Assess only endpoints you own or are allowed in writing to test.
- Use testnet assets and synthetic data.
- Record the approval for any active run in
--authorization-ref. - Never use Settlens for denial of service, credential testing, settlement, transaction replay or fund movement.
Report a vulnerability
Email contact@settlens.com. Please do not open a public issue or post details that contain an exploit, credential, customer URL or payment payload. Include:
- the affected version or commit (
settlens --version); - the smallest example that reproduces the problem;
- impact and preconditions;
- whether real funds, keys or customer systems were involved;
- how to reach you for coordinated follow-up.
Never send secrets
Do not include private keys, bearer tokens, real PAYMENT-SIGNATURE values or unredacted customer data in a report. Describe them instead; we will ask for what we need through a safe channel.
Operating targets, not contractual commitments: acknowledgement within two business days, an initial severity assessment within five business days, a mitigation target of seven calendar days for critical issues, and a disclosure date agreed with the reporter. Security fixes are made on the latest release line. The site also publishes this contact in security.txt, and the security page summarizes our practices.
Questions
Can Settlens move funds or sign a payment?
No. It has no wallet and uses no private key for payments, the only signature it ever sends is a deliberately invalid one under explicit authorization, and it never calls /settle.
Does Settlens see my API keys or tokens?
Only those you pass as custom headers for a scan, and only to send them to hosts you allowlisted. Their values are never written to reports, state files or attestations.
Where do I report a security problem?
By email to contact@settlens.com, with the version, a minimal reproduction and the impact, and without secrets or customer data.
Sources
Last updated