GitHub Actions et npm en 2026 : les défenses anti-supply-chain à activer maintenant

GitHub Actions et npm en 2026 : les défenses anti-supply-chain à activer maintenant — illustration Ctrl+Alt+Prod (supply chain GitHub Actions)

Écrit par

dans

En mars, les attaques supply chain contre l’écosystème npm et GitHub Actions t’avaient donné des sueurs froides (on en a tiré les leçons dans cet article). Depuis, GitHub n’est pas resté les bras croisés : toute une série de protections concrètes ont été livrées tout au long de 2026, la dernière — les Workflow Execution Protections — étant passée en disponibilité générale le 17 septembre. Tu vas voir lesquelles activer en priorité sur tes pipelines, et comment.

Pourquoi ça continue de te concerner

Un pipeline CI/CD, c’est un accélérateur formidable… et une cible de choix. Il tourne avec des identifiants à privilèges (tokens de publication, secrets de déploiement, accès cloud), il exécute du code que tu ne maîtrises pas toujours entièrement (dépendances tierces, contributions externes), et il le fait à grande vitesse et sans supervision humaine directe. Les attaquants l’ont bien compris : plutôt que de viser une application, ils visent la chaîne qui la construit et la publie.

La bonne nouvelle, c’est que GitHub a industrialisé ses réponses en 2026 autour de quatre axes : empêcher le compromis initial, empêcher l’exfiltration d’identifiants, ralentir la propagation d’un package compromis, et te permettre de réagir vite si ça arrive quand même. On les prend dans l’ordre.

Empêcher le compromis initial de ton pipeline

Un pull_request_target plus sûr par défaut

Le déclencheur pull_request_target reste le piège numéro un : contrairement à pull_request, il exécute le workflow avec les secrets et les permissions du dépôt de base, même quand la pull request vient d’un fork. Si ton job fait un checkout du code de la fork et l’exécute (tests, build, script), tu ouvres la porte à un « pwn request » : du code non fiable qui tourne avec tes accès et peut exfiltrer tes secrets.

GitHub a changé le comportement par défaut de actions/checkout dans ce contexte : il faut désormais un opt-out explicite après revue du risque pour que du code de fork s’exécute avec les privilèges du dépôt de base. C’est le genre de garde-fou qui t’évite l’erreur de configuration silencieuse. Le détail des bonnes pratiques est documenté dans le guide officiel « Securely using pull_request_target ».

Workflow Execution Protections : la liste blanche des déclencheurs (GA depuis le 17 septembre 2026)

C’est la nouveauté la plus structurante de septembre : tu peux désormais définir, au niveau entreprise, organisation ou dépôt, une liste blanche qui contrôle qui a le droit de déclencher un workflow (règles d’acteur) et quels événements peuvent le démarrer (règles d’événement), avec la possibilité de cibler des fichiers de workflow précis. Un mode « evaluate » te permet de tester la politique en conditions réelles avant de l’appliquer réellement, sans rien bloquer par erreur le premier jour.

Détail important : sur les dépôts publics, une règle par défaut désactive désormais les événements pull_request_target, d’abord en mode évaluation — l’application effective (le blocage réel) est prévue pour le 2 novembre 2026. Si tu as des workflows publics qui en dépendent légitimement, c’est le moment de les auditer et de créer une exception explicite plutôt que de découvrir le blocage en novembre.

Cache-mode : qui a le droit de lire ou d’écrire le cache (GA)

Le cache d’Actions est une cible d’attaque sous-estimée : un attaquant qui parvient à écrire dans un cache partagé peut y déposer une dépendance piégée, que récupérera ensuite un job de confiance. La clé cache-mode, désormais généralement disponible, te permet d’appliquer le principe de moindre privilège au niveau du workflow ou du job :

name: build
on: pull_request_target
cache-mode: read      # niveau workflow : autorise la restauration, bloque l'écriture

jobs:
  build:
    runs-on: ubuntu-latest
    # cache-mode: write   # un job de confiance peut surcharger localement
    steps:
      - uses: actions/checkout@v5
      - uses: actions/cache@v4
        with:
          path: ~/.npm
          key: npm-${{ hashFiles('package-lock.json') }}

Quatre valeurs possibles : read (restauration seule), write (restauration et écriture), write-only (écriture seule), none (aucun accès). Le réglage au niveau du job prévaut sur celui du workflow, y compris à travers des workflows réutilisables — un workflow appelé ne peut jamais hériter de plus de droits que celui qui l’appelle. GitHub affiche même une annotation d’avertissement si tu déclares un accès en écriture sur un événement à faible confiance comme pull_request_target. Le détail est dans le changelog GitHub officiel.

Empêcher l’exfiltration d’identifiants

Trusted publishing : la fin programmée des secrets à longue durée de vie

Le trusted publishing (OIDC) permet de publier un package npm sans stocker le moindre token à durée de vie longue dans ton pipeline : GitHub échange un jeton d’identité éphémère contre une autorisation de publication au moment précis où elle a lieu. En 2026, ce mécanisme s’est étendu au-delà de GitHub Actions, avec l’ajout du support CircleCI — un signe que la filière converge vers « zéro secret long-lived » comme standard, quel que soit ton système de CI.

