Geheimen- en SAST-scan draaien nergens automatisch, terwijl de runner er nu is #778
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#778
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
Sinds #741 draait
make checkop de Forgejo-runner, per push en per PR. Dat isde belangrijkste poort en die staat er nu goed op.
Wat er niet in CI draait:
check-secrets(gitleaks + trufflehog, werkboomén volledige historie) en
sast(semgrep). Die zitten alleen incheck-full,en
check-fulldraait nergens automatisch.Gevolg: of er ooit gescand is, hangt af van wie het lokaal toevallig doet. Voor
een geheim geldt dat het pas telt als het vóór de merge gevonden wordt — daarna
staat het in de historie en is intrekken de enige echte remedie.
Dit is een gat in de controle, geen bekend lek. Op 23-07-2026 draaide ik
beide handmatig op main: gitleaks en trufflehog schoon, semgrep 0 bevindingen
over 690 bestanden. Er is nu dus niets te vinden. Het punt is dat niets
garandeert dat dat zo blijft.
Waarom de oude afweging niet meer geldt
De code schrijft zijn eigen rechtvaardiging op, in
tool/check_conventions.dartbijnosemgrepBaseline:Dat klopte toen het geschreven werd. De redenering rust op één aanname — "we
kunnen geen externe binary aannemen" — en die aanname ging over de máchine van
een bijdrager. Sinds 23-07-2026 is er een runner met een eigen container, en
daar bepaal je zelf wat erin zit. De
ci.ymlinstalleert nu al nodejs, make,git, curl, jq en unzip, plus een sha256-geverifieerde Flutter-tarball.
Het is dus geen nieuwe afweging maar een vervallen beperking.
Dezelfde redenering raakt de
nosemgrep-teller zelf: die bestaat alscheck_conventions-ratchet omdat semgrep niet altijd draait. Draait semgrepwel in CI, dan mag die omweg blijven (hij is goedkoop) maar hij is niet langer
het enige vangnet.
Voorstel
Een tweede job in
.forgejo/workflows/ci.yml— naastgate, niet erin:make checkduurt~3 minuten; trufflehog over de hele historie deed er lokaal ~10 seconden over,
gitleaks vergelijkbaar, semgrep een halve minuut. Dat past, maar een eigen job
houdt de faalreden leesbaar: "de poort viel" is iets anders dan "er is een
sleutel gevonden".
--config autobij semgrep. De lokale regels insemgrep/ocideck.yamlzijn de bron;autohaalt regels over het netwerk enstuurt metrics mee. Het
sast-doel doet dit al goed — neem het commandoongewijzigd over.
--no-verificationbij trufflehog laten staan. Zonder die vlag stuurttrufflehog kandidaat-sleutels naar de uitgevende dienst om te zien of ze leven.
Dat is precies het soort uitgaand verkeer dat dit project niet wil, en al
helemaal niet vanaf een buildmachine.
scanner die zichzelf bijwerkt verandert stilletjes wat de poort betekent.
Wie de drie binaries in het
ubuntu:24.04-image trekt, moet ze verifiëren zoalsde Flutter-stap dat doet (checksum tegen het release-manifest), anders verplaats
je het vertrouwensprobleem naar de download.
Wat hier expliciet buiten valt
DAST (ZAP) niet. Dat blijft advisory en ongeschikt: de webbundel is
CanvasKit, en een spider komt niet door een canvas heen. Zinvol voor het
gesérveerde oppervlak (headers, CSP), en dat dekt
make check-webal.check-fullin zijn geheel in CI ook niet.deps-outdatedencatalogs-outdatedzijn adviserend en horen niet rood te kunnen worden op eenPR van iemand anders; die verouderen buiten je schuld.
Kosten
Een dagdeel, vrijwel alles in de workflow. Geen Dart-wijziging, geen l10n, geen
SBOM-gevolg. Wel
docs/CHECKS.mdbij: dat beschrijft welke poort waar draait.Randgeval om te toetsen: een PR met een geplant testgeheim moet rood worden.
Zonder die tegenproef weet je alleen dat de job draait, niet dat hij iets ziet —
dezelfde tweerichtingstoets die
semgrep/ocideck.yamlzelf al voorschrijft.Opgepakt. Tak:
feat/ci-scans-778. Reikwijdte: een tweede jobscansin.forgejo/workflows/ci.ymlnaastgate— gitleaks, trufflehog en semgrep op gepinde versies met geverifieerde download, en het bestaandemake check-secrets/make sastals commando zodat lokaal en CI hetzelfde draaien. Plusdocs/CHECKS.md. DAST en de adviserende doelen blijven er bewust buiten.Correctie op de claim hierboven: de tak is nu
feat/ci-scans-778-v2, PR #799. De oude takfeat/ci-scans-778was geschreven tegen deci.ymlvan vóór #796/#797 en is daarmee achterhaald — die wordt opgeruimd.Eén afwijking van het voorstel in dit issue, bewust: het vroeg om een tweede job ín
ci.yml, en dat kan niet meer.on:geldt per workflow, enci.ymlis sinds #790 de uitbrengpoort op eenv*-tag. Een job daar zou pas scannen als het geheim al op main stond mét een tag eromheen. Het is daarom een eigenscans.ymlgeworden die op elke PR en elke push naar main vuurt — de reden voor #790 was de klok (22 minuten per PR), en deze twee doen 17 en 2 seconden.Klaar, op main in
ff9b8cc5(PR #799)..forgejo/workflows/scans.ymldraaitmake check-secretsenmake sast— de Makefile-doelen zelf, niet overgetypte regels — op elke PR en elke push naar main, in eenubuntu:24.04-container op de Linux-runner.Beide triggers zijn op main geverifieerd, niet alleen aangenomen:
pull_requestpushnaar mainff9b8cc5Afwijkingen van het voorstel in dit issue, met de reden:
ci.ymlmaar een eigenscans.yml. Het voorstel is geschreven vóór #790/#796/#797.on:geldt per workflow, enci.ymlis inmiddels de uitbrengpoort op eenv*-tag — een job daarin zou pas scannen als het geheim al op main stond mét een tag eromheen, precies te laat. Daarom een eigen bestand, dat per PR en per push vuurt: de reden voor #790 was de klok (22 minuten per PR), en deze twee doen lokaal 17 en 2 seconden.make checkdie op dat moment draait. De server staat sinds diezelfde verhuizing stil.Wat het issue vroeg en wat er gebeurd is:
test -n "$SHA", wantgrep | sha256sum -c -slaagt stíl bij een lege treffer;--config auto,--no-verificationblijft staan — ja, allebei ongewijzigd overgenomen uit de Makefile-doelen;docs/CHECKS.mdbij — ja, plus CONTRIBUTING, README en BUILD: die beloofden alle drie absoluut dat er niets vóór main draait, en dat klopte niet meer.De tegenproef die het issue vroeg, in beide richtingen (met een willekeurig gegenereerd AWS-vormig sleutelpaar, nooit gecommit in deze repo — de historie-proef stond in een wegwerprepo):
make check-secretsvalt om en noemt de vondst;Meteen daarbij de meting die
fetch-depth: 0draagt, want dat was een bewering: dezelfde repo met een gecommit-en-daarna-verwijderd geheim geeft bij een volledige kloon exit 1 (gitleaks) en 183 (trufflehog), en bij--depth 1twee keer 0. Zonder die regel meldt de historie-scan dus groen over vrijwel niets.Wat er níét in zit:
nosemgrepBaselineis niet weggehaald maar herschreven. Het oude argument ("make sastdraait niet automatisch") is vervallen; het argument dat overeind blijft stond er niet: semgrep telt zijn eigen onderdrukkingen niet, dus die ratchet hoort in de poort die bij élkemake checkdraait.docs/CHECKS.md(PR #801), met de cache-optie erbij als bewust nog-niet..github/workflows/ci.yml(de spiegel, die niet draait) haalt de drie scanners nog ongepind binnen viacurl | shvanaf een branch-tip — precies het patroon dat dit issue afwijst. Apart opgepakt.