Berserk

Berserk Security Whitepaper

This is the deep dive on how Berserk approaches security as a self-hosted vendor: the threat model, the technical controls in the shipped product, and how a customer should run it securely.

This document is split into three parts:

  • Product Security Model — facts about the software customers run, the data boundary, and the security properties of the shipped product.
  • Berserk Internal Security Program — the development, operational, and support practices Berserk ApS uses to make the product trustworthy.
  • Customer Responsibilities in Self-Hosted Deployments — the controls the customer configures and operates in their own environment.

For the procurement-friendly summary, see the Trust Overview. For the structured 261-question deep-dive, see the filled CAIQ v4.

What Berserk is, in one paragraph

Berserk is an observability platform you deploy self-hosted or in your own private cloud — close to the services it observes, so the egress traffic that ordinarily piles up against an external SaaS backend stays inside your network. The customer operates the deployment; the customer owns the data. Berserk ApS — the company — distributes the software deliverables and is actively engaged with customers commercially, but the product does not phone home: the customer's running deployment does not send telemetry, diagnostics, or usage data back to any Berserk-operated service in normal operation, because we do not operate one. Active engagement with the company happens through human channels — sales, support, the Coordinated Vulnerability Disclosure inbox — never through the running product.

Product Security Model

This section describes the security properties of the shipped product and the data path inside a customer-operated deployment.

Trust boundary

Rendering diagram…

The boundary is broken only when the customer explicitly invites Berserk personnel under a Data Processing Agreement for a support engagement, and only for the data the customer chooses to share.

