docs: record 5.2.2 release audit results

This commit is contained in:
Cristian Cezar Moisés 2026-08-31 14:28:42 -03:00
commit 0a9a63db66
6 changed files with 108 additions and 55 deletions

View file

@ -56,8 +56,9 @@ and LFS pointers; textual assembly is a permitted source type.
Archive inspection must also fail closed at bounded recursion depth, member Archive inspection must also fail closed at bounded recursion depth, member
count, individual expanded size, and total expanded size so a nested archive or count, individual expanded size, and total expanded size so a nested archive or
decompression bomb cannot turn the release scanner into an unbounded resource decompression bomb cannot turn the release scanner into an unbounded resource
consumer. This hardening and its adversarial fixtures are release-blocking and consumer. On committed Linux candidate `ff99770`, this hardening and its
remain `PENDING` until rerun on the exact candidate. adversarial fixtures passed all 39 source-only scanner cases, including GNU
thin-archive and safe-diagnostic-path cases.
An unknown `.bin` fails by default. A necessary binary data fixture can be An unknown `.bin` fails by default. A necessary binary data fixture can be
declared only through `--data-manifest`, with four tab-separated fields for declared only through `--data-manifest`, with four tab-separated fields for
@ -98,15 +99,32 @@ Relevant review layers include:
| Source reproducibility | two `make dist` runs with identical committed input and epoch | Requires equal SHA-256 digests and clean archive scans | | Source reproducibility | two `make dist` runs with identical committed input and epoch | Requires equal SHA-256 digests and clean archive scans |
| Installed package | target-native package inspection and `scripts/test-installed-zupt.sh` | Applies only to the exact OS/release/architecture tested | | Installed package | target-native package inspection and `scripts/test-installed-zupt.sh` | Applies only to the exact OS/release/architecture tested |
This table identifies evidence, not results. The release validation report and This table identifies evidence layers rather than results. Missing tools, OBS
`packaging/opensuse/README.md` record `PASS`, `FAIL`, or `SKIP` for each actual access, other architectures, Leap, and SLE must not be reported as passing
run. Missing tools, OBS access, other architectures, Leap, and SLE must not be without evidence.
reported as passing without evidence.
The 5.2.2 key-file, terminal-comment, password-prompt, explicit-Bash regression, ## Committed-candidate local Linux evidence
and scanner-resource-limit changes were added during the final self-audit. All
affected checks and the complete required suite must be rerun after they land; The following upstream self-audit results apply to commit `ff99770` on the
no earlier result is a final-candidate `PASS`. recorded local Linux environments. They are not an independent certification,
a result for later commits, or evidence that release assets have been published.
| Gate | Result | Recorded evidence |
|---|---|---|
| Full project gate | PASS | `make release-check` completed successfully on `ff99770`, including the late key-file, terminal-comment, password-prompt, explicit-Bash, and scanner-limit regressions. |
| Packaging policy/syntax | PASS | `PASS=49 FAIL=0 SKIP=0`. |
| Source-only scanner adversarial suite | PASS | 39/39, including GNU thin archives, bounded archive expansion, and safe diagnostic cases. |
| Strict compilers and compiler analyzer | PASS | GCC and Clang strict builds passed; GCC `-fanalyzer` passed. |
| Static-analysis suite | PASS | 9/9 in the full tool-enabled run. A separate reduced-environment `release-check` run completed six available checks and reported `cppcheck` unavailable; unavailable tooling was not relabelled as a pass. |
| Dynamic analysis | PASS | ASan, UBSan, and LSan runs passed. |
| Mutation fuzzing | PASS | 1,000 mutation iterations completed without a sanitizer-detected crash. |
An earlier off-screen GUI smoke run remains supporting evidence, but is not
represented as an exact-`ff99770` GUI-package result. Native Windows and macOS
gates, hosted GitHub CI and release promotion, authenticated OBS validation,
and resolution of the openSUSE automatic `debugsource` rpmlint `no-binary`
finding remain pending. The immutable tag and its final artifacts must not be
described as released until those applicable gates complete.
## Cryptographic review boundary ## Cryptographic review boundary

View file

