Skip to main content

Threat model

This page covers v0 only — the testnet prototype. The v1 threat model replaces this page when v1 ships.

v0 trust assumptions

ComponentTrust levelNotes
Publisher keySingle self-operated Ed25519 keyCompromise = full oracle compromise
Admin keySingle self-operated Stellar accountOwns init and set_publishers
Attestation serviceSingle self-operated instance (Fly.io, fra region)Single point of liveness failure
Audit statusNot independently auditedInternal review + cost-isolated benchmark suite
caution

v0 is for hackathon prototypes and integration testing — not for production capital.

What v0 protects against

ThreatMechanism
Replay of stale signed prices60-second staleness window enforced in the contract
Overwriting fresh state with a stale roundMonotonic round_id per asset; lagging rounds are silent no-ops
Unknown signerContract checks pubkey against the registered publisher set
Cross-asset signature reuseAsset tag is the first 8 bytes of the signed message
Soroban host upgrade breaking signature semanticsCommitted snapshot tests surface host-cost regressions in diffs
Lagging attestation serviceSDK rejects fetched attestations older than 2 seconds (StalePriceError)

What v0 does not protect against (and the v1+ plan)

ThreatStatus in v0Mitigation in v1+
Single publisher key compromiseOpen3-of-5 Ed25519 threshold publisher set
Single admin key compromiseOpen3-of-5 admin multi-sig distinct from publisher set
Single attestation service outageOpenGeo-replicated service
Price manipulation on thin assetsOpen by policyAsset Inclusion Policy: only assets trading on ≥3 reference CEXs with sufficient depth
Absence of independent auditOpenEngagement with Trail of Bits / OtterSec / Veridise-class firm before mainnet
MEV / front-running of pull updatesPartially openConsumer slippage bounds and deterministic ordering documented in integration patterns
Manipulation-resistant valuation for lendingOpenSigned-TWAP attestation type (v2)

Failure modes

FailureConsequenceDetection
Attestation service downfetchLatest throwshttps://api.noeracle.org/health reports HTTP 503 when not signing
Exchange returns bad dataOutlier sampleService rejects samples beyond 3σ and beyond a 5-second staleness budget
Stellar network congestionTx may not land within freshness windowSDK retries with fresher attestation; contract rejects with StalePrice if exceeded
Replay of an older signed messageStored entry overwritten with stale priceBlocked by 60-second staleness window and monotonic round_id

Reporting issues

Email security@noeracle.org. A formal disclosure policy and bug bounty pool ship with v1.

See also

  • Architecture — replay protection mechanics, freshness layers, signature scheme rationale
  • Roadmap — what arrives in v1, v2, v3