Aller au contenu

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 les uses: 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.yml ou action.yaml dans 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-remote permettent 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.

Plus d'informations