- Encryption
- TLS 1.2 minimum with 1.3 preferred in transit, and mutual TLS between services. AES-256-GCM at rest for privileged credential vaults using envelope encryption — a data key per vault, with the key-encrypting key held in a managed key service and a fresh nonce per operation. Passwords are hashed with bcrypt at cost 12; API keys are stored as one-way hashes and cannot be recovered, only replaced.
- Where we run
- Qorionix runs from a single production cell, hosted in the EU (Ireland). AI inference runs in a separate EU location, Sweden. There is no second cell, no US or APAC processing, and no option to pick a different home region — every workspace lands in the same EU cell. See Where your data lives for the mechanism and its limits.
- Separated secrets
- The ticket-signing, manifest-signing and agent-token secrets are distinct from the session-signing secret, derived one-way per purpose when not set explicitly. Setting any of them equal to another is a boot-time configuration error rather than a silent weakness — a sensor holding the ticket key cannot recover the session key or forge a token.
- Tenant isolation, enforced at the router
- Every table carries an organisation identifier and the guard sits on the root router rather than on each handler, so a newly added endpoint inherits it. This was not always true: four critical isolation defects and eleven route groups covering forty-five endpoints were found and closed, and the fix was structural rather than a patch per route.
- Reversibility as a property, not a feature
- Every privileged action records an undo handle in a hash-chained audit row before it executes. Chain verification locates the exact broken sequence number if a row is altered, so tampering is detectable rather than merely discouraged.
- Authentication hardened against real attacks
- Three authentication bypasses were found in our own code and fixed: SAML signature wrapping, a WebAuthn path performing no signature verification at all, and role checks that failed open on two modules. Each fix was proven against the live route — a genuine assertion succeeds and every malformed, replayed, cross-tenant and downgraded variant is rejected.
- Data minimisation in the connectors
- Microsoft Graph returns a much larger default projection than we use. Asking only for the fields the checks actually read keeps responses small and avoids pulling personal data we have no purpose for, which is a legal requirement rather than an optimisation.
- No tenant data in model training
- Prompts contain excerpts of your events, which is how the assessment is written at all, and we state that plainly rather than implying the model sees nothing. Your data is not used to train any model.
- Detection content with clean provenance
- The whole detection library is first-party authored. One major vendor's rule licence is a hard stop for us and another requires the author's name to appear in the alert interface; neither obligation reaches you, because we did not take either shortcut.