PhysID threat model
v1 sandbox surface. This page is the document enterprise security reviewers should read end-to-end before any pilot conversation.
Trust boundaries
- Hardware anchor. Post-quantum signed NFC tag or embedded secure element. Private keys never leave the secure element.
- Identity layer. Concordium agent registry. Operator identity is IDP-verified at account creation and split across independent Privacy Guardians.
- Local channel. NFC tap (deliberate, mm range) and BLE broadcast (ambient, opt-in metadata only, no identity).
- PhysID services. API + MCP + shared vault. Vault holds anything needing signing; the API requests operations and never sees raw private keys.
Threats and mitigations
T1 — Tag cloning
Each tag carries a unique key in a tamper-resistant secure element. Cloning requires extracting the key, which the element resists at silicon level. Reissuance through the registry revokes any prior tag bound to the unit.
T2 — Replay of NFC handshake
Every encounter generates a fresh nonce; the tag's response is bound to that nonce and the verifier's public input. A captured payload cannot be replayed against a different verifier or in a different session.
T3 — Ambient broadcast deanonymisation
BLE broadcast (Tier 1) carries class, operator category, jurisdiction, and a rotating session ID. No identity is broadcast. Session IDs rotate on a short interval to defeat long-term tracking.
T4 — Unauthorised disclosure of operator identity
Tier 3 disclosure (full operator identity) requires Concordium Privacy Guardian cooperation under documented procedure. PhysID is not a Privacy Guardian and cannot disclose unilaterally — including under legal compulsion to PhysID alone.
T5 — Compromise of the PhysID service
PhysID does not hold operator private keys; those live in the shared vault, which enforces per-operator authorisation on every signing operation. A full PhysID API compromise yields the ability to enqueue invalid registry calls — which the on-chain registry rejects — but cannot issue valid Concordium transactions on behalf of an operator.
T6 — Compromise of the shared vault
Vault uses standard OpenBao threat-model assumptions: sealed at rest, audit-logged at use, sealed again on restart. Operator keys are encrypted-at-rest with per-operator KEKs that themselves require auth to unwrap.
T7 — Stolen unit / ownership transfer
Ownership transfer requires both old and new operator to co-sign a transfer transaction on Concordium. A stolen unit cannot be transferred without the original operator's signature; revoke via POST /v1/registry/{unit_id}/revoke is the response path.
T8 — Offline verification accepting revoked tags
Offline verifiers accept cached credentials with a stated freshness bound. Verifiers connecting later check on-chain status and surface revocations retroactively. Tier 2 NFC responses include the cache freshness in milliseconds so callers can decide whether offline acceptance is adequate for the use case.
T9 — Compromise of the Concordium API path
PhysID calls the internal Concordium API where keys are registered, not a public node directly. This means a downstream node compromise cannot trick PhysID into accepting a forged registry response — the response is signed by the internal API and verified by PhysID before the response is returned to the caller.
T10 — Supply-chain compromise of tag production
Tags are personalised by Provenance Tags in a controlled facility. Each tag's key material is generated on-device and never exported. Production lots are signed and the registry records the lot signature at first registration so a later production-chain compromise can be bounded to specific lots.
Privacy posture
- Sandbox traffic terminates in EU regions (Fly.io
ams). - PhysID does not log NFC payloads, decode-request bodies, or operator identifiers in plain text beyond what is needed for the immediate response.
- Per-unit credentials are stored in the on-chain registry, not in a PhysID-private database.
- Waitlist + sandbox-access submissions are stored in a Fly Postgres cluster in the EU and used only to issue keys + contact.
Disclosure
Security reports → security@physid.ai. We follow coordinated disclosure; responses within 72 hours; we publish a security disclosure document at /.well-known/security.txt.
Open items for v1 → v2
- Full MCP tool handlers wired to the real API path
- Production API key issuance flow with per-operator rate limiting
- Customer dashboard at
app.physid.aifor self-serve key + unit management - Per-customer audit log surfaced through the dashboard
- Public encounter receipt explorer (v3)