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"
}
}
| Field | Meaning |
|---|---|
bundleFormat | A closed set. v1 has one value, wep-vhdx-v1. A new value needs a new version of this page. |
agentCommit | The source commit of the sandbox agent the image carries. |
agentVersion | Its version. |
syftVersion, syftSha256 | The Syft binary baked into the image, and its SHA-256. |
baseImageSha256 | The SHA-256 of the Windows ISO the image was built from. |
powerShellSdkVersion | The PowerShell SDK version the sandbox agent uses. |
windowsBuildNumber | The Windows build the image runs. |
signerAlgorithm | Always ecdsa-p256: how .sig is made. |
signatureFormat | Always 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.