On March 19, 2026, attackers force-pushed 76 of 77 version tags in aquasecurity/trivy-action to credential-stealing malware — replacing the legitimate entrypoint with a multi-stage stealer that ran silently before the real scanner. Workflows appeared to complete normally. Every team that referenced trivy-action@v0.x without SHA pinning was exfiltrating secrets to attacker infrastructure without knowing it. Twelve months earlier, the same vector hit tj-actions/changed-files, compromising 23,000+ repositories in 24 hours (CVE-2025-30066, CISA alert). In May 2026, Megalodon poisoned over 5,500 additional repositories via automated workflow injection commits.

Le 19 mars 2026, des attaquants ont réécrit par force 76 des 77 tags de version de aquasecurity/trivy-action vers un malware voleur de credentials — remplaçant l’entrypoint légitime par un stealer multi-étapes qui s’exécutait silencieusement avant le vrai scanner. Les workflows semblaient se terminer normalement. Chaque équipe référençant trivy-action@v0.x sans pinning SHA exfiltrait des secrets vers l’infrastructure attaquante sans le savoir. Douze mois plus tôt, le même vecteur avait touché tj-actions/changed-files, compromettant 23 000+ dépôts en 24 heures (CVE-2025-30066, alerte CISA). En mai 2026, Megalodon a empoisonné plus de 5 500 dépôts supplémentaires via des commits d’injection de workflows automatisés.

The attack surface is not a secret vault, a CVE in your dependencies, or a misconfigured cloud role. It is the CI/CD pipeline itself — the infrastructure that builds, tests, signs, and ships every release you deploy. This guide covers the six hardening controls that block the majority of 2025–2026 GitHub Actions attack patterns: least-privilege permissions, secret scoping, SHA-based action pinning, SLSA Build Levels, reusable workflow risks, and what GitHub’s 2026 security roadmap will add to the mix.

La surface d’attaque n’est ni un coffre de secrets, ni une CVE dans vos dépendances, ni un rôle cloud mal configuré. C’est le pipeline CI/CD lui-même — l’infrastructure qui compile, teste, signe et livre chaque release que vous déployez. Ce guide couvre les six contrôles de durcissement qui bloquent la majorité des patterns d’attaques GitHub Actions 2025–2026 : permissions moindre privilège, portage des secrets, pinning d’actions par SHA, SLSA Build Levels, risques des workflows réutilisables, et ce que la roadmap sécurité 2026 de GitHub apportera.

23K+
Repositories compromised by CVE-2025-30066 (tj-actions)
Dépôts compromis par CVE-2025-30066 (tj-actions)
Source: CISA Alert, Wiz Blog, March 2025
76/77
trivy-action version tags poisoned in March 2026 (TeamPCP)
Tags de version trivy-action empoisonnés en mars 2026 (TeamPCP)
Source: Aqua Security GHSA-69fq-xp46-6x23, CrowdStrike, March 2026
5,500+
Repos poisoned in the Megalodon workflow injection campaign (May 2026)
Dépôts empoisonnés dans la campagne Megalodon (mai 2026)
Source: SecurityWeek, Megalodon campaign analysis, May 2026
+69%
GitHub malware advisories published in 2025 vs 2024
Avis de malware GitHub publiés en 2025 vs 2024
Source: GitHub Advisory Database stats, 2025 annual review

1. Workflow Permissions: Start With read-all, Grant Explicitly

1. Permissions de Workflow : Commencer par read-all, Accorder Explicitement

The GITHUB_TOKEN is the most abused credential in GitHub Actions exploits. Before February 2023, GitHub set the default to read-write for all scopes, meaning any compromised action could push code, create releases, write to packages, or modify issues without additional configuration. Although new repositories now default to read, many organizations running workflows created before that cutoff still operate with write-permissive defaults.

Le GITHUB_TOKEN est la credential la plus exploitée dans les attaques GitHub Actions. Avant février 2023, GitHub définissait la valeur par défaut à read-write pour toutes les portées, ce qui signifiait qu’une action compromise pouvait pousser du code, créer des releases, écrire dans les packages ou modifier les issues sans configuration supplémentaire. Bien que les nouveaux dépôts aient maintenant une valeur par défaut read, de nombreuses organisations exécutant des workflows créés avant cette coupure fonctionnent toujours avec des défauts permissifs en écriture.

