De scanners in .github/workflows/ci.yml zijn ongepind en komen via curl | sh van een branch-tip #800
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#800
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Wat er speelt
De stap "Gereedschap voor de scanners" in
.github/workflows/ci.ymlhaalt tweevan de drie scanners binnen als installatiescript vanaf de tip van een
branch, en de derde zonder versie:
Er zijn twee dingen mis, en ze staan los van elkaar.
1. Ongepind. Dit is precies wat #778 als anti-patroon benoemde: "pin de
scanners op een versie — een scanner die zichzelf bijwerkt verandert stilletjes
wat de poort betekent." Groen vandaag betekent dan iets anders dan groen
gisteren, zonder dat iemand iets wijzigde. De andere kant is even vervelend: een
nieuwe scannerversie kan rood staan op code die niemand heeft aangeraakt, en dan
is de faalreden een upgrade die nergens in de historie staat.
2.
curl | shvanaf een bewegend punt.masterenmainzijn geenversies maar aanwijzers. Wat er binnenkomt is willekeurige code die als eerste
stap wordt uitgevoerd — geen tag, geen checksum, geen enkele verificatie. Wie dat
script kan wijzigen, voert opdrachten uit op de buildmachine. #778 zei ook dit al
met zoveel woorden: "Wie de drie binaries in het
ubuntu:24.04-image trekt,moet ze verifiëren zoals de Flutter-stap dat doet (checksum tegen het
release-manifest), anders verplaats je het vertrouwensprobleem naar de
download."
Wat er al goed staat, en wat er over te nemen valt
Voor de wél draaiende workflow is dit opgelost in PR #799
(
.forgejo/workflows/scans.yml): de drie versies in éénenv-blok, de tarballbinnengehaald en sha256 gecontroleerd tegen het gepubliceerde release-manifest,
en semgrep gepind geïnstalleerd in een venv.
Inclusief één regel die er onbenullig uitziet en dat niet is:
grep … | sha256sum -c -slaagt stil met exit 0 zodra de grep niets vindt.Eén hernoemd release-asset en de verificatie is er niet meer, zonder één rood
vinkje. Die regel hoort mee over te komen, niet alleen het idee erachter.
Wat dit expliciet níet is
Geen lek en geen storing.
.github/workflows/ci.ymldraait nergens: Forgejoleest
.forgejo/workflows/en die map schaduwt deze. Het bestand is eenreferentiedefinitie voor een GitHub-spiegel. Er is dus op dit moment geen
buildmachine die ongepinde code van een branch-tip uitvoert.
Waarom het dan toch moet:
het tegenovergestelde voor van wat het project elders van zichzelf eist;
voorbeeld meer maar een uitvoerende stap.
Wat het niet raakt
Het bestandsformaat, de opslag, de afhankelijkheden van de app: niets. Dit is
alleen een CI-definitie.
Hoe je het toetst
Er is geen CI-run die de wijziging bewijst — de workflow draait niet, en dat is
by design. Toets daarom met een YAML-parse (
yq) en door de stappen naastscans.ymlte leggen. Dat moet in de commit- en PR-tekst staan, anders leest devolgende lezer een groene poort in die er niet is.
Reikwijdte
Eén stap in één bestand, plus de beschrijving van die workflow in
docs/CHECKS.md.Opgepakt. Tak:
ci/scanners-gepind-800. Verwachte reikwijdte:.github/workflows/ci.yml(de stap "Gereedschap voor de scanners") en de beschrijving van die workflow indocs/CHECKS.md.Bij het inbouwen kwamen er twee dingen bij, allebei in dezelfde tak
ci/scanners-gepind-800:fetch-depth: 0op de checkout — eigen commit. De gate-taak checkte uit met de standaard vanactions/checkout(één commit diep) en draaide daarnamake check-secrets; twee van de vier passes daarvan gaan over de histórie (gitleaks git .,trufflehog git file://.). Op een ondiepe kloon lezen die bijna niets en eindigen groen.scans.ymlhad dit al (#799), alleen de GitHub-definitie liep achter. Het staat los van de pins en is daarom een aparte commit — hij kan eruit zonder de rest te raken.De aanleiding voor
test -n "\$SHA"klopt niet zoals hij in #799 is opgeschreven. Nagemeten met GNU coreutils 9.5 (Ubuntu 24.04 draait 9.4, dezelfde codebasis): bij een lege treffer looptsha256sum -c -níet stil met exit 0 door — hij eindigt op 1 met "no properly formatted checksum lines found". Ook via een grep zonder treffer. De regel blijft staan, maar om een andere reden: zonder hem struikelt de stap over de invoer van sha256sum en gaat de lezer de verificatie debuggen in plaats van het hernoemde release-asset te zien. Het commentaar inci.ymlzegt dat nu; het commentaar inscans.ymlverdient dezelfde correctie.En één bevinding die hier niet in past, apart ingediend als #802: er is geen enkele bewaking die zegt dat deze drie pins verouderen.
make check-actionskijkt alleen naar Actions die op een exacte versie staan, niet naar een versie in eenrun:-blok.De pins zelf zijn nagelopen tegen de echte manifesten:
gitleaks_8.30.1_linux_x64.tar.gzentrufflehog_3.95.9_linux_amd64.tar.gzleveren allebei een sha256 op, dus de verificatie is op deze versies geen no-op.Opgelost en op main. PR #804, gemerged als
c98c4ac8.De kern zit in
f5618987: gitleaks 8.30.1 en trufflehog 3.95.9 komen nu als gepinde tarball binnen met sha256 tegen het gepubliceerde release-manifest, semgrep 1.170.0 gepind in een venv. Drie stappen in plaats van één, elk met zijn eigenenv-blok.Er kwamen drie dingen bij, allemaal in dezelfde PR:
8a0a2362—fetch-depth: 0op de checkout. Twee van de vier passes inmake check-secretslezen de historie; op de standaard ondiepe kloon lazen die bijna niets en eindigden groen.f900efb1— de vervallen helft van "geen marketplace-actions, want die zouden gepind moeten worden": hieronder wordt nu sowieso gepind.9a2813bc— de correctie op de aanleiding voortest -n "\$SHA", die via #799 op drie plekken op main stond.Getoetst zonder CI-run, want dit bestand draait nergens: YAML-parse met yq, shellcheck over de run-blokken, de pins nagelopen tegen de echte manifesten (beide asset-namen leveren een sha256 op), en alle interne ankers in CHECKS.md.
make check,make check-secretsenmake sastlokaal groen;scans.ymlgroen op de PR zelf.