Skip to content

Harden the release scripts and connection string redaction - #313

Merged
FreeAndNil merged 5 commits into
masterfrom
Feature/312-more-hardening
Sep 2, 2026
Merged

Harden the release scripts and connection string redaction#313
FreeAndNil merged 5 commits into
masterfrom
Feature/312-more-hardening

Conversation

@FreeAndNil

Copy link
Copy Markdown
Contributor

Follow-ups from the second security scan, on top of 3.4.0.

  • verify-release.sh/.ps1: KEYS was downloaded into the directory being
    verified, so a planted KEYS file was the one imported and its keys were
    accepted as release keys. Both scripts now download into a temporary
    keyring of their own. Not a regression, the bare wget line dates from 3.2.0.
  • The release scripts relied on $PSNativeCommandUseErrorActionPreference,
    which only exists from PowerShell 7.4. On 5.1 the assignment was a silent
    no-op and a failing gpg --verify was ignored. Added #Requires -Version 7.4,
    and release-review.adoc now installs PowerShell 7 and uses pwsh.
  • AdoNetAppender: connection string redaction hid password-bearing keywords,
    which missed Extended Properties and AccessToken. Replaced with an
    allowlist of diagnostic keywords.
  • Removed graphify and its 26 MB of generated output from the tree.

@FreeAndNil
FreeAndNil force-pushed the Feature/312-more-hardening branch from 711e9b9 to ddf09c1 Compare September 1, 2026 18:32
@FreeAndNil FreeAndNil added this to the 3.4.1 milestone Sep 1, 2026
@FreeAndNil
FreeAndNil force-pushed the Feature/312-more-hardening branch 2 times, most recently from f48a1d1 to 937df6b Compare September 1, 2026 19:40
"wget URL" refuses to overwrite, so a KEYS file planted next to the
artifacts stayed put, the real download landed in KEYS.1, and the planted
keys were imported into the verification key ring. Artifacts signed by
whoever placed it then verified and the script exited 0.

Both scripts now download into the temporary key ring directory and never
read KEYS from the directory being verified.

Not a regression: the same fixture bypasses the pre-rewrite script, which
carried the bare wget line from 3.2.0 on.
CLAUDE.md told AI coding agents to execute a "graphify" binary resolved
from PATH that is not vendored, pinned or checksummed anywhere in the tree.
The generated graphify-out/ (26 MB, two tracked files) goes with it, along
with its .gitignore block.
All native command error handling in these scripts rests on
$PSNativeCommandUseErrorActionPreference, which exists only from 7.4. Under
Windows PowerShell 5.1 the assignment is a silent no-op, so a failing
gpg --verify was ignored and verify-release.ps1 reported success and exited
0, undoing the fail-closed work in 3.4.0.

The comments claimed 7.3, but there it was only an experimental feature.

release-review.adoc said "Windows (PowerShell)" and never installed
PowerShell 7, so it now installs it and runs the script with pwsh.
Hiding password-bearing keywords missed Extended Properties, which nests a
whole connection string the parser returns as one opaque value, and keywords
such as AccessToken. Only keywords naming the server and account are kept.

The old test only covered a flat Password=, which is why this survived.
@FreeAndNil
FreeAndNil force-pushed the Feature/312-more-hardening branch from 937df6b to 77af21a Compare September 2, 2026 04:31

@swebb2066 swebb2066 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Temporarily disabling keyboxd in the configuration file seems to be the only way to avoid this, which is rather ugly

Comment thread scripts/verify-release.ps1 Outdated
gpg ignores --keyring where common.conf sets use-keyboxd, so the import landed in
the reviewer's own key database and the verification ran against it. Measured: a
decoy signed by a key they already held verified with exit 0; with a throwaway
GNUPGHOME it is rejected with exit 2.

Two defects in the change itself, both found in review: "export X=$(mktemp -d)"
masks a failed mktemp under set -e and an empty GNUPGHOME is the default home, and
a failing gpgconf aborts the rest of the cleanup in both scripts.

Pester tests for the stages needing neither network nor gpg, run in CI. Pester 5.9
ships on all three runner images.

Reported by @swebb2066.
@FreeAndNil
FreeAndNil merged commit 34e4289 into master Sep 2, 2026
3 checks passed
@FreeAndNil
FreeAndNil deleted the Feature/312-more-hardening branch September 2, 2026 19:24
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.

3 participants