The correct pattern is to set permissions: read-all at the workflow level, then override only the permissions each job actually requires. This limits blast radius: even if a compromised third-party action runs inside your workflow, it cannot write to your repository, publish packages, or modify deployments unless your YAML explicitly grants it.

Le bon pattern est de définir permissions: read-all au niveau du workflow, puis de surcharger uniquement les permissions dont chaque job a réellement besoin. Cela limite le rayon de blast : même si une action tierce compromise s’exécute dans votre workflow, elle ne peut pas écrire dans votre dépôt, publier des packages ou modifier les déploiements à moins que votre YAML ne l’accorde explicitement.

# Workflow-level: deny all write by default
permissions:
  contents: read
  pull-requests: read

jobs:
  build:
    runs-on: ubuntu-latest
    # Job-level override — only this job can write to packages
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v4

  deploy:
    runs-on: ubuntu-latest
    # Deployment job needs id-token to request OIDC credentials
    permissions:
      id-token: write
      contents: read
    steps:
      - name: Configure AWS via OIDC
        uses: aws-actions/configure-aws-credentials@v4

Define permissions at the job level, not the workflow level, wherever possible. A deploy job requesting id-token: write should not grant that permission to the lint or test jobs running in the same workflow file. Granularity at the job level ensures that even a compromised build step cannot request cloud credentials.

Définissez les permissions au niveau du job plutôt qu’au niveau du workflow chaque fois que c’est possible. Un job de déploiement demandant id-token: write ne doit pas accorder cette permission aux jobs de lint ou de test s’exécutant dans le même fichier workflow. La granularité au niveau du job garantit que même une étape de build compromise ne peut pas demander de credentials cloud.

2. Environment Secrets vs Repository Secrets: Scope to Minimum Context

2. Secrets d’Environnement vs Secrets de Dépôt : Porter au Contexte Minimum

Repository secrets are available to every workflow in a repository, on every branch, triggered by any event. This is rarely the right scope. A production database password or a cloud deployment key that is accessible to a workflow triggered by a fork pull request is a significant misconfiguration. GitHub environments provide the correct answer: a secret scoped to a named environment is only available to jobs that reference that environment, and environments support protection rules such as required reviewers, deployment branches, and wait timers.

Les secrets de dépôt sont disponibles pour chaque workflow d’un dépôt, sur chaque branche, déclenchés par n’importe quel événement. C’est rarement la bonne portée. Un mot de passe de base de données de production ou une clé de déploiement cloud accessible à un workflow déclenché par une pull request d’un fork est une mauvaise configuration significative. Les environnements GitHub apportent la bonne réponse : un secret porté à un environnement nommé n’est disponible que pour les jobs qui référencent cet environnement, et les environnements supportent des règles de protection comme les reviewers requis, les branches de déploiement et les timers d’attente.

jobs:
  deploy-production:
    runs-on: ubuntu-latest
    # Only jobs referencing this environment can access its secrets
    environment: production
    steps:
      - name: Deploy
        env:
          # ${{ secrets.PROD_DB_URL }} is ONLY available because of `environment: production`
          DATABASE_URL: ${{ secrets.PROD_DB_URL }}
        run: ./scripts/deploy.sh

Configure production environments with a required reviewers rule and restrict deployment to the main branch only. This means that even if an attacker gains write access to a feature branch, they cannot trigger the deployment job that holds your production secrets. The secret never leaves GitHub’s infrastructure unless the protection rules are explicitly satisfied.

Configurez les environnements de production avec une règle de reviewers requis et restreignez le déploiement à la branche main uniquement. Cela signifie que même si un attaquant obtient un accès en écriture à une branche de fonctionnalité, il ne peut pas déclencher le job de déploiement qui contient vos secrets de production. Le secret ne quitte jamais l’infrastructure de GitHub à moins que les règles de protection ne soient explicitement satisfaites.

3. Pin Every Action to a Full Commit SHA — Not a Tag

3. Pinner Chaque Action sur un SHA Complet — Pas un Tag

Git tags are mutable. An attacker who compromises the credentials of an action maintainer can silently repoint any tag — including @v4, @latest, or any historical tag like @v0.32.1 — to a malicious commit without changing the tag name. The trivy-action attack of March 2026 demonstrated this at scale: 76 of 77 tags were rewritten in a single operation using force-push. A commit SHA, by contrast, is content-addressed and cryptographically immutable. No force-push can change what @abc1234... resolves to.

Les tags Git sont mutables. Un attaquant qui compromet les credentials d’un mainteneur d’action peut silencieusement repointre n’importe quel tag — y compris @v4, @latest ou n’importe quel tag historique comme @v0.32.1 — vers un commit malveillant sans changer le nom du tag. L’attaque trivy-action de mars 2026 l’a démontré à grande échelle : 76 des 77 tags ont été réécrits en une seule opération via force-push. Un SHA de commit, en revanche, est adressé par contenu et cryptographiquement immuable. Aucun force-push ne peut changer ce à quoi @abc1234... se résout.

# UNSAFE — tag is mutable, can be silently repointed
- uses: actions/checkout@v4

# SAFE — SHA is immutable
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683  # v4.2.2

# SAFE with readable comment (recommended pattern)
- uses: aquasecurity/trivy-action@6c175e9c4083a8c84ff71d243e605f8b5bd9bc8b  # v0.35.0 (only clean tag)

Tools like StepSecurity Harden-Runner and actionlint can audit your workflows for unpinned actions in CI. Renovate and Dependabot both support automatic SHA-pinning updates with human-readable version comments, so you do not lose visibility into which version you are running.

Des outils comme StepSecurity Harden-Runner et actionlint peuvent auditer vos workflows pour les actions non-pinnées en CI. Renovate et Dependabot supportent tous deux les mises à jour automatiques du SHA-pinning avec des commentaires de version lisibles, donc vous ne perdez pas la visibilité sur la version que vous exécutez.

4. SLSA Build Levels: What GitHub Actions Gives You Out of the Box (and What It Doesn’t)

4. SLSA Build Levels : Ce que GitHub Actions vous Donne par Défaut (et ce qu’il ne donne pas)

SLSA (Supply-chain Levels for Software Artifacts) defines four build integrity levels. GitHub Actions hosted runners achieve SLSA Build Level 2 out of the box when you use GitHub’s Artifact Attestations feature. Level 2 requires that builds run on a hosted platform and that provenance is signed and tied to that platform’s identity. GitHub meets both requirements: hosted runners provide platform identity via OIDC tokens, and Sigstore handles the signature.

SLSA (Supply-chain Levels for Software Artifacts) définit quatre niveaux d’intégrité de build. Les runners hébergés GitHub Actions atteignent SLSA Build Level 2 par défaut lorsque vous utilisez la fonctionnalité Artifact Attestations de GitHub. Le niveau 2 requiert que les builds s’exécutent sur une plateforme hébergée et que la provenance soit signée et liée à l’identité de cette plateforme. GitHub remplit les deux conditions : les runners hébergés fournissent une identité de plateforme via des tokens OIDC, et Sigstore gère la signature.

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      id-token: write
      attestations: write
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683  # v4.2.2
      - name: Build artifact
        run: make build
      - name: Generate SLSA provenance attestation (Build Level 2)
        uses: actions/attest-build-provenance@1c608d11d69870c2092266b3f9a6f3abbf17002c  # v1.4.3
        with:
          subject-path: dist/my-artifact

Build Level 3 requires stronger isolation: the build platform must prevent runs from influencing each other, and signing key material must be inaccessible to user-defined build steps. Standard GitHub Actions workflows do not meet L3 because build steps and provenance generation run in the same job — a compromised build step could theoretically exfiltrate the signing key. Achieving L3 requires using the slsa-github-generator reusable workflow, which isolates provenance generation in a separate job with separate OIDC context that user code cannot reach.

Build Level 3 exige une isolation plus forte : la plateforme de build doit empêcher les runs de s’influencer mutuellement, et le matériel de clé de signature doit être inaccessible aux étapes de build définies par l’utilisateur. Les workflows GitHub Actions standard n’atteignent pas le L3 parce que les étapes de build et la génération de provenance s’exécutent dans le même job — une étape de build compromise pourrait théoriquement exfiltrer la clé de signature. Atteindre L3 nécessite d’utiliser le workflow réutilisable slsa-github-generator, qui isole la génération de provenance dans un job séparé avec un contexte OIDC distinct que le code utilisateur ne peut pas atteindre.