Data handling at the architecture level

  • Telemetry data (traces, logs, metrics from the customer's applications) is received by the ingest service, batched, and written to the customer's object store in compressed form. Wire-level summary below.
  • Metadata (tables, schemas, storage registry) is in the customer's Postgres. Berserk's design treats S3 as the trust root — the metadata is rebuildable from the stored telemetry data.
  • Query results are computed in the query pod and returned to the customer via HTTPS. They never leave the customer's environment.

Wire-level summary

The ingest service is a purpose-built OTLP receiver. The relevant behaviour for buyers configuring their OTel collectors:

AspectBehaviour
ProtocolsOTLP over HTTP and gRPC.
AuthenticationBearer token per ingest stream. Tokens are scoped to a single stream so a leaked token can be rotated without disturbing others.
Input validationBerserk is designed to accept a wide range of observability payloads and preserve them for analysis rather than reject aggressively. Safety against malformed or hostile input comes from Rust's memory-safety model, runtime checks, and explicit admission limits.
Admission and backpressureA semaphore caps inflight bytes globally and per stream. When saturated the service returns standards-respecting backpressure: HTTP 429 Retry-After: <secs> (which the OTel HTTP exporter honours as ThrottleRetry), and gRPC Unavailable + google.rpc.RetryInfo rather than bare RESOURCE_EXHAUSTED (which OTel gRPC treats as permanent and drops).
Batching and storageValidated requests are batched per stream and flushed to the customer's object store in compressed form. The customer's object store is the trust root; metadata in Postgres is rebuildable from the stored telemetry data.
EgressIngest writes only to the customer's configured object store. There is no Berserk-operated endpoint to which the running deployment sends data — see §"Trust boundary".

The deployment model is largely inspectable through the Helm chart, rendered manifests, and operator documentation. Additional engineering walkthroughs and architecture review material are available to enterprise customers on request.

Product cryptography and encryption

The table below summarizes the product-side encryption model. Because Berserk is self-hosted, several at-rest controls are owned by the customer and depend on how the customer configures their own infrastructure; those rows say so plainly.

StateEncryption
In transit — between collectors and Berserk ingestTLS 1.2+ via rustls (aws-lc-rs backend). Mandatory for the OTLP HTTP and gRPC endpoints when exposed beyond the cluster; ingress termination is the customer's choice (mesh, ingress controller, OAuth2 proxy).
In transit — between the bzrk CLI / UI and queryTLS 1.2+ via rustls. The CLI refuses plaintext for a non-localhost endpoint.
In transit — internal Berserk service-to-serviceIn self-hosted deployments, Berserk can be isolated with customer-controlled Kubernetes network controls such as NetworkPolicy, subject to cluster configuration and CNI support. Berserk does not currently add a separate built-in service-to-service authentication or mTLS layer inside the cluster.
At rest — telemetry data (object store)The customer's object store, encrypted using the customer's chosen storage controls. This is where customer telemetry is stored.
At rest — metadata PostgresThe customer's Postgres, encrypted using the customer's chosen storage controls. Postgres holds metadata; customer telemetry remains in the object store.
At rest — customer-managed secretsCustomer-side: SOPS, sealed-secrets, or the cluster's KMS-backed secret store (we recommend, do not enforce).
At rest — telemetry integrityEach stored segment is bound to a cryptographic digest at creation; the binding is verified on every query read. Create / merge / delete events are recorded in an append-only audit chain in metadata. SHA-256 default, with BLAKE3-256 and SHA-3-256 as per-segment alternatives. See Trust §"Tamper-evident storage".
HashingSHA-256, SHA-512, BLAKE3 in security-relevant contexts. No MD5 or SHA-1.

Approved primitives (engineering reference)

UseImplementation
TLS for HTTP and gRPCrustls with the aws-lc-rs backend, used uniformly across HTTP and database clients.
Symmetric encryptionAES-256-GCM, ChaCha20-Poly1305 (authenticated only).
Asymmetric signingEd25519, ECDSA P-256. RSA only where forced by an external system.
Opaque token generationOS RNG only for security-relevant token generation.
Token storageMeta stores a SHA-256 digest of ingest tokens for validation; plaintext tokens are shown only once and are not persisted.

Runtime safety properties

Engineering rules that affect runtime safety:

  • In our Rust services, panics in production code paths are prohibited and enforced by compiler flags, so a malformed request can't crash a service.
  • The unsafe keyword is avoided. It is only permitted in a small, isolated core where the performance properties cannot be achieved in safe Rust, or where interop with a C library requires it; every such site is reviewed.
  • Our query language KQL is read-only. Our dialect implements only the read-and- transform subset; control commands like .create, .drop, .append, and .alter are deliberately not implemented, so a query cannot mutate tables, schemas, stored telemetry, or rows.
  • All SQL is compile-time-fixed. Every SQL statement Berserk runs against its metadata Postgres is a compile-time-checked sqlx query with typed parameter binds — there is no runtime SQL string construction in the codebase, so SQL injection is not a possible state of the program.

Product recovery characteristics

Berserk ships self-hosted software, so deployment-side continuity is the customer's responsibility. The shipped product is built around an S3-as-trust-root design: telemetry data in object storage is authoritative, and the metadata Postgres is rebuildable from that stored data. A customer who retains the object store retains the data, regardless of what happens to the metadata service.

Specific RTO and RPO targets, redundancy commitments, and crisis- communication SLAs are agreed contractually under each engagement (DPA, support contract, or the planned managed-offering MSA).

Berserk Internal Security Program

This section describes Berserk ApS's own development, operational, and support practices. These controls are not runtime properties inside the customer deployment, but they are part of the trust model behind the delivered product.

Secure software delivery

The dependency graph and the build pipeline are the highest-priority attack surface for a vendor in our position. Concrete controls, named by category rather than by specific product so the posture survives tooling churn:

  • Pinned dependencies across every ecosystem. Every external input — across the Rust, Go, JavaScript, JVM, build-system and CI-action ecosystems we use — is pinned by checksum or commit SHA, never by floating tag.
  • Vendored build tooling. Build-tool binaries (toolchain managers, dependency updaters) are stored in-repo via large-file storage rather than pulled from public registries during a build. CI never downloads from the public network, which neutralises the standard registry-poisoning and dependency-confusion attack class.
  • Daily vulnerability scanning across the dependency graph. Coverage uses a per-ecosystem scanner where the ecosystem has an authoritative advisory database, plus an automated dependency updater that runs against every supported manifest type. New advisories trigger a notification automatically; nothing waits for a human to remember to scan.
  • CycloneDX 1.6 SBOM in every shipped container at /sbom.cdx.json. The customer's own SBOM scanner — whichever CycloneDX-compatible product they already use — can audit a Berserk image without us shipping anything additional.
  • VEX-annotated SBOMs. Triaged advisories carry a CycloneDX 1.6 VEX block (analysis.state = not_affected) with a justification enum and a free-form detail. We maintain a single advisory- exception register that feeds the SBOM, the per-ecosystem scanners, and the dependency-updater alert filter, so they never disagree.
  • Daily secrets detection against master. A history-aware secrets scanner (TruffleHog) runs against the full master git history on the daily security-scan workflow. PR-time blocking is not in scope today; secrets that land on master are caught on the next daily run.
  • Sandboxed build execution. Each build target runs in an isolated sandbox with no access to other targets, the host filesystem outside its declared inputs, or the public network. A compromised dependency or build script therefore has no path to exfiltrate from CI or to tamper with sibling targets — its blast radius is confined to whatever it was already allowed to read and produce.

Vulnerability management

Mapped to NIS2 Article 21(2)(e) and NIST CSF 2.0 ID.RA-08, ID.RA-09, RS.MI-01, PR.PS-02. The full policy is available under NDA on request.

Sources we monitor. The per-ecosystem advisory databases (e.g. RUSTSEC for Rust, GHSA for the GitHub-tracked ecosystems) plus an automated dependency updater, daily. CFCS / ENISA bulletins are reviewed manually as issued. External reports come in via the Coordinated Vulnerability Disclosure inbox and /.well-known/security.txt. Customer reports come in under DPA.

Severity and response. Aligned with CVSSv3 base score where available:

SeverityCVSSTriageMitigation
Critical9.0–10.0Within 24 hours of awarenessWithin 7 days, or document why a longer window is acceptable.
High7.0–8.9Within 3 business daysWithin 30 days.
Medium4.0–6.9Within 10 business daysWithin 90 days.
Low0.1–3.9Best-effortBest-effort, batched with normal upgrades.

The four mitigation choices are patch, replace, reach-around (eliminate the vulnerable code path even without an upstream fix), or document and accept via our advisory-exception register. In shipped SBOMs, those exceptions are emitted as CycloneDX 1.6 VEX blocks so downstream scanners honour the analysis.

For vulnerabilities discovered in Berserk's own code we triage under the same matrix, patch on a private branch, coordinate disclosure with affected customers under DPA, request a CVE where appropriate, and backport the fix to supported releases — the public commitments and embargo rules are in the Coordinated Vulnerability Disclosure policy.

Open-source licensing and artifact transparency

Separate from the security threat model: customers should not inherit unwanted licence obligations from anything we ship.

  • Permissive licences only. Allowed: MIT, Apache-2.0, BSD (2- and 3-clause), ISC, Unicode, CC0 for data and examples.
  • Disallowed. GPL (any version) and AGPL (any version) are banned. LGPL, MPL, EPL, and CDDL are disallowed by default and only permitted with explicit review and approval.
  • Build-time enforcement. A copyleft-detection test runs as part of every build and fails the build on any disallowed-licence hit. A small allowlist captures vetted exceptions, each with a documented justification.
  • Dual-licensed components. When a dependency offers a permissive option (e.g. MIT OR Apache-2.0), we consume it under the permissive grant and record that choice in our license bundle.
  • Customer transparency. Every container image carries /THIRD_PARTY_LICENSES.txt — every dependency with its license, deduplicated and version-pinned. The same information is bundled by other means for non-OCI deliverables such as the CLI.
  • Per-product SBOM. Inside each container image, the CycloneDX 1.6 SBOM at /sbom.cdx.json carries the SPDX licence identifier alongside each component, so any CycloneDX-compatible compliance scanner can audit the licence posture without us shipping anything additional.

Internal operational security

  • Personnel laptops. Full-disk encryption and auto-lock are required on every personnel laptop. Acceptable-use is covered by our HR Security Policy.
  • Internal secrets handling. ProtonPass with 2FA is used for operational secrets today. SOPS for repo-tracked secret material is on the Security Roadmap (R-PROD-04).
  • Customer-environment access. Berserk personnel access customer environments only when explicitly invited under a Data Processing Agreement for support or a contracted engagement.

Internal incident response and business continuity

Mapped to NIS2 Article 21(2)(c) and NIST CSF 2.0 ID.BE, RC.RP, RC.CO, PR.IR. The full Business Continuity Policy (critical-function table, recovery-objective targets, communications plan, tabletop findings) is available under NDA on request to paying customers.

Scope. The internal BCP we maintain covers what is needed to keep delivery alive: source-code availability, build pipeline, container registry, the bzrk.dev website, and internal communications. The planned managed offering will be folded into the BCP before it enters production.

Backup and rehearsal. Backup mechanics are documented in our internal backup-restore procedure. End-to-end rehearsal of the S3-rebuild path is on the Security Roadmap (R-BCP family); first end-to-end rehearsal is scheduled for Q3 2026. Annual tabletop on dev-machine loss is in place.

Recovery objectives for paying customers. Specific RTO and RPO targets, redundancy commitments, and crisis-communication SLAs are agreed contractually under each engagement (DPA, support contract, or the planned managed-offering MSA).

Customer Responsibilities in Self-Hosted Deployments

This section describes the controls the customer owns because Berserk runs inside the customer's infrastructure. We have no visibility into your deployment; the recommendations below help you align it with the controls a regulated buyer (NIS2, ISO 27001) will expect.

Access control

  • Today (transitional, until R-AUTH-01 lands): use your existing identity provider for the UI, with identity enforced at the ingress layer (e.g. via OAuth2 proxy or your service mesh). Once Berserk ships native authn/authz across the product API surfaces — see Security Roadmap (R-AUTH-01) — the product will authenticate callers itself and this customer-side wrapping becomes unnecessary.
  • Apply RBAC to the K8s namespace running Berserk; do not give the Berserk service accounts more access than they need.
  • Rotate ingest tokens on personnel changes.

Network

  • Place ingress behind your VPN or load balancer with TLS termination.
  • Today (transitional, until R-AUTH-01 lands): the bzrk CLI talks to the query service over HTTPS, and the query service does not yet authenticate callers natively — do not publish it to the public internet without an auth proxy. The ingest service already carries Bearer-token authentication per stream and can be exposed more directly. Both API surfaces will gain a uniform native authn/authz model under R-AUTH-01; this transitional guidance goes away once that ships.

Storage

  • Enable server-side encryption on your S3 bucket / object store.
  • Set retention rules per your data-handling policy.
  • Replicate cross-region for disaster recovery.

Postgres (meta)

  • Backup at least daily.
  • Restore is documented in our internal backup procedure; the same model applies in your environment — S3 is the trust root, Postgres is rebuildable from the stored telemetry data plus merge journals.

Monitoring

  • The Berserk services expose health probes and OTel-formatted metrics, logs, and traces. They can be exported to any OTLP endpoint — including a Berserk deployment itself — via the global.observability.otlpEnabled Helm value. Alert on the reliability signals named at docs.bzrk.dev → Cluster Admin §"Observability".

Compliance and Procurement References

This section points procurement, legal, and security reviewers to the relevant supporting materials.

Compliance mapping

Buyer asks forWhere to find it
ISMS / security programInternal policy set mapped to NIS2 Article 21(2) and NIST CSF 2.0 against an internal control matrix; available to enterprise customers under NDA on request.
NIS2 Article 21(2) coverageTrust Overview §"Compliance posture" and the control matrix.
GDPR Article 28 (processor)DPA template.
GDPR Article 30 (records of processing)Maintained internally by Berserk ApS for our controller activities.
Sub-processor listSub-processors.
SBOMs/sbom.cdx.json inside each container; reproducible from tools/licenses/generate_sbom.py.
Vulnerability disclosureCoordinated Vulnerability Disclosure and /.well-known/security.txt.

Certifications

Berserk ApS holds no formal SOC 2 or ISO 27001 audit today. The buyer-readiness pack on this site — Trust Overview, ISO 27001 Readiness, the filled CAIQ v4, GDPR Compliance, NIS2 Compatibility, DPA Template, and Sub-processors — is the equivalent artefact set most procurement reviews need. The audit-track items in flight are listed openly at Security Roadmap.

Reporting a vulnerability

security@bzrk.dev. See Coordinated Vulnerability Disclosure for the full policy.