@ -133,7 +133,7 @@ path; older readers are not claimed to accept every archive written by 5.2.2.
stored as hexadecimal text with its source tag/commit, password, input hash, stored as hexadecimal text with its source tag/commit, password, input hash,
and archive hash. The 5.2.2 candidate lists, tests, extracts, and restores it byte-exact; and archive hash. The 5.2.2 candidate lists, tests, extracts, and restores it byte-exact;
the legacy index has no whole-image hash and produces an explicit warning. the legacy index has no whole-image hash and produces an explicit warning.
The exact final candidate must repeat this gate, and no broader historical The full local Linux gate passed on commit `ff99770`; no broader historical
compatibility claim is made. compatibility claim is made.
- Serialize fixed-width archive/header, footer, index and PBKDF iteration - Serialize fixed-width archive/header, footer, index and PBKDF iteration
fields explicitly in little-endian order. Varint readers now reject overlong fields explicitly in little-endian order. Varint readers now reject overlong
@ -234,16 +234,20 @@ path; older readers are not claimed to accept every archive written by 5.2.2.
- Updated the README, installation, distribution, security, audit, GUI, and - Updated the README, installation, distribution, security, audit, GUI, and
manual-page documentation for the 5.2.2 source-only workflow. manual-page documentation for the 5.2.2 source-only workflow.
Validation results are recorded by the release process and the openSUSE The committed Linux candidate `ff99770` passed the full local
packaging README. A missing tool or unexecuted platform remains `SKIP`; this `make release-check`. Recorded results include packaging
entry does not claim successful OBS, architecture, Leap, or SLE builds without `PASS=49 FAIL=0 SKIP=0`; 39/39 source-only scanner cases, including GNU thin
corresponding evidence. Runs made before the final positional-AAD and archives and safe diagnostics; strict GCC and Clang; GCC `-fanalyzer`; 9/9 in
mandatory-AIT changes are intermediate diagnostic evidence, not final release the full tool-enabled static-analysis run; ASan/UBSan/LSan; and 1,000
gates. Private-key creation/parsing, terminal-safe comment rendering, prompt mutation-fuzz iterations without a sanitizer-detected crash. An earlier
signal cleanup, explicit-Bash regression execution, and scanner bomb limits are off-screen GUI smoke run remains supporting rather than exact-candidate package
also final self-audit release blockers. Their focused checks and the complete evidence.
required suite remain `PENDING` until the exact candidate is rerun before
tagging; this entry does not claim a final `PASS`. These are upstream self-audit results, not independent certification or a
published-release claim. Native Windows and macOS, hosted GitHub CI and release
promotion, authenticated OBS, and the openSUSE automatic `debugsource` rpmlint
`no-binary` finding remain pending. Missing or unexecuted gates remain `SKIP`,
not `PASS`.
## [5.2.1] — 2026-07-12 — GUI Verify/Extract robustness; refreshed comparison + audit tables ## [5.2.1] — 2026-07-12 — GUI Verify/Extract robustness; refreshed comparison + audit tables

View file