For most teams shipping web applications, SLSA Build Level 2 (artifact attestations) combined with SHA-pinned actions and least-privilege permissions provides meaningful supply chain integrity. Level 3 is primarily relevant for teams distributing software to downstream consumers who need to verify provenance independently.

Pour la plupart des équipes livrant des applications web, SLSA Build Level 2 (attestations d’artefacts) combiné avec des actions pinnées par SHA et des permissions de moindre privilège fournit une intégrité significative de la chaîne d’approvisionnement. Le niveau 3 est principalement pertinent pour les équipes distribuant des logiciels à des consommateurs en aval qui ont besoin de vérifier la provenance de manière indépendante.

5. Reusable Workflow Supply Chain Risks

5. Risques Supply Chain des Workflows Réutilisables

Reusable workflows introduce a second category of supply chain risk that is distinct from action pinning. When a workflow calls a reusable workflow with uses: org/repo/.github/workflows/build.yml@main, it is executing an entire workflow file from another repository, potentially with access to the calling repository’s secrets if secrets: inherit is used. The attack surface is larger than a single action: the entire workflow file, including all the actions it internally references, is within scope.

Les workflows réutilisables introduisent une deuxième catégorie de risque supply chain distincte du pinning d’actions. Quand un workflow appelle un workflow réutilisable avec uses: org/repo/.github/workflows/build.yml@main, il exécute un fichier workflow entier depuis un autre dépôt, potentiellement avec accès aux secrets du dépôt appelant si secrets: inherit est utilisé. La surface d’attaque est plus grande qu’une seule action : le fichier workflow entier, y compris toutes les actions qu’il référence en interne, est dans le périmètre.

# RISKY: floating ref + secrets: inherit
jobs:
  build:
    uses: my-org/shared-workflows/.github/workflows/build.yml@main
    secrets: inherit  # ALL repository secrets passed to external workflow

# SAFER: SHA-pinned ref + explicit secret passing
jobs:
  build:
    uses: my-org/shared-workflows/.github/workflows/build.yml@a1b2c3d4...  # commit SHA
    secrets:
      NPM_TOKEN: ${{ secrets.NPM_TOKEN }}  # pass only what is needed

Three practices reduce reusable workflow risk. First, pin the called workflow to a commit SHA, not a branch or tag. Second, never use secrets: inherit unless you own and fully control the called workflow repository — prefer explicit secret forwarding. Third, audit what actions the reusable workflow itself calls: a reusable workflow that internally calls unpinned third-party actions is a transitive supply chain risk that your SHA pin on the outer workflow does not address.

Trois pratiques réduisent les risques des workflows réutilisables. Premièrement, pinnez le workflow appelé à un SHA de commit, pas une branche ou un tag. Deuxièmement, n’utilisez jamais secrets: inherit à moins de posséder et de contrôler totalement le dépôt du workflow appelé — préférez le transfert de secrets explicite. Troisièmement, auditez quelles actions le workflow réutilisable lui-même appelle : un workflow réutilisable qui appelle en interne des actions tierces non-pinnées est un risque supply chain transitif que votre pin SHA sur le workflow externe ne traite pas.

6. GitHub’s 2026 Security Roadmap: What’s Coming

6. La Roadmap Sécurité GitHub 2026 : Ce qui arrive

GitHub published its 2026 Actions security roadmap in response to the cascade of supply chain incidents. Three features will fundamentally change the hardening baseline once they reach general availability.

GitHub a publié sa roadmap sécurité Actions 2026 en réponse à la cascade d’incidents supply chain. Trois fonctionnalités changeront fondamentalement la ligne de base de durcissement une fois qu’elles atteindront la disponibilité générale.

Workflow dependency locking adds a dependencies section to workflow YAML that locks every direct and transitive action to a specific commit SHA, similar to go.mod + go.sum for Go modules or package-lock.json for npm. GitHub verifies the lock before jobs execute. Teams can review changes to locked dependencies in pull requests, getting the same change-review workflow they already have for application dependencies. This eliminates the most common vector: tag mutation on third-party actions.

Le verrouillage des dépendances de workflow ajoute une section dependencies au YAML du workflow qui verrouille chaque action directe et transitive à un SHA de commit spécifique, similaire à go.mod + go.sum pour les modules Go ou package-lock.json pour npm. GitHub vérifie le verrou avant l’exécution des jobs. Les équipes peuvent examiner les modifications des dépendances verrouillées dans les pull requests, obtenant le même flux de revue de changements qu’elles ont déjà pour les dépendances d’application. Cela élimine le vecteur le plus courant : la mutation de tag sur les actions tierces.

Scoped secrets replaces the binary repository/environment model with fine-grained binding of credentials to explicit execution contexts. A secret can be scoped to specific branches, environments, workflow identities, or file paths. Critically, write access to a repository will no longer grant secret management permissions — that moves to a dedicated custom role. This is a breaking change that eliminates a privilege escalation path present in many current configurations: a collaborator with write access who creates a workflow can today read any repository secret.

Les secrets portés remplacent le modèle binaire dépôt/environnement par une liaison fine des credentials à des contextes d’exécution explicites. Un secret peut être porté à des branches spécifiques, des environnements, des identités de workflow ou des chemins de fichiers. Critiquement, l’accès en écriture à un dépôt ne accordera plus les permissions de gestion des secrets — cela passe à un rôle personnalisé dédié. C’est un changement qui élimine un chemin d’éscalade de privilèges présent dans de nombreuses configurations actuelles : un collaborateur avec accès en écriture qui crée un workflow peut aujourd’hui lire n’importe quel secret de dépôt.

Native Layer 7 egress firewall operates outside the runner VM, at the network layer, and remains immutable even if an attacker gains root inside the runner environment. Organizations define precise egress policies: allowed domains, IP ranges, permitted HTTP methods, and TLS requirements. A malicious action that attempts to exfiltrate secrets to attacker infrastructure will have its outbound connections blocked by a control the action itself cannot disable. This addresses the class of attacks where existing egress-monitoring tools (running as a step inside the runner) can be bypassed by attacker code with elevated runner privileges.

Le pare-feu de sortie natif Layer 7 opère en dehors de la VM du runner, au niveau réseau, et reste immuable même si un attaquant obtient les droits root à l’intérieur de l’environnement runner. Les organisations définissent des politiques de sortie précises : domaines autorisés, plages d’IP, méthodes HTTP autorisées et exigences TLS. Une action malveillante qui tente d’exfiltrer des secrets vers l’infrastructure de l’attaquant verra ses connexions sortantes bloquées par un contrôle que l’action elle-même ne peut pas désactiver. Cela traite la classe d’attaques où les outils de monitoring de sortie existants (s’exécutant comme une étape à l’intérieur du runner) peuvent être contournés par du code attaquant avec des privilèges runner élevés.

Most roadmap features enter public preview within 3–6 months and reach general availability at 6–9 months from announcement. In the meantime, the six controls described above — permissions, secret scoping, SHA pinning, attestations, reusable workflow hygiene, and keeping Dependabot enabled for Actions — cover the majority of the attack surface that the 2025–2026 incidents exploited.

La plupart des fonctionnalités de la roadmap entrent en prévisualisation publique dans 3–6 mois et atteignent la disponibilité générale à 6–9 mois après l’annonce. En attendant, les six contrôles décrits ci-dessus — permissions, portée des secrets, pinning SHA, attestations, hygiène des workflows réutilisables, et maintien de Dependabot activé pour les Actions — couvrent la majorité de la surface d’attaque exploitée par les incidents 2025–2026.

GitHub Actions Security Hardening Checklist 2026

Check-list de Durcissement GitHub Actions 2026

Apply these controls in order of risk reduction:

Appliquez ces contrôles dans l’ordre de réduction des risques :

Set permissions: read-all at workflow level, override per job Définir permissions: read-all au niveau workflow, surcharger par job
Move all production secrets to named environments with branch protection rules Déplacer tous les secrets de production vers des environnements nommés avec règles de protection de branche
Pin all uses: references to full 40-character commit SHAs Pinner toutes les références uses: à des SHAs de commit complets de 40 caractères
Enable Dependabot version updates for GitHub Actions in .github/dependabot.yml Activer les mises à jour de version Dependabot pour GitHub Actions dans .github/dependabot.yml
Add actions/attest-build-provenance to publish jobs (SLSA Build Level 2) Ajouter actions/attest-build-provenance aux jobs de publication (SLSA Build Level 2)
Audit all pull_request_target triggers — never checkout untrusted code with write permissions in this context Auditer tous les triggers pull_request_target — ne jamais checkout du code non-fiable avec des permissions en écriture dans ce contexte
Replace long-lived cloud credentials in secrets with OIDC short-lived tokens Remplacer les credentials cloud long-lived dans les secrets par des tokens courts OIDC
Review reusable workflow calls: pin to SHA, avoid secrets: inherit from external orgs Examiner les appels de workflows réutilisables : pinner au SHA, éviter secrets: inherit depuis des orgs externes

Frequently Asked Questions

Questions fréquentes

Is SHA pinning required if I only use GitHub’s official actions (actions/*)?

Le pinning SHA est-il nécessaire si je n’utilise que les actions officielles de GitHub (actions/*) ?

For actions/* (checkout, setup-node, upload-artifact, etc.), the risk of tag mutation is lower because GitHub controls the repository and has strong internal controls. However, pinning is still recommended as a universal policy: the trivy-action and tj-actions maintainers also did not expect to be compromised. A blanket SHA-pinning policy eliminates the need to make case-by-case trust decisions about individual action publishers.

Pour les actions/* (checkout, setup-node, upload-artifact, etc.), le risque de mutation de tag est plus faible parce que GitHub contrôle le dépôt et dispose de contrôles internes solides. Cependant, le pinning est toujours recommandé comme politique universelle : les mainteneurs de trivy-action et tj-actions ne s’attendaient pas non plus à être compromis. Une politique de pinning SHA universelle élimine le besoin de prendre des décisions de confiance au cas par cas pour les éditeurs d’actions individuelles.

What is the difference between pull_request and pull_request_target in terms of security?

Quelle est la différence entre pull_request et pull_request_target en termes de sécurité ?

pull_request workflows run in the context of the fork (or the PR branch), with no access to base repository secrets. This is safe for untrusted contributions. pull_request_target runs in the context of the base repository and has access to its secrets — designed for workflows that need to post comments or labels back to the PR. The risk is severe when these two are combined: a workflow using pull_request_target that also checks out the PR’s code gives that untrusted code execution access to your base repository secrets. Never combine pull_request_target with a checkout of the PR’s ref if the job holds any write permissions or secrets.

Les workflows pull_request s’exécutent dans le contexte du fork (ou de la branche PR), sans accès aux secrets du dépôt de base. C’est sûr pour les contributions non-fiables. pull_request_target s’exécute dans le contexte du dépôt de base et a accès à ses secrets — conçu pour les workflows qui ont besoin de poster des commentaires ou des labels en retour vers la PR. Le risque est sévère quand ces deux sont combinés : un workflow utilisant pull_request_target qui checkout aussi le code de la PR donne à ce code non-fiable un accès d’exécution à vos secrets du dépôt de base. Ne combinez jamais pull_request_target avec un checkout de la référence de la PR si le job possède des permissions en écriture ou des secrets.

When will GitHub’s scoped secrets and dependency locking be available?

Quand les secrets portés et le verrouillage de dépendances de GitHub seront-ils disponibles ?

GitHub’s 2026 roadmap indicates public preview within 3–6 months and general availability at 6–9 months from the roadmap announcement. The roadmap was published in early 2026, so general availability of most features is expected in Q3–Q4 2026. OIDC custom property claims — the first piece of the scoped secrets roadmap — already reached general availability on April 2, 2026.

La roadmap 2026 de GitHub indique une prévisualisation publique dans 3–6 mois et une disponibilité générale à 6–9 mois après l’annonce de la roadmap. La roadmap a été publiée début 2026, donc la disponibilité générale de la plupart des fonctionnalités est attendue en Q3–Q4 2026. Les claims de propriétés personnalisées OIDC — la première pièce de la roadmap des secrets portés — ont déjà atteint la disponibilité générale le 2 avril 2026.

Do these hardening steps protect against the Megalodon-style workflow injection attack?

Ces étapes de durcissement protègent-elles contre l’attaque d’injection de workflow de type Megalodon ?

Megalodon injected malicious .github/workflows/*.yml files into repositories via automated commits. If a workflow created this way has access to secrets, those secrets are at risk. The primary defenses are: (1) branch protection rules on main requiring PR reviews before merging, so automated commits cannot land in the base branch without human approval; (2) environments with required reviewers, preventing production secrets from being accessible to workflows that run on unprotected branches; and (3) repository rulesets that restrict who can push workflow files.

Megalodon a injecté des fichiers .github/workflows/*.yml malveillants dans des dépôts via des commits automatisés. Si un workflow créé de cette façon a accès aux secrets, ces secrets sont en danger. Les défenses primaires sont : (1) des règles de protection de branche sur main nécessitant des revues de PR avant fusion, de sorte que les commits automatisés ne peuvent pas atterrir dans la branche de base sans approbation humaine ; (2) des environnements avec des reviewers requis, empêchant les secrets de production d’être accessibles aux workflows s’exécutant sur des branches non protégées ; (3) des rulesets de dépôt qui limitent qui peut pousser des fichiers workflow.

Should I use GITHUB_TOKEN or a Personal Access Token (PAT) for cross-repo operations?

Dois-je utiliser GITHUB_TOKEN ou un Personal Access Token (PAT) pour les opérations inter-dépôts ?

Prefer GITHUB_TOKEN wherever possible. It is automatically rotated per job, scoped to a single repository, and expires when the job ends. PATs are long-lived, broad in scope, and tied to individual accounts — if leaked, they remain valid until manually revoked. For cross-repo operations, GitHub Apps tokens are preferable to PATs: they support fine-grained repository permissions, have configurable expiry, and are not tied to a specific user account.

Préférez GITHUB_TOKEN chaque fois que possible. Il est automatiquement rotationné par job, porté à un seul dépôt, et expire quand le job se termine. Les PAT sont long-lived, à large portée, et liés à des comptes individuels — s’ils fuient, ils restent valides jusqu’à révocation manuelle. Pour les opérations inter-dépôts, les tokens GitHub Apps sont préférables aux PAT : ils supportent des permissions de dépôt finement granulées, ont une expiration configurable, et ne sont pas liés à un compte utilisateur spécifique.

How does OptiBot help with GitHub Actions security?

Comment OptiBot aide-t-il avec la sécurité GitHub Actions ?

OptiBot scans your package-lock.json, yarn.lock, requirements.txt, Gemfile.lock, go.sum, composer.lock, and other lockfiles daily against the OSV.dev database. When a CVE is published that affects one of your dependencies — including the npm packages and Python libraries that your GitHub Actions runners install during CI — OptiBot alerts you with severity, patch availability, and affected projects. This covers the application dependency layer that GitHub’s Actions security features do not address: the packages your workflows npm install or pip install during each run.

OptiBot scanne vos package-lock.json, yarn.lock, requirements.txt, Gemfile.lock, go.sum, composer.lock et autres lockfiles quotidiennement contre la base de données OSV.dev. Quand une CVE est publiée qui affecte l’une de vos dépendances — y compris les packages npm et bibliothèques Python que vos runners GitHub Actions installent pendant le CI — OptiBot vous alerte avec la sévérité, la disponibilité du patch et les projets affectés. Cela couvre la couche de dépendances d’application que les fonctionnalités de sécurité GitHub Actions ne traitent pas : les packages que vos workflows installent via npm install ou pip install à chaque exécution.

Monitor the Dependencies Your CI/CD Installs

Surveillez les Dépendances que Votre CI/CD Installe

GitHub Actions hardening secures your pipeline. CVE OptiBot secures what the pipeline installs. Scan your lockfiles daily against the full OSV.dev database — get alerted the moment a CVE lands in your npm, Python, PHP, Go, Rust, Ruby, Java, or .NET dependencies, across every project your team manages.

Le durcissement GitHub Actions sécurise votre pipeline. CVE OptiBot sécurise ce que le pipeline installe. Scannez vos lockfiles quotidiennement contre la base de données OSV.dev complète — soyez alerté dès qu’une CVE touche vos dépendances npm, Python, PHP, Go, Rust, Ruby, Java ou .NET, dans tous les projets gérés par votre équipe.

Start free dependency monitoring Démarrer le monitoring gratuit