Skip to content
Quantix Security Labs

Northstar Custody

Infrastructure Security Review of Northstar Custody, a custody protocol on Ethereum, Solana covered by Quantix Protocol Research. MPC signing nodes (Rust), policy engine (Go), client API and approvals console (TypeScript), and their deployment configuration, for Ethereum (ECDSA) and Solana (Ed25519) signing. 13,930 nSLOC plus infrastructure configuration.
ResearchPublishedQX-TSA-2026-011 · v1.1

Risk summary

State at remediation commit c27e05a9b3f1

Findings
8
Critical and high
1
Open or partial
0
Remediation
100%

Findings by severity

  • Critical0
  • High1
  • Medium4
  • Low2
  • Informational1

Remediation statusAnalysis

  • Resolved7
  • Partially resolved0
  • Acknowledged1
  • Open0

Northstar Custody

Custody

Document
QX-TSA-2026-011 · v1.1
Type
Infrastructure Security Review
Review
13 Jul 2026 – 14 Aug 2026
Published
18 Sept 2026
Ecosystems
EthereumSolana
Languages
Rust, Go, TypeScript
Risk Index
AAA90.9
Assessment contents · 12 sections

01

Assessment overview

Northstar Custody is an institutional custody platform. Private keys are never assembled: key shares are held by isolated MPC signing nodes, and every transaction must pass a policy engine (whitelists, velocity limits and approval quorums) before the nodes sign. Clients submit requests through an API and approve them in a web console with hardware security keys.

Quantix reviewed the signing nodes, policy engine, client API, approvals console and deployment configuration, and ran an authorised penetration test against the staging environment. The most significant finding was a quorum bypass in the policy engine: approvals were attributed to the approver named in the request body rather than to the authenticated WebAuthn session, so one approver could record approvals on behalf of others.

Four medium-severity findings concerned a time-of-check to time-of-use gap between policy evaluation and signing, signing nodes trusting the digest supplied by the coordinator, decommissioned nodes keeping valid key shares, and replayable API requests. Low-severity findings covered a webhook secret exposed in URLs and per-asset velocity limits.

All high and medium findings were fixed and verified at the remediation commit. One low-severity finding about aggregate velocity limits is acknowledged and handled through a planned policy feature. The platform's design, with independent digest reconstruction on every node after remediation, gives strong assurance that a single compromised component cannot cause an unauthorised signature.

02

Technical analysis: protocol architecture

A client creates a transaction request through the API, authenticated with an API key and an HMAC request signature. The policy engine evaluates the request against the client's policy and, where required, opens an approval round. Approvers review the decoded transaction in the console and approve with a WebAuthn assertion from a hardware key.

When the quorum is met the policy engine issues a signed authorisation. A coordinator schedules a signing session across the MPC nodes, which run a threshold protocol (ECDSA for Ethereum, Ed25519 for Solana) and return a signature that the API broadcasts. Nodes run in separate regions and accounts with distinct operators.

Trusted· 2

Assumed to behave as specified; compromise is out of the threat model.

  • MPC signing nodesHold key shares and run threshold signing
  • Policy engineEvaluates policy and issues signing authorisations
trust boundary

Semi-trusted· 4

Trusted for liveness or within bounds; misbehaviour is partly modelled.

  • Signing coordinatorSchedules sessions and relays protocol messages
  • Client APIRequest intake, authentication and webhooks
  • Approvals consoleHuman approval with hardware keys
  • ApproversClient staff approving transactions
trust boundary

Untrusted· 1

May act adversarially; every input is validated.

  • Client systems and networkCallers of the API
Components grouped by trust level. Calls that cross a trust boundary are where the review concentrated input validation and authorisation checks.

Trust assumptions

  • Fewer than the signing threshold of node operators collude or are compromised.
  • Approvers' hardware keys are not all compromised at once; individual approvers may act maliciously.
  • The threshold-signature library implements its protocol correctly.
  • Clients configure policies appropriate to their risk (see NC-07).

