Skip to content

Security and privacy

Threat model

Published as we use it internally. Each row names the threat, the boundary it crosses, the mitigation, and the phase in which the mitigation exists or is planned.

What we protect

  1. Imported engineering artifacts and everything derivable from them: addresses, device inventories, control sequences, alarm configuration, layouts.
  2. Secrets embedded in those artifacts: station passwords, tokens, certificates, service credentials.
  3. Live operational data: values, alarms, histories, which reveal occupancy and operations.
  4. The ability to write to a building.
  5. The integrity of the model itself.
  6. The software supply chain, because a release runs inside customer networks.
  7. Our own credentials: signing key, hosted secrets, pairing tokens.

Who we assume

  • A malicious artifact author who hands a technician a crafted file.
  • A network adversary on the customer LAN.
  • A compromised hosted tenant or hosted insider, if a hosted service exists.
  • A compromised hosted service trying to pivot into sites through the outbound channel.
  • A supply-chain attacker: poisoned dependency, stolen key, tampered release.
  • Over-privileged automation: an API or MCP client doing more than intended.
  • A careless operator.

Boundaries

Controllers and devices to the edge (read-only by type). A vendor station to the edge (optional, outbound). Browser to the edge on the LAN (local authentication). Edge to hosted (optional, admin-enabled, outbound only). Tenant to tenant on hosted (isolation). The architecture page draws them.

Threats and mitigations

#ThreatBoundaryMitigationPhase
T1A crafted backup or controller file exhausts the machine (decompression bomb, oversized archive)ImportStreaming unzip with hard caps on entry count, entry size, total inflated size and compression ratio; abort and report.Phase 2
T2XML external entities, DTDs or includes in a fileImportOur own XML reader resolves nothing; fuzz corpus in CI.Phase 2
T3Deserialization of vendor objectsImportNever used. Importers are pure XML and bytes; no vendor decoder runs on the edge.By design
T4Path traversal from archive entry namesImportEntries are read into memory by name and never written to disk.Phase 2
T5Secrets inside artifacts leak into the database, logs or the APIAllTyped redaction at import; artifacts encrypted at rest; no endpoint serves raw bytes; structured logs with a deny-list; no telemetry at all.Phase 2–3
T6Unauthenticated access to the edge on the LANBrowserLocal accounts, first-run admin setup, session cookies, CSRF tokens, HTTPS with a local certificate and a documented path to a customer CA.Phase 3
T7A connector writes to a buildingConnectorsWriting is a separate interface no early connector implements; BACnet/IP ships without the write service; a station connector has no write actions.By design
T9A hosted service, or a compromised one, reaches into a siteHostedThe edge initiates every connection; its message allowlist has no "open port" or "execute"; the hosted side can only answer requests. Short-lived enrollment codes; pinned certificate.Phase 6
T10One hosted tenant sees anotherHostedRow-level security keyed on the session tenant; per-tenant artifact keys; integration tests that attempt cross-tenant reads.Phase 6
T11A malicious or vulnerable dependencySupply chainLockfiles, vulnerability scanning and Dependabot in CI, minimal dependency count, SBOM per release, build provenance attestation.Phase 0
T12Theft of the signing keySupply chainSigning through a public transparency log from CI with short-lived identities; any hardware key for optional vendor modules never enters CI. CI verifies hash and signature against the tagged source.Phase 3
T13An MCP client or API consumer does more than the operator intendedAPITools share the user's role; read-only by default; scoped queries; writes in a separate capability that is off; every call audited.Phase 3
T14A poisoned import rewrites a good modelModelImports produce a new snapshot; confirmed facts are never replaced; the diff of what an import would change is shown before it is accepted.Phase 3
T15An operator pastes customer data into an outside AIPeopleNo "ask AI" button that leaves the box; MCP is local-first; a data classification guide tells operators what an artifact contains.Phase 3 (docs)

Scope note: this covers Archipelago code and infrastructure. Vendor platforms are out of scope and governed by their own vendors' terms.