@ -164,8 +164,9 @@ allowed only with `--data-manifest FILE`; each tab-separated record must name
its path, purpose, provenance, and SPDX license. This exception never permits its path, purpose, provenance, and SPDX license. This exception never permits
compiled or executable magic, packages, AppImages, bytecode, or Git LFS compiled or executable magic, packages, AppImages, bytecode, or Git LFS
pointers. Nested scans cap recursion, member count, individual expansion, and pointers. Nested scans cap recursion, member count, individual expansion, and
total expanded bytes and fail closed at a limit. The exact candidate must rerun total expanded bytes and fail closed at a limit. On committed Linux candidate
the scanner-bomb fixtures before any release result is marked `PASS`. `ff99770`, all 39 source-only scanner cases passed, including GNU thin archives,
scanner-bomb limits, and safe diagnostic cases.
## Build from source ## Build from source
@ -282,16 +283,19 @@ devices are accepted only when their capacity can be determined and is large
enough. The privileged undersized-loop-device regression is reported `SKIP`, enough. The privileged undersized-loop-device regression is reported `SKIP`,
not `PASS`, when the environment cannot create a loop device. not `PASS`, when the environment cannot create a loop device.
The final release gate must also rerun the positional-AAD and mandatory-AIT The committed Linux candidate `ff99770` passed the full local
regressions on the exact tagged candidate. Results obtained before those final `make release-check`. Recorded results include packaging
integrity changes are useful diagnostic evidence, but are not promoted as final `PASS=49 FAIL=0 SKIP=0`, the 39/39 source-only scanner suite, strict GCC and
release results. The openSUSE matrix records unexecuted gates as `SKIP`. Clang, GCC `-fanalyzer`, a 9/9 full tool-enabled static-analysis run,
ASan/UBSan/LSan, and 1,000 mutation-fuzz iterations without a
sanitizer-detected crash. An earlier off-screen GUI smoke run remains supporting
evidence rather than an exact-candidate package result.
Private-key creation/parsing, terminal-safe comment display, POSIX prompt signal These are upstream local self-audit results, not independent certification or a
cleanup, explicit-Bash regression execution, and scanner-resource-limit changes published-release claim. Native Windows and macOS, hosted GitHub CI/release
are final self-audit release blockers. Their focused regressions and the full promotion, authenticated OBS, and resolution of the openSUSE automatic
required suite remain pending until rerun on the exact candidate; this README `debugsource` rpmlint `no-binary` finding remain pending. Unexecuted gates are
does not convert intermediate results into a final `PASS`. `SKIP`, never `PASS`.
On Windows, 5.2.2 scopes output handling to normal local Win32 paths. A MinGW On Windows, 5.2.2 scopes output handling to normal local Win32 paths. A MinGW
cross-build or Wine run is not native-Windows evidence; the `windows-latest` cross-build or Wine run is not native-Windows evidence; the `windows-latest`
@ -329,8 +333,8 @@ compatibility scope includes an actual v5.2.1 password-encrypted, deduplicated
disk archive with a DATA/DATA/REF/DATA sequence using the fixed-width legacy index disk archive with a DATA/DATA/REF/DATA sequence using the fixed-width legacy index
and the legacy linear AAD sequence. The repository stores that 718-byte archive and the legacy linear AAD sequence. The repository stores that 718-byte archive
as auditable hexadecimal text with its provenance and SHA-256; the candidate as auditable hexadecimal text with its provenance and SHA-256; the candidate
lists, tests, extracts, and restores it byte-exact. The exact final candidate must repeat lists, tests, extracts, and restores it byte-exact. The full local Linux gate
the gate. This is not a claim that a 5.2.1 reader understands every new passed on commit `ff99770`. This is not a claim that a 5.2.1 reader understands every new
flag-gated 5.2.2 encoding or that every historical combination was tested. flag-gated 5.2.2 encoding or that every historical combination was tested.
The candidate commands and outcome fields for 5.2.2 are maintained in the The candidate commands and outcome fields for 5.2.2 are maintained in the

View file