03

Scope

MPC signing nodes (Rust), policy engine (Go), client API and approvals console (TypeScript), and their deployment configuration, for Ethereum (ECDSA) and Solana (Ed25519) signing. 13,930 nSLOC plus infrastructure configuration.

Repository
github.com/example-org/northstar-platform
Review effort
Four reviewers over twenty-five working days, including an authorised penetration test of the staging environment
Reviewed commit
9d4b17e0c2a6f83b5e1d0a7c94f26b8e3a0c5d71
Remediation commit
c27e05a9b3f18d64e0a2c7b95d13f86a4e9b0c38
Files and components in scope
PathDescriptionnSLOC
services/signerMPC signing node: session handling, digest construction, key-share storage and refresh (Rust)4,120
services/policyPolicy evaluation: whitelists, velocity limits, approval quorums (Go)3,560
services/apiClient API: request authentication, transaction requests, webhooks (TypeScript)2,940
apps/consoleApprovals console with WebAuthn hardware-key approvals (TypeScript)3,310
deployTerraform and Kubernetes configuration for staging and production–
Total5 items13,930

Out of scope

  • The third-party threshold-signature library used by the signing nodes (treated as correct; its integration was in scope)
  • HSM firmware and the physical security of signing-node hosts
  • Individual clients' policy configurations
  • Chain RPC providers

04

Threat model

Each threat lists the actor, the vector and the mitigation, and links to the findings that realised it in the reviewed code.

Assets at risk

  • Key shares
  • Signing authorisations
  • Client policies
  • Approver sessions
  • API credentials and webhook secrets

Actors

  • Malicious approverSemi-trustedHolds one valid approver account and hardware key
  • Compromised coordinatorSemi-trustedControls session scheduling and message relay
  • Network attackerUntrustedObserves or replays client traffic
  • Former node operatorUntrustedRetains material from a decommissioned node
  • Insider with log accessSemi-trustedReads proxy and application logs
Threats, vectors, mitigations and related findings
ThreatActorVectorMitigationFindings
Meet a quorum with fewer real approversMalicious approverApprover identity taken from request bodyBind approvals to the WebAuthn sessionNC-01
Sign to an address removed from the whitelistMalicious approverPolicy evaluated only at request timeRe-evaluate at authorisation timeNC-02
Obtain a signature on a different transactionCompromised coordinatorNodes sign the relayed digestNodes rebuild the digest and verify the authorisationNC-03
Combine an old share with current sharesFormer node operatorNo refresh on decommissionRefresh shares on membership changeNC-04
Duplicate a transaction requestNetwork attackerHMAC without timestamp or nonceTimestamp, nonce and idempotency keysNC-05
Forge webhooksInsider with log accessSecret in URL querySecret in request body, shown onceNC-06

05

Findings

Severity

8 findings

NC-01HighResolvedAccess control

Approval quorum attributes approvals to the approver named in the request body

services/policy/approvals/handler.go:L74–L121 (RecordApproval)

Likelihood
Medium
Impact
High
Weakness
CWE-639
Description

The console posts approvals to the policy engine as JSON containing request_id, approver_id and the WebAuthn assertion. RecordApproval verifies the assertion against the session's registered credential, then stores the approval under body.ApproverID. The verified credential is never compared with approver_id.

An approver can therefore submit their own valid assertion several times with different approver_id values. Each one is stored as a distinct approval, and the quorum check counts distinct approver_ids, so a 3-of-5 policy can be satisfied by one person.

The researcher programme for Northstar lists this outcome as high severity. It does not by itself allow signing outside policy, because whitelists and limits still apply, but quorum is the main control for large or unusual transfers.

Preconditions
  • A valid approver account with a registered hardware key.
  • Knowledge of other approvers' IDs, which the console shows in the approval list.
