SPECIFICATIONS IN-TOTO PREDICATE TYPE

Attestree golden VHDX build, v1

The predicate that records how a golden Windows image for the detonation sandbox was built: the sandbox agent it carries, the Syft binary, the base image, and how the image is signed. It travels beside an SLSA Provenance v1 statement over the same image.

TYPE URI
https://attestree.com/attestation/golden-vhdx-build/v1
KIND
in-toto predicate type
USED AS
predicateType of the in-toto Statement v1 in wep.in-toto.json, written beside the image by wep-golden-vhdx-sign
SIGNED BY
In an operator build, the statement file is not signed itself; the image bytes are, with the operator’s ECDSA P-256 key ({vhdx}.sig)
EMITTED SINCE
The golden-image tools from platform 0.240.0
REPLACES
https://wep.dev/golden-vhdx-build/v1, the same shape. Images signed before carry it, and verifiers still accept it.
PAGE UPDATED
2026-10-05

Where it comes from

Attestree publishes no golden image. Every operator builds their own, from their own Windows ISO, with the golden-image tools kit that ships with each platform release, and signs it with a local operator key. The sign step, wep-golden-vhdx-sign, writes three things beside the VHDX:

  • <file>.vhdx.sig: an ECDSA P-256 signature over the SHA-256 of the VHDX bytes, in IEEE P1363 form (r‖s), Base64-encoded;
  • slsa.in-toto.json: an in-toto Statement v1 with SLSA Provenance v1, whose build type is golden-vhdx/v1;
  • wep.in-toto.json: an in-toto Statement v1 with this predicate.

The two statements share one subject. The SLSA statement carries the build inputs; this one carries what does not fit SLSA’s schema.

The subject

Exactly one: the VHDX, by file name, with the SHA-256 of its bytes. The name is informational; match on the digest.

The predicate

Every field is a required string.

{
  "_type": "https://in-toto.io/Statement/v1",
  "subject": [
    { "name": "<file>.vhdx", "digest": { "sha256": "<SHA-256 of the VHDX bytes>" } }
  ],
  "predicateType": "https://attestree.com/attestation/golden-vhdx-build/v1",
  "predicate": {
    "bundleFormat": "wep-vhdx-v1",
    "agentCommit": "…",
    "agentVersion": "…",
    "syftVersion": "…",
    "syftSha256": "…",
    "baseImageSha256": "…",
    "powerShellSdkVersion": "…",
    "windowsBuildNumber": "…",
    "signerAlgorithm": "ecdsa-p256",
    "signatureFormat": "ieee-p1363"
  }
}
FieldMeaning
bundleFormatA closed set. v1 has one value, wep-vhdx-v1. A new value needs a new version of this page.
agentCommitThe source commit of the sandbox agent the image carries.
agentVersionIts version.
syftVersion, syftSha256The Syft binary baked into the image, and its SHA-256.
baseImageSha256The SHA-256 of the Windows ISO the image was built from.
powerShellSdkVersionThe PowerShell SDK version the sandbox agent uses.
windowsBuildNumberThe Windows build the image runs.
signerAlgorithmAlways ecdsa-p256: how .sig is made.
signatureFormatAlways ieee-p1363: how .sig is encoded.

What the signature means

What is signed is the image. The operator’s key signed these exact VHDX bytes; the detonation broker checks that signature against the public key you planted as its trust anchor before it uses the image. The statement files record which inputs the operator says built it. In an operator build they are not signed on their own, so they are as trustworthy as the place you keep them, and their subject digest ties them to the signed image.

A release pipeline that would attest both statements to a published image with cosign, under the workflow’s own identity, exists but is dormant: no golden image has been published and none is planned.

How to verify

Check the image signature with the kit’s verifier and the operator’s public key:

wep-golden-vhdx-verify --vhdx <file>.vhdx --public-key <base64 SubjectPublicKeyInfo>

Then check that the subject digest in wep.in-toto.json equals the SHA-256 of the same VHDX, and read the fields. By hand: SHA-256 the VHDX, and verify the 64-byte r‖s signature in .sig over that digest with the P-256 public key.