ci: apply the public OSS security suite to this repository - #42
Merged
Conversation
|
You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool. What Enabling Code Scanning Means:
For more information about GitHub Code Scanning, check out the documentation. |
rldyourmnd
force-pushed
the
ci/dogfood-public-oss-suite
branch
from
July 24, 2026 18:28
ffbda52 to
14941b2
Compare
This repository ships CodeQL, OSSF Scorecard, Dependency Review and gitleaks to
the estate and consumed none of them itself. It self-applied only actionlint,
zizmor and release-supply-chain, so the repository that defines the estate's
security posture had the weakest one in it.
Add four self-application callers using relative refs, matching ci.yml's
existing convention; only external consumers pin by full SHA. The gitleaks
caller is named gitleaks.yml because secret-scan.yml is the reusable definition.
Triggers follow the repository's own examples/public-oss shapes: Scorecard is
push-to-default plus schedule because the action does not support pull_request,
and Dependency Review is pull_request only.
SELF_WORKFLOWS gains the four names. That set already existed to mark files that
are this repository applying its own catalog rather than reusable definitions,
so they carry no catalog, runtime-coverage or inventory entry.
The same literal set was duplicated in three places: _workflow_yaml.py held the
constant while validate_catalog.py and generate_docs.py each hardcoded
{ci.yml, release.yml} again. Both now import it, so the exemption is defined
once. Without that, the generated inventory listed the new callers as MISSING
rather than internal.
scripts/validate_all.py exits 0.
Signed-off-by: Danil Silantyev <danilsilantyevwork@gmail.com>
rldyourmnd
force-pushed
the
ci/dogfood-public-oss-suite
branch
from
July 24, 2026 18:29
14941b2 to
0095566
Compare
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.
Summary
This repository ships CodeQL, OSSF Scorecard, Dependency Review and gitleaks to the rest of the estate and consumed none of them itself. It self-applied only
actionlint,zizmorandrelease-supply-chain, so the repository that defines the estate's security posture had the weakest one in it.Verified against
gh api repos/NDDev-it-com/ci-workflows/actions/workflows— no such caller was registered, so this is not local checkout drift.Found while auditing CI across all four public estate repositories.
Type of change
Threat-model note
These are self workflows: this repository calling its own reusables through relative
./refs, so no new third-party code enters the supply chain and no new external dependency is pinned. The attack surface added is the token scope each reusable already requires of every other consumer.The one scope worth naming is
dependency-review.yml'spull-requests: write, which lets the reusable post its summary comment. It is contained by the trigger:pull_requestonly, andpull_request(notpull_request_target) runs with a read-only token on fork PRs, so a fork cannot use it to write to this repository.scorecard.ymltakesid-token: writefor OIDC, restricted to push-on-default and schedule — it never runs on a PR, so an untrusted ref cannot reach it.Permissions diff
All four are new files; there is no prior state.
Checklist
permissions(top-level{}, per-job minimal scopes)concurrencyandtimeout-minutespresent on new/changed workflows/jobs — concurrency on the push/PR-triggered files;timeout-minuteslives in the called reusablespersist-credentials: falseon all read-onlyactions/checkoutsteps — N/A: no checkout step in a caller${{ ... }}interpolated insiderun:— N/A: norun:stepsactionlintpasses locallyzizmor --pedanticpasses locally — it initially reported 3undocumented-permissionsfindings; every elevated scope now carries an explanatory comment and it reports "No findings"docs//catalog/updated —SELF_WORKFLOWSentries carry no catalog record by design;docs/generated/regeneratedCHANGELOG.mdupdated under[Unreleased]-S) and signed off (-s, DCO); Conventional Commit messagesTier impact
The contract change, and why
SELF_WORKFLOWSgains the four names. That set already existed for exactly this: files that are this repository applying its own catalog rather than defining a reusable, so they carry no catalog, runtime-coverage or inventory entry.While wiring it I found the same literal set duplicated in three places —
_workflow_yaml.pyholds the named constant, butvalidate_catalog.pyandgenerate_docs.pyeach hardcoded{"ci.yml", "release.yml"}again. Both now import the constant.That was not cosmetic. With the constant honoured in only one of the three,
validate_all.pypassed while the generated inventory listed the new callers asMISSING | MISSINGinstead ofinternal | internal— a green gate over wrong generated output.Verification
python3 scripts/validate_all.pyexits 0.actionlintandzizmor --pedanticclean on all four files.docs/generated/regenerated; the only diff is the four new rows, correctly markedinternal.