Exploit scenario
  1. 1.A malicious approver creates or waits for a large transfer to a whitelisted address that requires three approvals.
  2. 2.They approve once in the console, then replay the request three times with the IDs of two colleagues, reusing a fresh assertion from their own key each time.
  3. 3.The policy engine records three approvals and issues a signing authorisation.
Impact

A single approver can authorise transactions that require several, defeating separation of duties.

Recommendation

Derive the approver identity from the authenticated session and the credential verified in the assertion; ignore any identity in the request body. Include the request ID and transaction digest in the WebAuthn challenge.

Fix
services/policy/approvals/handler.go (remediation commit)diff
-    cred, err := h.webauthn.Verify(sess, body.Assertion)+    cred, err := h.webauthn.Verify(sess, body.Assertion, challengeFor(body.RequestID, req.Digest))     if err != nil {         return ErrBadAssertion     }-    return h.store.AddApproval(body.RequestID, body.ApproverID)+    approver, err := h.users.ByCredential(cred.ID)+    if err != nil || approver.ID != sess.UserID {+        return ErrApproverMismatch+    }+    return h.store.AddApproval(body.RequestID, approver.ID)
Resolution

Fixed and verified. The approver is resolved from the verified credential and must match the session; the challenge binds the request and digest. Property P3 holds on the remediated model.

NC-02MediumResolvedBusiness logic

Policy is evaluated at request time and not re-evaluated before signing

services/policy/engine/evaluate.go:L38–L96, services/policy/authorise.go:L22–L58

Likelihood
Low
Impact
High
Weakness
CWE-367
Description

The policy engine evaluates whitelists and velocity limits when a request is created and stores the result. When the quorum is later reached, Authorise issues the signing authorisation based on that stored result. Approval rounds can stay open for days.

If a client removes an address from its whitelist, or lowers a limit, during that window (typically because the address is believed to be compromised), the pending request is still signed. Velocity limits are similarly checked against usage at creation time, so several requests created together can each pass and together exceed the limit.

Preconditions
  • A pending request created before a policy change, or several concurrent requests near a limit.
Exploit scenario
  1. 1.An attacker who controls a whitelisted counterparty address creates a request to it.
  2. 2.The client learns of the compromise and removes the address from its whitelist.
  3. 3.Approvers who have not noticed the change complete the quorum, and the transaction is signed to the removed address.
Impact

Transfers to addresses the client has explicitly removed, or beyond velocity limits.

Recommendation

Re-evaluate the full policy, against current usage, inside Authorise and reserve velocity usage atomically when the authorisation is issued.

Fix
services/policy/authorise.go (remediation commit)diff
  func (e *Engine) Authorise(ctx context.Context, req *Request) (*Authorisation, error) {-     if req.Evaluation.Allowed && e.quorumMet(req) {-         return e.issue(req)-     }+     tx, err := e.store.BeginSerializable(ctx)+     if err != nil {+         return nil, err+     }+     defer tx.Rollback()+     eval := e.Evaluate(ctx, tx, req) // current policy and current usage+     if !eval.Allowed || !e.quorumMet(req) {+         return nil, ErrPolicy+     }+     if err := tx.ReserveUsage(req); err != nil {+         return nil, err+     }+     return e.issueAndCommit(tx, req)  }
Resolution

Fixed. Policy and usage are evaluated again inside a serialisable transaction when the authorisation is issued.

NC-03MediumResolvedKey management

Signing nodes sign the digest relayed by the coordinator without rebuilding it

services/signer/src/session.rs:L142–L205 (start_session)

Likelihood
Low
Impact
High
Weakness
CWE-345
Description

A signing session starts with a message from the coordinator containing the authorisation ID and the 32-byte digest to sign. Each node checks that the authorisation ID exists and is unused, then signs msg.digest. Nodes do not fetch the authorised transaction, rebuild the digest themselves, or verify the policy engine's signature over the authorisation.

The coordinator is meant to be a scheduler and relay, but in this design it can choose what is signed. A compromised coordinator can attach any digest to a valid, unused authorisation, for example one for a transfer of the full balance to an attacker address.

The MPC threshold protects against compromise of individual nodes; this finding is about the component in front of them, which was implicitly trusted.

Preconditions
  • Compromise of the coordinator service.
  • An authorisation that has been issued but not yet used.
Exploit scenario
  1. 1.An attacker gains code execution on the coordinator.
  2. 2.When a legitimate authorisation for a small transfer arrives, it substitutes the digest of a transaction draining the wallet.
  3. 3.The nodes see a valid, unused authorisation ID and produce the signature.
Impact

Arbitrary signatures from any wallet with a pending authorisation, bypassing policy.

Recommendation

Have each node verify the policy engine's signature over the authorisation, fetch the authorised transaction, rebuild the digest independently with chain-specific encoding, and refuse to sign on mismatch.

Fix
services/signer/src/session.rs (remediation commit)diff
  pub fn start_session(&self, msg: StartSession) -> Result<Session, SignerError> {-     let auth = self.auths.get_unused(&msg.authorisation_id)?;-     self.protocol.begin(auth.key_id, msg.digest)+     let auth = self.auths.get_unused(&msg.authorisation_id)?;+     self.policy_key.verify(&auth.canonical_bytes(), &auth.policy_signature)?;+     let digest = match auth.chain {+         Chain::Ethereum => eip1559_signing_hash(&auth.transaction)?,+         Chain::Solana => solana_message_bytes(&auth.transaction)?,+     };+     if digest != msg.digest {+         return Err(SignerError::DigestMismatch);+     }+     self.protocol.begin(auth.key_id, digest)  }
Resolution

Fixed. Each node verifies the authorisation signature and rebuilds the payload to sign; the coordinator can no longer influence what is signed.

NC-04MediumResolvedKey management

Decommissioned signing nodes keep valid key shares until the next scheduled refresh

services/signer/src/membership.rs:L60–L118, deploy/runbooks/node-replace.md

Likelihood
Low
Impact
High
Weakness
CWE-324
Description

Key shares are refreshed (re-randomised without changing the public key) on a 90-day schedule. Replacing a node adds a new node through resharing but does not trigger a refresh, so the share held by the removed node remains compatible with the current shares until the next scheduled run.

The runbook wipes the removed node's volume, but backups and snapshots of that volume are kept for 30 days. Anyone with access to those snapshots holds a valid share that, combined with threshold minus one current shares, can sign.

Preconditions
  • A node replaced within the current refresh period.
  • Access to snapshots of the removed node, plus compromise of further nodes up to the threshold.
Exploit scenario
  1. 1.A former operator retains a snapshot of a replaced node. Combined with two compromised current nodes in a 3-of-4 configuration, the old share completes the threshold.
Impact

Lowers the effective number of compromises needed to sign during the refresh window.

Recommendation

Run a proactive share refresh as part of every membership change and exclude signing-node volumes from general backups.

Fix
services/signer/src/membership.rs (remediation commit)diff
  pub fn replace_node(&mut self, old: NodeId, new: NodeId) -> Result<(), SignerError> {      self.reshare_to(new)?;      self.remove(old)?;+     self.refresh_all_shares()?; // old share is no longer compatible+     self.audit.record(MembershipEvent::Refreshed { removed: old });      Ok(())  }
Resolution

Fixed. Membership changes trigger an immediate refresh, and signing-node volumes are excluded from snapshot policies.

NC-05MediumResolvedSignature replay

API request signatures do not cover a timestamp or nonce, so requests can be replayed

services/api/src/auth/hmac.ts:L18–L57

Likelihood
Medium
Impact
Medium
Weakness
CWE-294
Description

Clients sign requests with HMAC-SHA256(secret, method + path + body). The signature has no timestamp or nonce, and transaction-creation requests have no idempotency key. A captured request can be resent indefinitely and each copy creates a new transaction request.

Replayed requests still need policy approval, so this does not lead to unauthorised signing on its own. It does create duplicate requests that approvers may approve in bulk, and it lets an attacker with log or proxy access exhaust velocity limits to block legitimate transfers.

Preconditions
  • Access to a captured signed request, for example from client-side logs or a TLS-terminating proxy.
Exploit scenario
  1. 1.An attacker replays a captured payroll request twenty times. Approvers who batch-approve routine payroll approve the duplicates.
Impact

Duplicate transfers if approvers do not notice, and denial of service through velocity-limit exhaustion.

Recommendation

Include a timestamp and a random nonce in the signed string, reject requests outside a short window or with a seen nonce, and require idempotency keys on creation endpoints.

Fix
services/api/src/auth/hmac.ts (remediation commit)diff
- const payload = req.method + req.path + req.rawBody+ const ts = Number(req.header('x-ns-timestamp'))+ const nonce = req.header('x-ns-nonce') ?? ''+ if (!Number.isFinite(ts) || Math.abs(Date.now() / 1000 - ts) > 300) throw new AuthError('stale')+ if (!(await nonces.claim(keyId, nonce, 600))) throw new AuthError('replayed')+ const payload = [req.method, req.path, ts, nonce, sha256Hex(req.rawBody)].join('\n')
Resolution

Fixed. Signatures cover timestamp and nonce with a five-minute window; creation endpoints require an idempotency key.

NC-06LowResolvedConfiguration

Webhook signing secret is passed in a URL query string in the console

apps/console/src/settings/webhooks.tsx:L88, services/api/src/routes/webhooks.ts:L41

Likelihood
Low
Impact
Medium
Weakness
CWE-598
Description

The webhook settings page loads the signing secret with GET /v1/webhooks/{id}?reveal=true&secret=... when testing a webhook, so the secret appears in browser history and in the access logs of the API gateway. Anyone who can read those logs can forge webhooks that clients use to update their own ledgers.

Preconditions
  • Read access to gateway logs or the approver's browser history.
Exploit scenario
  1. 1.An insider with log access forges a "transaction confirmed" webhook to a client's back office.
Impact

Forged webhook notifications; no effect on signing.

Recommendation

Send secrets only in request bodies, show them once at creation, and support rotation.

Resolution

Fixed. Secrets are shown once, test calls use a POST body, and logs were purged.

NC-07LowAcknowledgedBusiness logic

Velocity limits apply per asset rather than across a wallet's total value

services/policy/engine/velocity.go:L30–L84

Likelihood
Low
Impact
Medium
Description

Velocity limits are configured per asset (for example 500,000 USDC per day). A wallet holding many assets has no aggregate limit, so an attacker who can pass approvals can move far more value in one day by spreading transfers across assets than any single limit suggests. Clients may not realise this when configuring policies.

Preconditions
  • A wallet holding several assets and a path to approval.
Exploit scenario
  1. 1.Transfers just under each asset's limit move the value of eight assets in one day.
Impact

Limits give less protection than clients expect.

Recommendation

Offer an aggregate limit in a reference currency and warn about policies without one.

Resolution

Acknowledged. Aggregate limits and policy linting are planned; in the meantime the console shows the combined daily exposure.

NC-08InformationalResolvedSupply chain

Unmaintained transitive dependency in the signing node

services/signer/Cargo.lock

Likelihood
Low
Impact
Low
Weakness
CWE-1104
Description

cargo audit reported an unmaintained crate pulled in by a logging dependency. No vulnerability was known in it, but unmaintained code in the signing node increases long-term risk.

Preconditions
  • None.
Exploit scenario
  1. 1.Not exploitable at the time of review.
Impact

Supply-chain hygiene.

Recommendation

Replace the dependency and run cargo audit and cargo deny in CI.

Resolution

Fixed; dependency replaced and checks added to CI.

06

Severity

8findings
  • Critical0 · 0%
  • High1 · 13%
  • Medium4 · 50%
  • Low2 · 25%
  • Informational1 · 13%

By vulnerability class

  • Business logic2
  • Key management2
  • Access control1
  • Configuration1
  • Signature replay1
  • Supply chain1

Likelihood and impact

Each finding placed by the likelihood of its preconditions and the impact of exploitation.

Findings by likelihood (columns) and impact (rows)
Impact ↓ / Likelihood →LowMediumHigh
High
0
Medium
0
Low
0
0

07

Remediation

7 of 8 findings are resolved, 1 acknowledged, 0 partially resolved and 0 open at remediation commit c27e05a9b3f1.

Remediation progress100%

Resolved and acknowledged findings count fully; partially resolved findings count half.

100%remediated
  • Resolved7 · 88%
  • Partially resolved0 · 0%
  • Acknowledged1 · 13%
  • Open0 · 0%
Findings by severity and remediation status
SeverityResolvedPartially resolvedAcknowledgedOpenTotal
Critical00000
High10001
Medium40004
Low10102
Informational10001
All findings70108

Residual items

  • NC-07LowAcknowledgedAcknowledged. Aggregate limits and policy linting are planned; in the meantime the console shows the combined daily exposure.
  • ResolvedFixed and verified in the remediation review.
  • Partially resolvedMitigated; the residual risk is documented.
  • AcknowledgedAccepted by the protocol team with a stated rationale.
  • OpenNot yet addressed at the reviewed remediation commit.

08

Formal verification

The approval and signing protocol was modelled in TLA+ and checked with TLC for three approvers, two policies, four signing nodes (threshold three) and up to two concurrent requests. The model of the reviewed version produced a counterexample to the distinct-approver property (NC-01) and to policy freshness (NC-02); the remediated model satisfies all safety properties within these bounds.

Tool: TLA+ with the TLC model checker

  • P1ProvedA signature is produced only for a transaction whose authorisation was issued after a successful policy evaluation and quorum.Exhaustive within the model bounds; counterexample on the reviewed version (NC-02).
  • P2ProvedEach signing session produces at most one signature, over the digest named in its authorisation.Within bounds, with nodes rebuilding the digest (NC-03 fix).
  • P3ProvedA quorum of k counts k distinct authenticated approvers.Remediated model; counterexample on the reviewed version (NC-01).
  • P4InconclusiveEvery approved request is eventually signed or rejected under fair scheduling.Liveness check did not complete within the state-space budget for two concurrent requests.

A proved property holds for every execution of the model under its stated assumptions. Fuzzing and property-based results are evidence, not proofs, and are recorded as inconclusive.

09

Recommendations

  1. 01

    Keep the coordinator untrusted

    Treat the coordinator purely as a relay. Any new message type it sends to nodes should be authenticated by the policy engine and validated independently by each node.

  2. 02

    Bind approvals to what is shown

    Approvers should sign a challenge derived from the decoded transaction they see. The NC-01 fix does this; extend it to batch approvals.

  3. 03

    Cross-check chain data

    Simulate transactions against two independent RPC providers before showing them to approvers, so a single provider cannot mislead them.

  4. 04

    Lint client policies

    Warn clients about wildcard whitelists, missing aggregate limits and single-approver quorums (NC-07).

  5. 05

    Rehearse node replacement

    Include the post-replacement share refresh (NC-04) in the scheduled recovery exercise.

10

Methodology and limitations

  1. 01Architecture and trust-boundary review with the engineering team
  2. 02Manual code review of the signing node, policy engine, API and console
  3. 03Authorised penetration test of the staging environment (API, console, network exposure)
  4. 04Dependency and build-provenance review for all services
  5. 05Model checking of the approval and signing protocol in TLA+
  6. 06Infrastructure configuration review (Terraform, Kubernetes, cloud IAM)
  7. 07Remediation review of every fix

Severity classification

Critical
Direct loss of funds or permanent loss of control is achievable with little or no precondition.
High
Material loss or protocol disruption is achievable under realistic conditions.
Medium
Limited loss, degraded functionality, or impact that depends on specific conditions.
Low
Minor impact, defence-in-depth gaps, or issues with unlikely preconditions.
Informational
Code quality, documentation or best-practice observations without direct security impact.

Limitations

  • The penetration test covered the staging environment only; production was reviewed through configuration and code, not tested directly.
  • The threshold-signature library was treated as correct; only its integration and parameters were reviewed.
  • Model checking is exhaustive only within the stated bounds.

No assessment can show that a system is free of vulnerabilities. This research assessment reflects the code at the commits listed. Quantix methodology

11

Technical appendix

Tools

  • TLA+ / TLCModel checking of the approval and signing protocol
  • cargo audit, cargo denyRust dependency review
  • govulncheckGo vulnerability scanning
  • SemgrepCustom rules for TypeScript and Go request handling
  • Burp SuiteAPI and console penetration testing in staging
  • CheckovTerraform and Kubernetes configuration review
Reviewed files (SHA-256) · 5 files
SHA-256 hashes of reviewed files
FileSHA-256
services/signer/src/session.rs7216a8571a8f7ecd838f2c73b4149fcb0d42d93e348c41dc64c3f15e452cbdbd
services/signer/src/membership.rsd4578b0b349004abb1596ec769bd2a4bc69d4f52cd54c8502d2dafa3a4854dfb
services/policy/approvals/handler.go51584eb395cf17e1722a7ebfdfb98d4cdd1d844b8095985e6f23b03b4192a07b
services/policy/authorise.go59c016a429a641e93ed9da465834ff215756a065aee10b77fbeb0836818f138b
services/api/src/auth/hmac.ts204ebdc3ce9b2572028ed478f3d5c382eee02f0231f94c1e0e195bfa9fb8168b

Notes

  • Penetration testing was performed against staging hosts under the *.northstar-custody.example test domain with written authorisation.
  • File hashes are SHA-256 digests of the reviewed sources at the audited commit.

Technical references

  1. 1.CWE-639: Authorization Bypass Through User-Controlled Key (opens in a new tab)
  2. 2.W3C Web Authentication Level 2 (opens in a new tab)
  3. 3.OWASP API Security Project (opens in a new tab)
  4. 4.CWE-367: Time-of-check Time-of-use (TOCTOU) Race Condition (opens in a new tab)
  5. 5.CWE-345: Insufficient Verification of Data Authenticity (opens in a new tab)
  6. 6.EIP-1559: Fee market change for ETH 1.0 chain (opens in a new tab)
  7. 7.NIST SP 800-57 Part 1 Rev. 5: Recommendation for Key Management (opens in a new tab)
  8. 8.CWE-324: Use of a Key Past its Expiration Date (opens in a new tab)
  9. 9.CWE-294: Authentication Bypass by Capture-replay (opens in a new tab)
  10. 10.RFC 2104: HMAC (opens in a new tab)
  11. 11.CWE-598: Use of GET Request Method With Sensitive Query Strings (opens in a new tab)
  12. 12.OWASP Application Security Verification Standard (opens in a new tab)
  13. 13.RustSec Advisory Database (opens in a new tab)

Quantix Technical Security Assessment QX-TSA-2026-011

Version 1.1, published 18 Sept 2026. A4 PDF generated from this assessment record.

Download Report

12

Report history

  1. 13 Jul 2026Review openedReviewed commit 9d4b17e0c2a6 in github.com/example-org/northstar-platform
  2. 14 Aug 2026Review closedFour reviewers over twenty-five working days, including an authorised penetration test of the staging environment
  3. After reviewRemediation reviewFixes checked at commit c27e05a9b3f1
  4. 18 Sept 2026Version 1.1 publishedQX-TSA-2026-011, A4 PDF generated from this record

Commission an assessment written to be verified.

Share the repository and the commit you plan to deploy. We reply with scoping questions and an estimate.