codetruss 0.2.53 - #19
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Points the formula at the
v0.2.53release archive.That digest was measured off the downloaded release asset, not copied from the release notes, and the URL written above was fetched independently and
cmpd against it. The asset is byte-identical topublic/downloads/codetruss-cli-0.2.53.tgzin the monorepo, to the bytes codetruss.com serves, to the site'slatestpointer, and to the archive rebuilt independently in the mirror from its own lockfile.gh attestation verify codetruss-cli-0.2.53.tgz --repo CodeTruss/codetruss-clipasses — verified with--format jsonrather than a bare exit code, so the subject it actually verified (codetruss-cli-0.2.53.tgz, digest5344ab8e…) and the builder (.github/workflows/release.yml@refs/tags/v0.2.53) are on the record. The release carries all three attestations: SLSA provenance v1, CycloneDX, and the in-toto release predicate — the last confirmed through the attestations API, sincegh2.85 cannot verify a predicate signed by GitHub's release identity (dotcom.releases.github.com) under--repo.The same
cmpagainst 0.2.52 — the version this formula pointed at until now — exits 1, so the comparison is capable of failing.gh attestation verifywas likewise checked against a tampered copy of the archive (one appended byte), against the pre-transferDeliriumPulse/…slug, and against an unrelated repo; all three exit 1, and the attestations API returns 404 for the tampered digest. The exit 0 above is not vacuous.Nothing else changes.
.github/workflows/test.ymlderives the expected version frombrew inforather than a literal, so it needs no edit; the version assertion in CI is what proves the installed binary matches the formula.What 0.2.53 carries
Unlike 0.2.52, which was documentation only and moved the compiled bundle by exactly one byte, this release changes analyzer behaviour.
dist/cli.cjsgoes from 819,902 to 828,029 bytes, 4 changed lines out of 296.It came out of a cross-tool benchmark against ten repositories chosen by a rule written before either tool ran — a corpus we did not pick — comparing CodeTruss 0.2.51 against Semgrep CE. It found false positives our own eight-repository sweep had not, including a CRITICAL.
A drizzle query was reported CRITICAL for being a SQL injection when it is the documented safe construction. firecrawl's
apps/api/src/db/rpc.ts:98isdb.execute(sql`select … ${params.team_id} …`)— a tagged template with bound parameters — and 0.2.51 called it CWE-89 CRITICAL, "untrusted input is concatenated". The rule already had this exemption for Prisma, but expressed it as a method-name list, so it protected one library by name rather than the construction by shape. It now matches the shape, which covers drizzle, postgres.js, slonik and the next library that builds queries the same way. Untagged template literals still fire, andsql.raw()is still a sink, including nested inside a tagged template.The same rule was silent on a genuinely dynamic query, which Semgrep caught. uptime-kuma's
server/monitor-types/postgres.js:63isclient.query(query, …)wherequeryis the function's own parameter — nothing in the file constrains what a caller can run. A bare parameter had never counted as a source, so we missed it. It now reports at HIGH.Typed credentials in test paths are downgraded on the value, not the path. The test-context downgrade previously reached only the generic-password pattern; it now reaches AWS/GitHub/Stripe/Anthropic/OpenAI/Google/Slack via a value-shape predicate measured at zero hits across 20,000 random base62 bodies. Database URLs and PEM private-key blocks are deliberately excluded — a real connection string or key in a fixture is still a real leak. 25 HIGH findings became LOW.
Receipts move to the
local-registry-v5analysis profile. Every superseded profile keeps a frozen renderer so receipts signed under it still verify byte-for-byte; v1 through v4 pin unchanged SHA-256s, and v4's is character-identical to what 0.2.52 shipped.Verified against the published archive, not a local build
Installed into a dedicated
npm --prefixand invoked by absolute path — this machine also carries a stale globalcodetruss(0.2.28) that must not be allowed to answer:codetruss --version→codetruss 0.2.536ff68d3b: the CRITICAL atapps/api/src/db/rpc.ts:98is gone (155 findings → 154;sql-injection1 → 0).77d1a0c5:server/monitor-types/postgres.js:63is now reported at HIGH (92 findings → 99;sql-injection0 → 7, also catching the same shape inmssql.js,mysql.jsandoracledb.js).Profile: `local-registry-v5`andcodetruss verify latestaccepts its signature.The rule was not simply switched off: it lost one finding on firecrawl and gained seven on uptime-kuma.
One known wart
README.mdinside this archive still says receipts identify the "15-passlocal-registry-v4profile". As of 0.2.53 they identifylocal-registry-v5, and theCHANGELOG.mdin the same archive says so. The pass count is right; the profile identifier is stale. It is recorded rather than patched, because these bytes are already tagged, attested and served — a correction belongs in 0.2.54.🤖 Generated with Claude Code