Améliorer la maintenance de vos workflows GitHub
Les failles de sécurité liées à la supply chain sont de plus en plus courantes. En tant que mainteneur d’un projet open source populaire, l’enjeu est de taille. Votre code est déployé sur de nombreux serveurs de production et postes de développeurs. Il est donc crucial de garder vos pipelines CI à jour et sécurisés.
Le projet open source qui nous importe aujourd’hui est Castor 🦫, que nous vous invitons à découvrir.
Pour nous aider dans cette tâche, nous avons choisi zizmor. C’est un outil d’analyse statique de code. Il détecte les vulnérabilités dans vos fichiers de configuration de CI et propose souvent des correctifs. Pour faire simple, c’est l’équivalent de PHPStan, mais pour vos workflows.
Une fois installé, une simple exécution (zizmor .) permet de détecter les erreurs de configuration et de les corriger rapidement. Nous avons ainsi amélioré notre sécurité et facilité la maintenance à long terme.
Voici un exemple de rapport généré par l’outil :
error[unpinned-uses]: unpinned action reference
--> ./.github/actions/cache/action.yaml:48:13
|
48 | uses: actions/cache@v5
| ^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy)
|
= note: audit confidence → High
= note: this finding has an auto-fix
= help: audit documentation → https://docs.zizmor.sh/audits/#unpinned-uses
help[artipacked]: credential persistence through GitHub Actions artifacts
--> ./.github/workflows/artifacts.yml:16:9
|
16 | - name: Checkout
| _________^
17 | | uses: actions/checkout@v6
| |_________________________________^ does not set persist-credentials: false
|
= note: audit confidence → Low
= note: this finding has an auto-fix
= help: audit documentation → https://docs.zizmor.sh/audits/#artipacked
error[github-env]: dangerous use of environment file
--> ./.github/actions/cache/action.yaml:14:7
|
14 | / run: |
15 | | set -e
16 | |
17 | | # Should be the same command as the one in tools/static/castor.php
... |
44 | | echo cache_dirname_test=$cache_dirname_test >> $GITHUB_ENV
45 | | echo cache_key_test=$cache_key_test >> $GITHUB_ENV
| |__________________________________________________________^ write to GITHUB_ENV may allow code execution
|
= note: audit confidence → Low
= help: audit documentation → https://docs.zizmor.sh/audits/#github-env
error[template-injection]: code injection via template expansion
--> ./.github/actions/install/action.yaml:28:108
|
28 | run: composer install --prefer-dist --no-progress --optimize-autoloader --classmap-authoritative ${{ inputs.composer-flags }}
| --- this run block ^^^^^^^^^^^^^^^^^^^^^ may expand into attacker-controllable code
|
= note: audit confidence → High
= note: this finding has an auto-fix
= help: audit documentation → https://docs.zizmor.sh/audits/#template-injection
Un grand nombre d’erreurs peuvent être corrigées automatiquement :
zizmor . --fix=all
Cependant, pour trouver le hash de commit correspondant à un tag, l’outil a besoin d’un token GitHub avec les bonnes permissions. Il convient donc de le relancer avec la variable configurée :
GITHUB_TOKEN=ghp_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX zizmor --fix=all
Ou, si vous utilisez la CLI gh au quotidien :
GITHUB_TOKEN=`gh auth token` zizmor --fix=all
En revanche, zizmor ne gère pas les montées de version majeures des actions. Pour cela, nous utilisons deux autres méthodes.
En local, nous exécutons actions-up. Cet outil détecte les actions utilisées et propose des mises à jour. C’est le composer update de vos workflows.
En CI, nous faisons confiance à Dependabot. Il vérifie régulièrement vos dépendances et ouvre des Pull Requests automatiquement. Voici notre configuration :
version: 2
updates:
- package-ecosystem: 'github-actions'
directory: '/'
target-branch: 'main'
schedule:
interval: 'monthly'
groups:
github-actions:
patterns:
- '*'
cooldown:
default-days: 7
En conclusion, nous vous recommandons vivement d’adopter zizmor. C’est un outil puissant, rapide à prendre en main, qui sécurise vos pipelines et vous fait gagner un temps précieux au quotidien.