Skip to content

Security: ace2016/tracepack

SECURITY.md

Security

Trust model (read this first)

Tracepack is local-first: your projects and evidence files live in your browser's IndexedDB storage. Nothing is uploaded anywhere by default: there is currently no server, no account, and no cloud sync.

What integrity hashes prove, and what they don't

Every piece of evidence gets a SHA-256 contentHash. Attachments coming through the tracepack-evidence interchange contract get two separate hashes:

  • Attachment integrity (content_hash): SHA-256 of the original binary bytes. Proves the bytes weren't altered relative to what was hashed.
  • Payload consistency (integrity.payload_hash): SHA-256 of the RFC 8785 canonical form of the structured claims. Proves the structured data (observations, timestamps, metadata) wasn't altered relative to what was hashed.

Neither proves who sent the data, or that any claim inside it is true. See packages/evidence-interchange/SPEC.md §5 and §13 for the full reasoning.

Producer identity is self-asserted in v1

A payload's source.producer_id and source.producer_name are declared by the producer, not cryptographically authenticated by Tracepack. Nothing currently stops a different producer from claiming the same producer_id. Tracepack's UI and exports are written to never imply otherwise: look for "self-asserted" and "not cryptographically verified" language anywhere producer identity is shown. If you find a place where this isn't true (a verification badge shown without actual verification behind it, or wording that overstates what a hash proves), that's a real bug and should be reported (see below).

A note on synthesized evidence

When an interchange payload has no attachments, Tracepack synthesizes a deterministic text/plain rendering of the producer's claims to satisfy the one-evidence-item-one-file model. That rendering is generated by Tracepack, not supplied by the producer; it says so explicitly in its own text ("GENERATED BY TRACEPACK... not an original document"). Its hash proves the rendering is intact, never that an original external document existed.

Pack attestations

TracePack Attestation v1 is separate from the tracepack-evidence producer identity model.

A pack attestation binds a signed statement to one immutable pack subject digest. @tracepack/pack-attestation constructs deterministic pack snapshots and verifies the included evidence bytes against their recorded SHA-256 hashes before creating that subject. @tracepack/attestation-sigstore can then sign or verify the statement using Sigstore.

A successfully verified Sigstore attestation can authenticate the signing identity represented by the certificate and can be evaluated against explicit signer and multi-attestation policy. It does not prove that a self-asserted producer identity inside an evidence payload is genuine, that an evidence item or observation is factually true, or that the signer created the original evidence.

See packages/attestation/SPEC.md for the normative Attestation v1 rules.

Signed software releases

Tracepack uses npm provenance for public developer packages released from the public GitHub repository. The provenance statement is created from GitHub Actions workload identity and can be checked through npm. Release files are also signed without a long lived signing key and published with a Sigstore bundle that can be verified with cosign. See docs/VERIFYING_RELEASES.md for the identity pinned verification command.

This proves that a software release came from the named public repository and release workflow. It does not prove that an evidence payload came from that software, identify the person who created evidence, or prove that a claim is true. TracePack does not send evidence file contents or support conversations to Sigstore as part of attestation signing. Sigstore signing does process the canonical attestation statement, which contains its subject digest, and transparency-log upload is enabled by default. Do not place secrets or unnecessary personal data in attestation statements.

The release workflow is intentionally restricted to ace2016/tracepack. Running the same file from the private development repository cannot publish a Tracepack package.

Producer identity remains separate

Cryptographically authenticating the producer identity declared by a tracepack-evidence v1 payload remains deliberately out of scope for that contract. Software release provenance and pack attestations must not be presented as producer or payload authentication.

No home-grown signing cryptography will be added for evidence producers.

Reporting a vulnerability

Please report security issues privately rather than as a public GitHub issue. Open a private security advisory on this repository.

Please include:

  • What you found and why it's a security issue (not just a bug)
  • Steps to reproduce
  • What you'd expect to happen instead

We'll acknowledge reports and aim to respond with next steps promptly. Please don't publicly disclose a vulnerability before it's been addressed.

Scope

In scope: the packages and apps in this repository (apps/, packages/, examples/).

Out of scope: issues that require physical access to an already-unlocked device, or that rely on a compromised browser/OS. Tracepack's local-first model assumes the browser environment itself is trusted, the same way any browser-based application does.

There aren't any published security advisories