Skip to content

CI/CD : dependabot, CodeQL, audits bloquants et provenance de build - #10

Merged
Wasabules merged 1 commit into
mainfrom
cicd-hardening
Sep 5, 2026
Merged

CI/CD : dependabot, CodeQL, audits bloquants et provenance de build#10
Wasabules merged 1 commit into
mainfrom
cicd-hardening

Conversation

@Wasabules

Copy link
Copy Markdown
Owner

Alignement de la chaîne CI/CD sur celle de SnmpLens, nettement mieux outillée
côté analyse, puis ajout de ce qui manquait aux deux projets.

Comparatif avant / après

SyslogStudio (avant) SnmpLens SyslogStudio (après)
Dependabot (version updates) ✅ + groupe Svelte
CodeQL
dependency-review sur PR
govulncheck en CI ✅ + tags + fil-piège
npm audit bloquant
staticcheck ✅ (épinglé)
go mod tidy vérifié
wails build en CI ✅ 3 OS
Tests Go multi-OS ✅ 3 OS ❌ Linux seul ✅ 3 OS
Signature de release obligatoire ❌ no-op silencieux
Manifeste lié à la version (anti-rejeu)
Permissions minimales par job ❌ write global
Provenance de build attestée
persist-credentials: false
Groupes de concurrence

Les trois lignes où SyslogStudio était déjà devant tiennent à l'audit précédent
et sont conservées telles quelles — elles mériteraient d'être reportées sur
SnmpLens, en particulier la signature obligatoire : là-bas updatersign est un
no-op quand le secret est absent, donc une release peut sortir non signée sans
que rien n'échoue, et le manifeste ne porte pas de ligne version, ce qui laisse
la porte ouverte au rejeu d'un ancien manifeste validement signé.

La différence qui compte le plus

La CI ne compilait jamais l'application complète — seulement go vet,
go test, svelte-check et le build frontend séparément. Elle pouvait donc être
verte avec un wails build cassé, et la casse n'apparaissait qu'au push du tag,
c'est-à-dire quand c'est déjà une release ratée. Le job build fait désormais un
wails build réel sur les trois plateformes publiées, ce qui couvre aussi la
génération des bindings.

Provenance de build

actions/attest-build-provenance répond à une question que la signature Ed25519
du manifeste ne couvre pas : cette signature prouve que les sommes ont été signées
par le détenteur de la clé, pas que les binaires proviennent de ce dépôt via ce
workflow. N'importe qui peut désormais vérifier un téléchargement sans faire
confiance à notre outillage :

gh attestation verify SyslogStudio-windows-amd64.exe --repo Wasabules/SyslogStudio

Deux pièges rencontrés en route

main.go porte //go:embed all:frontend/dist et ce répertoire est gitignoré,
donc tout ce qui compile le paquet main échoue sur pattern all:frontend/dist: no matching files found. staticcheck s'arrête net — visible. govulncheck est
plus insidieux : il continue et ne rapporte que sur les sous-paquets
, si bien
que main paraissait sain parce qu'il n'avait jamais été analysé. D'où le
placeholder dans les deux jobs.

Même logique pour les tags de build sur Linux : sans libgtk/libwebkit et sans
-tags webkit2_41, les paquets Wails ne compilent pas et disparaissent du scan
en silence. L'étape « Confirm the tree builds before scanning it » transforme ce
faux négatif en échec visible. Ce piège est également présent dans le job
security de SnmpLens.

Vérifié localement avant push

Les quatre nouveaux contrôles passent sur l'arbre actuel : go mod tidy ne
modifie rien, npm audit --omit=dev --audit-level=high est vert (les avis
Vite/esbuild sont en dev et n'affectent que wails dev), govulncheck retourne
zéro, et staticcheck est propre après correction de sa seule remontée — une
affectation morte dans framing_test.go (SA4006), écrasée à la ligne suivante.

…uild

Alignement de la chaîne CI/CD sur SnmpLens, qui était nettement mieux outillé
côté analyse, puis ajout de ce qui manquait aux deux.

Repris de SnmpLens
------------------
- dependabot.yml : mises à jour hebdomadaires gomod, npm et github-actions.
  C'est ce qui rend les actions épinglées par SHA maintenables — sans lui, un
  épinglage gèle une action au commit du jour où il a été écrit, correctifs de
  sécurité compris. Les x/* et la chaîne Svelte sont groupés : ces paquets sont
  verrouillés les uns aux autres, des PR séparées se cassent mutuellement la CI.
- codeql.yml : analyse Go et JavaScript/TypeScript, requêtes security-and-quality,
  plus un passage hebdomadaire. Aucun autre outil ici ne cherche un motif
  exploitable dans le code qu'on écrit : go vet et staticcheck cherchent des
  erreurs, govulncheck et npm audit des dépendances vulnérables connues. Le cron
  compte autant que le déclenchement au push — une requête ajoutée à CodeQL après
  qu'un commit a atterri ne le verrait jamais autrement.
- dependency-review sur les PR : bloque l'introduction d'une dépendance portant
  un avis de sécurité. govulncheck ne sait pas faire ça, il rapporte sur ce qui
  est déjà fusionné.
- govulncheck et npm audit --audit-level=high en CI, sans « || true ».
- staticcheck et vérification que go.mod est tidy.
- wails build sur les trois plateformes. C'est la différence la plus lourde de
  conséquences : la CI ne compilait jamais l'application complète, seulement
  go vet/test et le build frontend séparément. Elle pouvait donc être verte avec
  un wails build cassé, et la casse n'apparaissait qu'au push du tag — c'est-à-dire
  quand c'est déjà une release ratée.

Ajouté au-delà des deux projets
-------------------------------
- Attestation de provenance des artefacts (actions/attest-build-provenance).
  Elle répond à une question que la signature Ed25519 du manifeste ne couvre
  pas : cette signature prouve que les sommes ont été signées par le détenteur de
  la clé, pas que les binaires ont été produits par ce dépôt via ce workflow.
  Vérifiable sans faire confiance à notre outillage :
    gh attestation verify <fichier> --repo Wasabules/SyslogStudio
- persist-credentials: false sur tous les checkouts. Aucun job ne pousse ;
  laisser le token dans .git/config l'expose au code tiers exécuté ensuite.
- Groupes de concurrence : les pushes obsolètes d'une même PR sont annulés, ceux
  de main jamais — chaque commit de la branche par défaut garde son verdict.
- Actions remontées aux versions courantes (checkout v7, setup-go v7,
  setup-node v7, upload-artifact v7, download-artifact v8, gh-release v3).

Pièges rencontrés, et pourquoi le résultat est ce qu'il est
-----------------------------------------------------------
main.go porte //go:embed all:frontend/dist et ce répertoire est gitignoré, donc
tout ce qui compile le paquet main échoue sur « pattern all:frontend/dist: no
matching files found ». staticcheck s'arrête net ; govulncheck est plus insidieux,
il continue et ne rapporte que sur les sous-paquets — main paraissait sain parce
qu'il n'avait jamais été regardé. D'où le placeholder dans les deux jobs.

Même logique sur Linux pour les tags de build : sans libgtk/libwebkit et sans
-tags webkit2_41, les paquets Wails ne compilent pas et disparaissent du scan en
silence. L'étape « Confirm the tree builds before scanning it » est le fil-piège
qui transforme ce faux négatif en échec visible.

Corrige au passage la seule remontée de staticcheck sur l'arbre existant : une
affectation morte dans framing_test.go (SA4006), écrasée à la ligne suivante.
@github-advanced-security

Copy link
Copy Markdown

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:

  • The 'Security' tab will display more code scanning analysis results (e.g., for the default branch).
  • Depending on your configuration and choice of analysis tool, future pull requests will be annotated with code scanning analysis results.
  • You will be able to see the analysis results for the pull request's branch on this overview once the scans have completed and the checks have passed.

For more information about GitHub Code Scanning, check out the documentation.

@Wasabules
Wasabules merged commit a92afc0 into main Sep 5, 2026
9 checks passed
@Wasabules
Wasabules deleted the cicd-hardening branch September 5, 2026 21:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants