feat!: cache out of the scanned tree, third-party licenses, symlink reporting (1.4.0) - #40
Merged
Conversation
…ses, report symlinks (1.4.0) BREAKING: the incremental cache now lives in a per-user cache directory (XDG_CACHE_HOME/HOME on unix, LOCALAPPDATA on Windows) instead of .siloscan/cache inside the scanned tree. An in-tree cache is never read. BREAKING: duplicate-block findings are off by default; duplication metrics are unchanged. Enable with [duplication] report_blocks = true or by loading a duplication gate rule. - a cache committed into a repository can no longer suppress findings: the poisoning attack worked against 1.3.0 through an archive extracted to a predictable path, because tar preserves the 0600 mode the salt provenance check relied on - THIRD-PARTY-LICENSES generated from the linked dependency set and shipped in every release archive, plus an SBOM and SHA256SUMS - symlinks are recorded in skipped, distinguishing targets inside the scan root from targets outside it; --follow-symlinks opts in and still refuses to leave the tree - --min-severity filters reported findings and is recorded in the report - generic secret rules: credentialed URLs, AWS secret access keys, and high-entropy assignments - scan warnings reach SARIF via toolExecutionNotifications - actions pinned by commit SHA, --locked release builds, deny.toml, least-privilege workflow permissions - cache entries older than 30 days are swept
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.
Closes the two confirmed blockers from the v1.3.0 verification gate, plus the adoption and supply-chain findings behind them. Cut as 1.4.0: the cache location and the duplicate-block default both change behavior.
Blockers
Cache poisoning via archive-delivered trees. Against shipped 1.3.0: forge a cache entry with a valid tag, ship the tree as a tar.gz that extracts to a predictable path (Docker WORKDIR, CI checkout), and siloscan reports a tree containing a live-format AWS key as clean, exit 0. tar preserves the 0600 mode the salt provenance check depended on, leaving only absolute-path binding, which a published Dockerfile defeats. Rather than patch the check, the cache moves out of the scanned tree: a per-user cache directory keyed by canonical scan root, with an in-tree .siloscan/cache never read (and never deleted - that is the user's repository). Verified: the attack reproduces on 1.3.0 and fails here.
Release archives shipped 139 statically linked crates with no license texts. THIRD-PARTY-LICENSES is now generated from the actual linked dependency set (201 crates, hard-failing if any yields no text) and included in all three archives.
Also
Verification