@ -48,7 +48,7 @@ password read; do not reuse it as a multi-record protocol channel.
On POSIX terminals, the explicit prompt saves terminal state and installs On POSIX terminals, the explicit prompt saves terminal state and installs
signal-aware cleanup so a handled interruption restores echo and other changed signal-aware cleanup so a handled interruption restores echo and other changed
settings before termination. This behavior is covered by a PTY regression and settings before termination. This behavior is covered by a PTY regression and
must be rerun on the exact release candidate. passed in the full local Linux gate for commit `ff99770`.
## Native key files ## Native key files
@ -225,7 +225,7 @@ gate was rerun on every platform:
whole-image content hash. Its regression fixture is an actual v5.2.1 whole-image content hash. Its regression fixture is an actual v5.2.1
password-encrypted DATA/DATA/REF/DATA disk archive stored as hexadecimal text with password-encrypted DATA/DATA/REF/DATA disk archive stored as hexadecimal text with
source and hash provenance. The candidate lists, tests, extracts, and restores it source and hash provenance. The candidate lists, tests, extracts, and restores it
byte-exact; the exact final candidate must repeat that gate. This does not byte-exact; the full local Linux gate passed on commit `ff99770`. This does not
claim that 5.2.1 readers accept the new flag-gated 5.2.2 records or that every claim that 5.2.1 readers accept the new flag-gated 5.2.2 records or that every
historical encrypted+dedup combination was validated. historical encrypted+dedup combination was validated.
@ -245,8 +245,8 @@ scripts/check-source-only.sh --archive /path/to/zupt-5.2.2.tar.gz
Nested archive inspection is required to enforce bounded recursion, member Nested archive inspection is required to enforce bounded recursion, member
count, per-entry expanded size, and total expanded size, and to fail closed on count, per-entry expanded size, and total expanded size, and to fail closed on
limit violations. The resource-limit regressions and all other late self-audit limit violations. On commit `ff99770`, the source-only scanner suite passed
fixes remain pending until the exact candidate completes the final gate suite. 39/39, including GNU thin archives, resource-limit cases, and safe diagnostics.
DEB, binary RPM, SRPM, notice-bearing Linux tar.xz, source-only portable GUI DEB, binary RPM, SRPM, notice-bearing Linux tar.xz, source-only portable GUI
ZIP, Windows ZIP, and macOS DMG release assets are separate outputs. An ZIP, Windows ZIP, and macOS DMG release assets are separate outputs. An
@ -285,16 +285,18 @@ make test-asan-run
The first command builds the sanitizer configuration; the second executes its The first command builds the sanitizer configuration; the second executes its
test suite. Neither substitutes for the normal optimized build and tests. test suite. Neither substitutes for the normal optimized build and tests.
Because the positional-AAD and mandatory-AIT behavior changed late in the The full local Linux `make release-check` passed on committed candidate
candidate, earlier successful runs are intermediate evidence only. The exact `ff99770`. Its recorded evidence includes packaging `PASS=49 FAIL=0 SKIP=0`,
release candidate must rerun the affected regressions and the complete required the 39/39 source-only scanner suite, strict GCC and Clang builds, GCC
suite; unavailable environments remain `SKIP`, not `PASS`. `-fanalyzer`, 9/9 static analysis in a tool-enabled run, ASan/UBSan/LSan, and
1,000 mutation-fuzz iterations without a sanitizer-detected crash. An earlier
off-screen GUI smoke run is supporting evidence, not an exact-candidate package
result.
The same rule applies to private-key creation/parsing, terminal-safe comment These are upstream self-audit results, not independent certification. Native
display, POSIX prompt signal cleanup, explicit Bash regression execution, and Windows and macOS, hosted GitHub CI/release promotion, authenticated OBS, and
source-scanner resource limits added during the final self-audit. This document the openSUSE automatic `debugsource` rpmlint `no-binary` finding remain pending.
records intended candidate behavior, not a final `PASS` for work still being An unavailable or unexecuted environment remains `SKIP`, never `PASS`.
integrated or rerun.
Run target-native static analyzers and package checks as additional evidence. Run target-native static analyzers and package checks as additional evidence.
Do not infer x86_64, aarch64, ppc64le, s390x, riscv64, macOS, Windows, Leap, or Do not infer x86_64, aarch64, ppc64le, s390x, riscv64, macOS, Windows, Leap, or

View file

@ -240,9 +240,9 @@ LFS pointers.
Nested inspection is itself an untrusted-input boundary. The release scanner Nested inspection is itself an untrusted-input boundary. The release scanner
must cap recursion depth, archive members, per-entry expansion, and total must cap recursion depth, archive members, per-entry expansion, and total
expanded bytes and fail closed when a cap is reached. Scanner bomb regressions expanded bytes and fail closed when a cap is reached. Commit `ff99770` passed
and all other late self-audit fixes are pending until rerun on the exact all 39 source-only scanner cases, including GNU thin archives, scanner-bomb
candidate. limits, and safe diagnostic cases.
DEB, binary RPM, SRPM, notice-bearing Linux tar.xz, source-only portable GUI DEB, binary RPM, SRPM, notice-bearing Linux tar.xz, source-only portable GUI
ZIP, Windows ZIP, and macOS DMG files can be published separately from the ZIP, Windows ZIP, and macOS DMG files can be published separately from the
@ -259,6 +259,15 @@ after source scans and an exact safe-member check. AppDir and Flatpak bundles
and GUI platform installers remain excluded; Windows ZIP and macOS DMG outputs and GUI platform installers remain excluded; Windows ZIP and macOS DMG outputs
remain CLI-only. remain CLI-only.
The committed Linux candidate `ff99770` passed the full local
`make release-check`: packaging reported `PASS=49 FAIL=0 SKIP=0`; strict GCC,
strict Clang, GCC `-fanalyzer`, the 9/9 tool-enabled static-analysis run,
ASan/UBSan/LSan, and 1,000 mutation-fuzz iterations passed. Earlier off-screen
GUI smoke evidence is retained separately. This upstream self-review is not an
independent certification, and native Windows/macOS, hosted GitHub CI and
release promotion, authenticated OBS, and the openSUSE automatic `debugsource`
rpmlint `no-binary` finding remain pending.
## Historical compatibility notes ## Historical compatibility notes
These are historical facts about earlier releases, retained to support recovery: These are historical facts about earlier releases, retained to support recovery:
@ -279,7 +288,7 @@ These are historical facts about earlier releases, retained to support recovery:
v5.2.1 password-encrypted DATA/DATA/REF/DATA disk fixture is stored as hexadecimal v5.2.1 password-encrypted DATA/DATA/REF/DATA disk fixture is stored as hexadecimal
text with source and hash provenance. The candidate lists, tests, extracts, and restores text with source and hash provenance. The candidate lists, tests, extracts, and restores
it byte-exact, with a warning that the legacy index has no whole-image hash; it byte-exact, with a warning that the legacy index has no whole-image hash;
the exact final candidate must repeat that gate. Older readers are not the full local Linux gate passed on commit `ff99770`. Older readers are not
claimed to accept new flag-gated 5.2.2 records, and untested historical mode claimed to accept new flag-gated 5.2.2 records, and untested historical mode
combinations remain unclaimed. combinations remain unclaimed.

View file

@ -97,8 +97,8 @@ immutable v5.2.1 tag is stored as hexadecimal text with its source and SHA-256
provenance. The 5.2.2 reader reconstructs the legacy linear block-AAD sequence, provenance. The 5.2.2 reader reconstructs the legacy linear block-AAD sequence,
lists, tests, extracts, and restores its input byte-exact through the lists, tests, extracts, and restores its input byte-exact through the
fixed-width legacy disk-index parser. This does not cover every historical mode fixed-width legacy disk-index parser. This does not cover every historical mode
and must be rerun on the final candidate before it is promoted as a release and passed in the full local Linux gate for commit `ff99770`; the target RPM
gate. `%check` must still exercise it before that package is promoted.
Disk restore also snapshots the measured archive into a private scratch file Disk restore also snapshots the measured archive into a private scratch file
before opening the destination, then validates and restores from that same before opening the destination, then validates and restores from that same
@ -153,7 +153,23 @@ install it in a disposable openSUSE environment and execute
`scripts/test-installed-zupt.sh`. Do not claim a repository or architecture `scripts/test-installed-zupt.sh`. Do not claim a repository or architecture
as supported until its build and installed smoke test have actually passed. as supported until its build and installed smoke test have actually passed.
## Validation matrix for this handoff ## Committed-candidate local Linux validation
Commit `ff99770` passed the full local `make release-check`. Packaging policy
and syntax reported `PASS=49 FAIL=0 SKIP=0`; source-only scanner testing passed
39/39, including GNU thin archives and safe diagnostic cases; strict GCC,
strict Clang, GCC `-fanalyzer`, the 9/9 full tool-enabled static-analysis run,
ASan/UBSan/LSan, and 1,000 mutation-fuzz iterations passed. A reduced
environment completed six available static checks and reported `cppcheck`
unavailable rather than passing it. Earlier off-screen GUI smoke evidence is
supporting evidence, not an exact-commit package result.
These local upstream results do not establish native Windows or macOS success,
hosted GitHub CI/release promotion, authenticated OBS acceptance, or resolution
of the automatic openSUSE `debugsource` rpmlint `no-binary` finding. Those gates
remain pending.
## Prior openSUSE packaging validation
The local results below were produced on 2026-08-24 from the 5.2.2 candidate The local results below were produced on 2026-08-24 from the 5.2.2 candidate
snapshot captured for the packaging run, in a disposable openSUSE Tumbleweed snapshot captured for the packaging run, in a disposable openSUSE Tumbleweed