SOURCE_HASH: 46b1a157e5c0fcd67bae354b4f92788834378aae¶
anchor: cicd description: Assurez-vous que les références GitHub Actions sont épinglées sur un SHA de commit immuable plutôt que sur une balise ou une branche modifiable. pretty_name: CI/CD - GitHub Action Unpinned Action shortname: cicd-gha-unpinned-action title: 'GitHub Actions - Version de l\'action non épinglée'
{{ title }}¶
Une référence uses: qui pointe vers un tag ou une branche est mutable : le propriétaire de l'action peut déplacer ce tag ou cette branche vers un code différent à tout moment, et la prochaine exécution de votre workflow exécute un code que personne dans votre équipe n'a examiné. Comme les actions s'exécutent dans votre pipeline avec accès à ses secrets et à son token, un tag déplacé constitue une voie d'accès directe vers votre build.
Une référence épinglée à un SHA de commit complet de 40 caractères se résout toujours vers le même code, de sorte qu'une mise à jour devient un changement explicite et vérifiable dans votre fichier de workflow.
Ce qui est vérifié¶
Boost Security remonte un résultat par référence non épinglée, au fichier et à la ligne de la clé uses:, dans les éléments suivants appartenant à votre dépôt :
- les fichiers de workflow sous
.github/workflows/, couvrant à la fois lesuses:au niveau des étapes et les appels au niveau des jobs vers des workflows réutilisables - les définitions d'actions composites — tout fichier
action.ymlouaction.yamldans le dépôt
Les références trouvées à l'intérieur d'une action tierce que votre dépôt consomme ne sont pas évaluées — seuls les fichiers dont votre dépôt est propriétaire le sont. Une référence d'action passée en tant qu'entrée à une autre action (une clé uses: imbriquée sous with:) est une valeur, pas une référence que le workflow résout, et n'est pas signalée.
Exemples¶
Exemple non sécuritaire
Chaque référence ci-dessous peut changer sans que le fichier de workflow ne change :
name: build
on: push
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v4.1.1
- uses: actions/upload-artifact@main
- uses: some-vendor/deploy@abcdef1
release:
uses: other-org/repo/.github/workflows/release.yml@main
Exemple sécuritaire
Chaque référence se résout vers une révision immuable unique, avec la version lisible conservée en commentaire en fin de ligne :
name: build
on: push
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v5.0.0
- uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.1.1
- uses: ./.github/actions/local-setup
release:
uses: other-org/repo/.github/workflows/release.yml@0f4a1c2d7e6b9a3c5d8e1f4b7a0c3d6e9b2f5a8c
La même règle s'applique à une action composite, où les étapes de votre propre action.yml doivent également être épinglées :
name: local-setup
runs:
using: composite
steps:
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
shell: bash
Formes acceptées¶
| Référence | Épinglée | Pourquoi |
|---|---|---|
actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 |
Oui | SHA de commit complet de 40 caractères |
actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v5.0.0 |
Oui | Un commentaire de version en fin de ligne est accepté, ce qui permet aux références épinglées de rester lisibles |
docker://alpine@sha256:beb9b6d5e2e1c1f0f4c5cd9dcbb9e0ba3b3f4e37cbb4b0aa4b3d0d6b0b6e2a41 |
Oui | Un digest d'image est immuable |
./.github/actions/local-setup |
Oui | Une référence locale provient du dépôt lui-même et n'a rien à épingler |
actions/setup-node@v4, actions/cache@v4.1.1 |
Non | Les tags peuvent être déplacés, y compris les tags entièrement qualifiés |
actions/upload-artifact@main |
Non | Les branches se déplacent à chaque push |
some-vendor/deploy@abcdef1 |
Non | Un SHA court est une abréviation, pas un identifiant immuable |
other-org/repo/.github/workflows/ci.yml@main |
Non | Les appels de workflows réutilisables sont épinglés de la même manière que les actions |
Une référence docker:// qui porte un tag plutôt qu'un digest — docker://alpine:3.19 — n'est pas signalée, même si le tag est mutable.
Étapes de correction¶
- Remplacez la référence mutable par le SHA de commit complet de 40 caractères de la version que vous souhaitez exécuter. L'interface GitHub et
git ls-remotepermettent tous deux d'obtenir le SHA correspondant à un tag. - Conservez la version en commentaire en fin de ligne (
@<sha> # v5.0.0) afin que les relecteurs puissent toujours comprendre le workflow d'un coup d'œil. - Laissez Dependabot maintenir à jour les références épinglées : il ouvre des Pull Request qui déplacent le SHA et mettent à jour le commentaire ensemble.
- Épinglez également les actions composites et les appels de workflows réutilisables — ils s'exécutent avec le même niveau d'accès que n'importe quelle autre étape.
- Avant d'épingler une action tierce, examinez la révision que vous vous apprêtez à épingler, car il s'agit du code que vous exécuterez jusqu'à ce que vous décidiez délibérément de le modifier.