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: 0 and privateKeysUsed: 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, --authorized and 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:

  1. assess an explicitly selected HTTP(S) target without moving funds;
  2. never accept or transmit a caller-provided PAYMENT-SIGNATURE;
  3. prevent a modified assessment config from exfiltrating CI secrets;
  4. avoid persisting credentials or response bodies in evidence;
  5. distinguish passive observation from authorized active probing;
  6. make post-generation report modification detectable;
  7. 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.

Assets and trust boundaries
AssetBoundaryMain risk
CI tokens and custom headersconfig and process → remote hostExfiltration
x402 payment requirementsremote host → parserMalformed or hostile input
Authorization referenceoperator → reportMissing accountability
Reports and attestationsscanner → artifact store → recipientTampering or accidental secrets
Evidence signing keysigner's machine or CI secret storeTheft, then forged attestations
Dependency graphregistry → buildSupply-chain compromise
Assessed endpointscanner → networkUnauthorized or excessive traffic

Threats and controls

Threats and the controls that address them
ThreatControl
A real payment is sent by accidentA 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 hostCustom headers go only to hosts listed outside the config (SETTLENS_ALLOWED_HOSTS or the Action's allowed-hosts input).
Credentials leak into evidenceReports 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 hostRequests use manual redirect handling and never follow a Location header.
Hostile or oversized payment dataHeader 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 signatureThe authorized invalid-signature probe must stay denied; a 2xx answer is a critical finding.
Payment terms are swapped or driftExact resource.url binding, policy checks and repeated-sample comparison.
A facilitator accepts a forged signatureUnder authorization, the invalid payload is posted to /verify, which must answer isValid: false.
A report is edited after the factCanonical 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 toolsDestinations 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 endpointPOST 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 driftExact dependency versions from the lockfile, install scripts disabled, actions pinned to commit SHAs, container base pinned by digest.
Container privilege abuseThe 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. attestedAt comes 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/curves 2.2.0, @noble/hashes 2.2.0, @x402/core 2.28.0, nodemailer 10.1.1, proper-lockfile 4.1.2. Their own dependencies are locked in package-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 the node user.
  • 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

  1. RFC 9116: A File Format to Aid in Security Vulnerability DisclosureIETF · rfc-editor.org
  2. Secure use reference (pin actions to a full-length commit SHA)GitHub Docs · docs.github.com

Last updated