Aller au contenu
Sécurité medium

GitHub Actions détourné en scanner distribué (cPanel / WHM)

4 min de lecture
Point de compromission dans la chaîne Rupture · étape CI/CD
Source
amont
Dépendances
deps
Build & CI
CI/CD
Packaging
artefact
Release
provenance
Registres
distribution
Déploiement
admission
Runtime
exécution
Rayon d'explosion — compromission à l'étape CI/CD, propagation possible aux consommateurs. Domaines : Orchestration, Source, Intégration, Release, Déploiement, Fournisseurs, Secrets, Cloud
Gravité critique
Des dépôts GitHub compromis embarquent 55 à 62 workflows malveillants chacun (583 fichiers sur 10 paquets Packagist synchronisés automatiquement). Déclenchés au push, ils transforment les runners GitHub en scanner Internet qui exploite CVE-2026-41940 (contournement d'authentification cPanel et WHM, CVSS 9.8, EPSS 98,1 %, catalogue CISA KEV) et moissonne clés cloud, jetons SCM et accès bases. Particularité : installer le paquet PHP n'exécute rien, le code est sain et l'attaque vit dans .github/workflows. Le dépôt sert d'infrastructure de calcul à l'attaquant, pas de vecteur de contamination. Environ 6 100 à 16 000 fichiers correspondants repérés, ce qui ne préjuge pas du nombre de dépôts réellement compromis.
583
workflows malveillants
9.8
CVSS de CVE-2026-41940
98,1 %
EPSS (exploitation 30 j)
6 100 à 16 000
fichiers correspondants

En bref

Date
22/07/2026
Gravité
Critique
Étape de la chaîne
CI/CD
Domaines SOCLE
Orchestration+ Source, Intégration, Release, Déploiement, Fournisseurs, Secrets, Cloud
CVE
CVE-2026-41940 · CVSS 9.8

Que s'est-il passé ?

Contexte

Dix paquets Packagist d'un développeur PHP et DevOps légitime, `dinushchathurya`, exposent des versions de développement malveillantes les 12 et 13 juillet 2026. Le développeur est une victime : ses dépôts GitHub ont été compromis, et Packagist a synchronisé automatiquement ce que l'attaquant y avait poussé.

Mécanisme

Le code PHP est propre. L'attaque vit dans `.github/workflows/`, avec 55 à 62 workflows par paquet, 583 fichiers au total. Installer le paquet n'exécute rien : Composer le range dans `vendor/`, où GitHub ignore les workflows imbriqués. L'exécution ne se produit qu'au push sur le dépôt compromis. Chaque workflow lance alors un runner Ubuntu éphémère (jusqu'à 350 minutes), télécharge une charge utile depuis un serveur de commande en IP brute, et scanne Internet.

Impact

Les runners GitHub deviennent une infrastructure de scan distribuée, aux frais des victimes. La charge utile exploite CVE-2026-41940 (contournement d'authentification cPanel et WHM, CVSS 9.8, EPSS 98,1 %, catalogue CISA KEV) et moissonne clés AWS, jetons GitHub et GitLab, clés OpenAI, Stripe, SendGrid, accès bases et matériel SSH. Un WHM compromis peut exposer plusieurs environnements hébergés d'un coup. Environ 6 100 à 16 000 fichiers correspondants ont été repérés par recherche de code, ce qui ne préjuge pas du nombre de dépôts réellement compromis.

Parades

Traiter le workflow CI comme du code exécutable : revue obligatoire sur `.github/workflows`, permissions minimales du `GITHUB_TOKEN`, surveillance de la sortie réseau des runners avec alerte sur tout téléchargement depuis une adresse IP brute. Côté dépendances, verrouiller les lockfiles sur des références de commit connues plutôt que sur des versions de développement. Côté exposé, patcher cPanel et WHM et lancer le script de détection d'indicateurs de compromission.

Comment l'attaquant a procédé

Cet incident met en jeu les vecteurs d'attaque suivants du catalogue SOCLE ; chacun renvoie à sa fiche, où l'on trouve les exigences qui le neutralisent :

La leçon à en tirer

Ce qu'il faut retenir

Un workflow CI est un composant logiciel exécutable : exiger une revue obligatoire sur .github/workflows, réduire les permissions du GITHUB_TOKEN, surveiller la sortie réseau des runners et alerter sur tout téléchargement depuis une adresse IP brute ; verrouiller les lockfiles sur des références de commit connues plutôt que sur des versions de développement.

Les exigences SOCLE qui auraient limité cet incident

Cet incident se rattache à 20 exigences du référentiel, par domaine. Les satisfaire n'aurait pas forcément tout empêché, mais aurait réduit la probabilité de l'attaque, limité son impact ou accéléré sa détection :

Pour aller plus loin

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn