Skip to content

Attest and checksum what actually ships - #48

Merged
ivanvyd merged 1 commit into
mainfrom
fix/attest-and-checksum-what-ships
Aug 6, 2026
Merged

Attest and checksum what actually ships#48
ivanvyd merged 1 commit into
mainfrom
fix/attest-and-checksum-what-ships

Conversation

@ivanvyd

@ivanvyd ivanvyd commented Aug 6, 2026

Copy link
Copy Markdown
Owner

Verifying the published 0.1.0 release — rather than the build output — falsified both commands
SECURITY.md tells an adopter to run.

Two defects, both shipped in 0.1.0

gh attestation verify on a downloaded release binary exits 1. The attestation named only the
.nupkg files as subjects, so the three downloadable zips were never attested. Those zips are
exactly what someone without the .NET SDK downloads.

attestation subjects: ['LakeSpeak.Cli.0.1.0.nupkg', 'LakeSpeak.Genie.0.1.0.nupkg']
release assets:       3 zips, SHA256SUMS.txt, sbom.json, provenance.intoto.jsonl

sha256sum -c SHA256SUMS.txt fails four of seven entries. The file was generated with
sha256sum * across the whole build directory, so it lists the .nupkg and .snupkg files, which
are published to NuGet and never attached to the release.

LakeSpeak.Cli.0.1.0.nupkg: FAILED open or read
LakeSpeak.Cli.0.1.0.snupkg: FAILED open or read
LakeSpeak.Genie.0.1.0.nupkg: FAILED open or read
LakeSpeak.Genie.0.1.0.snupkg: FAILED open or read

The fix

Attestation subjects now include artifacts/*.zip alongside the packages, and the checksum file is
generated over *.zip — the release assets — rather than the whole directory.

Why this happened, since it is the same mistake this project keeps writing about

The verification instructions added in #46 were checked before shipping — against the rehearsal
artifacts directory, which contains the packages. Both commands passed there and failed in reality.
Testing in the wrong environment is indistinguishable from not testing, right up until someone
follows the documentation.

0.1.0 is immutable, so the docs now say what is true of it

NuGet packages cannot be withdrawn and the release is public. SECURITY.md states which release
each command applies to, and gives the form that works on 0.1.0 today — verified against the real
published assets, this time
:

$ sha256sum -c --ignore-missing SHA256SUMS.txt
lakespeak-0.1.0-linux-x64.zip: OK
lakespeak-0.1.0-osx-arm64.zip: OK
lakespeak-0.1.0-win-x64.zip: OK

It also states plainly that 0.1.0's unattested binaries are a packaging mistake rather than a
tampered file: they were produced by the same workflow run, and their digests are in that release's
SHA256SUMS.txt.

Verification

229 tests green. release.yml parses as valid YAML with the intended subject-path and checksum
command. All relative links resolve.

Verifying the published 0.1.0 release, rather than the build output,
falsified both commands SECURITY.md tells an adopter to run.

gh attestation verify on a downloaded release binary exits 1. The
attestation named only the .nupkg files as subjects, so the three
downloadable zips were never attested -- and those zips are what a person
without the .NET SDK actually downloads.

sha256sum -c SHA256SUMS.txt fails four of its seven entries. The file was
generated across the whole build directory, so it listed the .nupkg and
.snupkg files, which go to NuGet and are never attached to the release.

Both now cover what ships: the zips are attestation subjects alongside the
packages, and the checksum file is generated over the release assets only.

The cause is worth recording because it is the same mistake this project
keeps writing about. The verification instructions were checked -- against
the rehearsal artifacts directory, which contains the packages. Both
commands passed there and failed in reality. Testing in the wrong
environment is indistinguishable from not testing, right up until someone
follows the documentation.

0.1.0 is published and immutable, so SECURITY.md now says which release
each command applies to and gives the form that does work today:
sha256sum -c --ignore-missing SHA256SUMS.txt, confirmed against the real
0.1.0 assets, reports OK for all three binaries.
@ivanvyd
ivanvyd merged commit 13a870a into main Aug 6, 2026
10 checks passed
@ivanvyd
ivanvyd deleted the fix/attest-and-checksum-what-ships branch August 6, 2026 09:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant