Gepinde scannerversies verouderen ongemerkt — check-actions kijkt alleen naar Actions #802

Closed
opened 2026-07-24 15:43:19 +00:00 by brenno · 2 comments
Owner

Wat er speelt

Sinds #799 (.forgejo/workflows/scans.yml) en #800 (.github/workflows/ci.yml)
staan gitleaks, trufflehog en semgrep op een vaste versie, sha256-gecontroleerd.
Dat is goed, en het was precies de bedoeling van #778: "een scanner die zichzelf
bijwerkt verandert stilletjes wat de poort betekent."

De keerzijde van een pin wordt nergens bewaakt. Er is één plek in de repo die
bijhoudt of een pin achterloopt — make check-actions
(tool/check_pinned_actions.dart plus .github/pinned-actions.json) — en die
kijkt uitsluitend naar Actions die op een exacte versie staan. Er staat er
precies één in: aquasecurity/trivy-action. Een versie die in een run:-blok
gepind is, valt buiten die lijst en dus buiten de monitor.

Gevolg: de drie scannerversies verouderen zonder dat iets het zegt.

Voor déze drie is dat geen cosmetisch punt. Een geheimenscanner die stilstaat,
mist de detectoren voor sleutelvormen die pas daarna zijn ontstaan — en dan staat
de poort groen omdat hij niet weet waarnaar hij moet kijken. Dat is dezelfde
faalvorm die #799 bij fetch-depth beschrijft: groen dat niets gelezen heeft.

Waarom dit een eigen issue is en geen bezwaar tegen de pin

Niet-pinnen is geen alternatief. #778 heeft die knoop terecht doorgehakt: zonder
pin betekent "groen" elke week iets anders, en dat is erger. Wat ontbreekt is de
tegenhanger van de pin — een melding dat er een nieuwere is. Die vorm bestaat
hier al twee keer: make deps-check voor de gevendorde JS, make check-actions
voor de Actions. Er is er alleen geen voor deze drie.

Wat er ongeveer moet gebeuren

  • De naam moet blijven kloppen. .github/pinned-actions.json heet naar wat
    erin staat, en check_pinned_actions.dart print "pinned CI Actions". Er
    binaries bij schuiven laat de naam liegen; het is een hernoemd manifest of een
    tweede lijst, niet een stilzwijgende uitbreiding.
  • Twee plekken moeten gelijk blijven. Dezelfde drie versies staan in
    scans.yml én in ci.yml, en dat is nu een menselijke afspraak die in het
    commentaar van beide bestanden staat opgeschreven. Uit elkaar lopen is precies
    wat een poort wél kan zien.
  • Adviserend, niet blokkerend, net als check-actions en deps-outdated:
    een bump is een prompt, geen regressie. Rood mag hier niet van iemand anders
    zijn PR afhangen.
  • Semgrep komt van PyPI en niet van een GitHub-release; de bron voor "wat is de
    laatste" is daar dus een andere dan voor de twee tarballs.

Wat het niet raakt

Het bestandsformaat, de opslag en de afhankelijkheden van de app: niets. Dit
gaat alleen over CI-definities en tool/.

Waar het vandaan komt

Gevonden bij het inbouwen van #800, bij de vraag "wie merkt het als deze drie
getallen twee jaar blijven staan". Het antwoord was: niemand.

## Wat er speelt Sinds #799 (`.forgejo/workflows/scans.yml`) en #800 (`.github/workflows/ci.yml`) staan gitleaks, trufflehog en semgrep op een vaste versie, sha256-gecontroleerd. Dat is goed, en het was precies de bedoeling van #778: *"een scanner die zichzelf bijwerkt verandert stilletjes wat de poort betekent."* De keerzijde van een pin wordt nergens bewaakt. Er is één plek in de repo die bijhoudt of een pin achterloopt — `make check-actions` (`tool/check_pinned_actions.dart` plus `.github/pinned-actions.json`) — en die kijkt uitsluitend naar **Actions** die op een exacte versie staan. Er staat er precies één in: `aquasecurity/trivy-action`. Een versie die in een `run:`-blok gepind is, valt buiten die lijst en dus buiten de monitor. Gevolg: de drie scannerversies verouderen zonder dat iets het zegt. Voor déze drie is dat geen cosmetisch punt. Een geheimenscanner die stilstaat, mist de detectoren voor sleutelvormen die pas daarna zijn ontstaan — en dan staat de poort groen omdat hij niet weet waarnaar hij moet kijken. Dat is dezelfde faalvorm die #799 bij `fetch-depth` beschrijft: groen dat niets gelezen heeft. ## Waarom dit een eigen issue is en geen bezwaar tegen de pin Niet-pinnen is geen alternatief. #778 heeft die knoop terecht doorgehakt: zonder pin betekent "groen" elke week iets anders, en dat is erger. Wat ontbreekt is de *tegenhanger* van de pin — een melding dat er een nieuwere is. Die vorm bestaat hier al twee keer: `make deps-check` voor de gevendorde JS, `make check-actions` voor de Actions. Er is er alleen geen voor deze drie. ## Wat er ongeveer moet gebeuren - **De naam moet blijven kloppen.** `.github/pinned-actions.json` heet naar wat erin staat, en `check_pinned_actions.dart` print "pinned CI Actions". Er binaries bij schuiven laat de naam liegen; het is een hernoemd manifest of een tweede lijst, niet een stilzwijgende uitbreiding. - **Twee plekken moeten gelijk blijven.** Dezelfde drie versies staan in `scans.yml` én in `ci.yml`, en dat is nu een menselijke afspraak die in het commentaar van beide bestanden staat opgeschreven. Uit elkaar lopen is precies wat een poort wél kan zien. - **Adviserend, niet blokkerend**, net als `check-actions` en `deps-outdated`: een bump is een prompt, geen regressie. Rood mag hier niet van iemand anders zijn PR afhangen. - Semgrep komt van PyPI en niet van een GitHub-release; de bron voor "wat is de laatste" is daar dus een andere dan voor de twee tarballs. ## Wat het niet raakt Het bestandsformaat, de opslag en de afhankelijkheden van de app: niets. Dit gaat alleen over CI-definities en `tool/`. ## Waar het vandaan komt Gevonden bij het inbouwen van #800, bij de vraag "wie merkt het als deze drie getallen twee jaar blijven staan". Het antwoord was: niemand.
Author
Owner

Opgepakt. Tak: ci/pins-verouderingsbewaking-802. Verwachte reikwijdte: .github/pinned-actions.json (hernoemd), tool/check_pinned_actions.dart (hernoemd en uitgebreid), het make-doel, een nieuwe test die de manifesten en de twee workflows tegen elkaar houdt, en docs/CHECKS.md + docs/SECURITY_DESIGN.md.

Opgepakt. Tak: `ci/pins-verouderingsbewaking-802`. Verwachte reikwijdte: `.github/pinned-actions.json` (hernoemd), `tool/check_pinned_actions.dart` (hernoemd en uitgebreid), het make-doel, een nieuwe test die de manifesten en de twee workflows tegen elkaar houdt, en `docs/CHECKS.md` + `docs/SECURITY_DESIGN.md`.
Author
Owner

Opgelost en op main. PR #808, gemerged als 606f5a29.

  • a7c6e923 → het manifest en het gereedschap dekken nu ook de scannerbinaries en heten ernaar: .github/pinned-ci-versions.json, tool/check_pinned_versions.dart, make check-pins. Twee lijsten (actions / tools), twee bronnen (GitHub-release tag_name en PyPI info.version); semgrep bij PyPI, want de workflow installeert hem met pip.
  • 033dc115test/pinned_versions_manifest_test.dart, offline en in de suite: het manifest tegen béide workflows, inclusief de richting die niemand onthoudt — een *_VERSION:-pin die nergens in het manifest staat laat de test vallen. Drie mutaties gedraaid om te zien dat hij bijt.
  • f77a8d84 → CHECKS.md, SECURITY_DESIGN.md, CHANGELOG.
  • 7f4b18d1 → en de eerste bevinding meteen weggewerkt: semgrep 1.170.0 → 1.171.0 in beide workflows, in het manifest én op de werkbank (brew upgrade semgrep). Is er een hogere, dan gaat alles mee — anders draai je alsnog niet de laatste. Nagemeten: make sast op 1.171.0 geeft 0 bevindingen over 709 bestanden met 3 regels, gelijk aan 1.170.0.

make check-pins staat nu op vier keer "up to date". make check, make check-secrets en make sast lokaal groen; scans.yml groen op de PR, dus de gebumpte pin is ook in CI werkelijk geïnstalleerd en gedraaid.

Opgelost en op main. PR #808, gemerged als `606f5a29`. - `a7c6e923` → het manifest en het gereedschap dekken nu ook de scannerbinaries en heten ernaar: `.github/pinned-ci-versions.json`, `tool/check_pinned_versions.dart`, `make check-pins`. Twee lijsten (`actions` / `tools`), twee bronnen (GitHub-release `tag_name` en PyPI `info.version`); semgrep bij PyPI, want de workflow installeert hem met pip. - `033dc115` → `test/pinned_versions_manifest_test.dart`, offline en in de suite: het manifest tegen béide workflows, inclusief de richting die niemand onthoudt — een `*_VERSION:`-pin die nergens in het manifest staat laat de test vallen. Drie mutaties gedraaid om te zien dat hij bijt. - `f77a8d84` → CHECKS.md, SECURITY_DESIGN.md, CHANGELOG. - `7f4b18d1` → en de eerste bevinding meteen weggewerkt: semgrep 1.170.0 → 1.171.0 in beide workflows, in het manifest én op de werkbank (`brew upgrade semgrep`). Is er een hogere, dan gaat alles mee — anders draai je alsnog niet de laatste. Nagemeten: `make sast` op 1.171.0 geeft 0 bevindingen over 709 bestanden met 3 regels, gelijk aan 1.170.0. `make check-pins` staat nu op vier keer "up to date". `make check`, `make check-secrets` en `make sast` lokaal groen; `scans.yml` groen op de PR, dus de gebumpte pin is ook in CI werkelijk geïnstalleerd en gedraaid.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#802
No description provided.