go-skeptic
Version updated for https://github.com/TGPSKI/skeptic to version v0.3.1.
- This action is used across all versions by 0 repositories.
Action Type
This is a Composite action.
Go to the GitHub Marketplace to find the latest changes.
Action Summary
skeptic is a local repository trust auditor that detects structural vulnerabilities in the gaps between existing security tools, focusing on attack-enabling conditions rather than artifacts. It targets CI/CD trust boundary violations, agentic ecosystem poisoning, and “nobody reviews this” attack surfaces by scanning filesystems for specific patterns and behaviors.
What’s Changed
Fixed
- Apply
--ignore-pathsto theGRAPH-,DEP-, andPROV-check families. All three walk the tree themselves and never received the patterns, so an explicitly excluded directory still producedhighandcriticalfindings that counted toward--fail-on. They also reported the walked path rather than one relative to the scan root, which no repo-relative pattern could match and which leaked the scanning host’s directory layout. The matcher moves tointernal/pathfilterso the two walkers cannot disagree about what “ignored” means (#88) - Omit waived findings from SARIF. Code scanning turns every result into an
alert and does not honor
result.suppressions, so a waived finding opened an alert the repository had already reviewed and failed the check on any pull request touching that file. The complete record stays in the JSON report, which carriessuppressedandsuppression_reason(#96, #98) - Label waived findings in markdown output. They rendered identically to live ones, reading as open findings nobody had acted on (#96)
model.ExpandHomePathconcatenated the home directory with the rest of the path, so~/foo/barbecameC:\Users\me/foo/baron Windows (#66)correlation.filePathRelativeToRepoaccepted paths outside the repository on Windows.filepath.IsAbsis false for a rooted path with no volume, so/etc/passwdwas joined onto the repo root and passed containment (#66)security.CheckWorldWritableArtifactsreported every artifact as world-writable on Windows. Go synthesizes0666for any writable file there, so the POSIX other-write bit carries no information. It now reports nothing on Windows rather than noise (#66)corpus.groupFindingsByArtifactbucketed a finding under an empty artifact ID when its path began with a separator (#66)- The results artifact was named from
formatandfail-onalone, so two invocations of the action in one job collided
Added
windows-latestjob runninggo vetandgo test -race.internal/corpus/flock_windows.goshipped in v0.3.0 and had never executed; its first run confirmedLockFileEx/UnlockFileExwork. Integration tests stay POSIX-only (#66)- Sigstore build provenance on every release archive and
checksums.txt, viaactions/attest-build-provenance. Verify withgh attestation verify <archive> --repo TGPSKI/skeptic. Attestation runs before the release is published, so a failure produces no release; dry runs skip it (#4) - Committed
.skeptic.jsonand.skeptic-waivers.json. They gate this repository’s CI and are the reference pair to copy. Markdown stays scanned; accepted findings are waived with afile_sha256pin, so a waiver lapses when the file changes (#65) make waivers-checkandmake waivers-refresh. Editing a waived file breaks its pin, which is the mechanism working and needs a supported way to re-pin.waivers-refreshprints the findings each waiver will suppress again, because re-pinning without reading turns a waiver back into an ignore rule (#93).github/workflows/ruleset-drift.yml,scripts/ruleset-drift.py, andmake ruleset-driftcompare committed.github/ruleset-*.jsonagainst the live rulesets weekly, on dispatch, and on any PR touching them. A token without repo admin scope receives a reduced view withbypass_actorsabsent, which the script detects and reports as a skip rather than diffing against it (#85)run-idaction output, carried into the results artifact name.gitattributespinning LF on checkout, so Windowscore.autocrlfcannot rewrite line endings and breakgofmtor a fixture hash (#66)
Changed
- The CI self-scan blocks. It discarded stderr and its exit code with
|| true, so 487 findings and a 100/100 risk score enforced nothing. It now runs through the local composite action, which also exercisesaction.ymlon every CI run (#65) - The release workflow waits for
ci.ymlto reachcompletedinstead of reading its conclusion once. An in-progress run has a null conclusion and a run not yet created returns nothing, and both read as failure — exactly the window between merging and dispatching a release (#67) .github/ruleset-main.jsondeclared"bypass_actors": []while the live ruleset grantsRepositoryRole5 an always bypass. All three ruleset files are regenerated from live (#85).gitignorestops ignoring.skeptic.jsonand.skeptic-waivers.json(#65)test-windowsis a required status check onmain
Documentation
docs/GITHUB_ACTION.mdgains a permissions table, a runner OS and architecture support matrix, a recipe for running the action twice in one job, and a statement that SARIF excludes waived findings while JSON retains them.go-versionsaid “Go version for building skeptic” without noting it applies only to the source-build fallback- README documents installing from a release archive — download, checksum, attestation verify, extract — which did not exist though v0.3.0 shipped five archives (#4)
- README documents the committed scan config as a worked example, including why a SHA-pinned waiver beats an ignore rule for markdown (#65)
CONTRIBUTING.mdgains Provenance, Branch rulesets, and Scan waivers sections. The second states that a ruleset change goes in the file and on the server in the same change (#4, #85, #93)
Known limitations
- The ruleset drift check needs a
RULESET_READ_TOKENsecret with repo admin scope. Without it the defaultGITHUB_TOKENreturns a reduced view and the workflow warns and skips rather than comparing (#85) .skeptic.jsonexcludesinternal/rules/andinternal/checks/, so skeptic does not scan its own detection sources. Every pattern it looks for is present there as a literal by construction- Waiver pins cover a whole file, so an unrelated edit invalidates them and two pull requests touching the same waived file conflict on the pin (#100)