Actions Network Firewall : voir ce qui sort réellement de tes runners (aperçu technique)

Encore en aperçu technique, cette fonctionnalité journalise tout le trafic sortant de tes workflows et t’aide à repérer un comportement anormal — récupération de code malveillant, tentative d’exfiltration de credentials vers un domaine inconnu. Des restrictions d’egress réseau (bloquer les destinations non autorisées, pas seulement les journaliser) sont annoncées pour la suite. Si tu gères des pipelines sensibles, c’est une fonctionnalité à surveiller de près, y compris pendant sa phase preview.

Ralentir la propagation d’un package compromis

Dependabot cooldown : 3 jours de battement avant la mise à jour

Une release npm fraîchement publiée est justement le moment où une compromission a le plus de chances de passer inaperçue. Dependabot applique désormais un délai minimum de trois jours avant d’ouvrir une pull request de mise à jour de dépendance — le temps que la communauté détecte et signale un package malveillant avant que tu ne l’intègres automatiquement. Les mises à jour de sécurité, elles, restent immédiates : ce cooldown ne s’applique qu’aux montées de version « de confort ».

npm v12 : les scripts d’installation ne s’exécutent plus par défaut

Beaucoup de compromissions npm passent par un postinstall malveillant qui s’exécute silencieusement dès npm install, avant même que tu aies lancé quoi que ce soit. Depuis npm v12, ces scripts d’installation sont désactivés par défaut : tu dois les réactiver explicitement si tu en as besoin, ce qui te force à une décision consciente plutôt qu’à une exécution automatique et invisible.

Réagir vite si ça arrive quand même

Malgré toutes ces couches de défense, prépare-toi aussi à l’incident : GitHub propose désormais une révocation d’identifiants en libre-service à l’échelle de l’entreprise (tous les identifiants utilisateurs d’un coup en cas de compromission avérée), et une API de révocation étendue qui couvre désormais les tokens OAuth et App en plus des tokens d’accès personnels. Avoir ce processus documenté et testé avant l’incident te fait gagner un temps précieux le jour où tu en as besoin.

Check-list à appliquer cette semaine

  • Audite tes workflows utilisant pull_request_target et vérifie qu’aucun ne fait de checkout + exécution de code de fork sans contrôle.
  • Active les Workflow Execution Protections en mode évaluation sur tes dépôts sensibles pour voir l’impact avant l’application forcée du 2 novembre.
  • Passe en revue le cache-mode de tes workflows déclenchés par des événements à faible confiance.
  • Si tu publies sur npm, migre vers le trusted publishing pour éliminer les tokens de publication à longue durée de vie.
  • Documente (et teste) ta procédure de révocation de credentials en cas d’incident, avant d’en avoir besoin en urgence.

FAQ

Le cache-mode remplace-t-il les autres protections ?

Non, c’est une couche parmi d’autres. Il réduit spécifiquement le risque de cache poisoning, mais ne protège pas contre l’exfiltration de secrets par un autre canal : tu as besoin des Workflow Execution Protections et d’un usage prudent de pull_request_target en complément.

Dois-je m’inquiéter si j’utilise déjà GitHub-hosted runners standards ?

Les runners hébergés par GitHub bénéficient déjà d’un bon niveau d’isolation par exécution, mais cela ne protège pas contre un secret exfiltré par un workflow mal configuré. Ces protections s’appliquent quel que soit le type de runner.

Que se passe-t-il si je ne fais rien avant le 2 novembre 2026 ?

Sur les dépôts publics, la règle par défaut désactivant pull_request_target passera du mode évaluation à l’application réelle : les workflows concernés seront bloqués s’ils ne respectent pas la politique. Autant l’anticiper maintenant en mode évaluation plutôt que de le découvrir en production.

Ces protections concernent-elles aussi Azure Pipelines ou GitLab CI ?

Les fonctionnalités détaillées ici sont spécifiques à GitHub Actions et à npm. D’autres plateformes CI/CD ont leurs propres mécanismes équivalents (protection des triggers, gestion des secrets, scan de dépendances) : le principe général — moindre privilège, zéro secret long-lived, délai avant adoption d’une nouvelle version — reste transposable partout.

Pour aller plus loin

Aucune de ces protections n’est magique prise isolément : c’est leur empilement qui fait la différence face à des attaques de plus en plus automatisées. Commence par la check-list ci-dessus sur tes dépôts les plus critiques, active le mode évaluation des Workflow Execution Protections dès maintenant, et reviens régulièrement vérifier l’avancement de l’Actions Network Firewall : c’est probablement la prochaine brique qui passera en disponibilité générale.

Commentaires

Une réponse à « GitHub Actions et npm en 2026 : les défenses anti-supply-chain à activer maintenant »

  1. […] on avait détaillé les défenses anti-supply-chain côté GitHub Actions et npm dans un article précédent, et les leçons des attaques de mars dans […]

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *