Back to blog
JenkinsCI/CDCVE-2024-23897RCEpipelineDevSecOps

Jenkins : CVE critiques et sécurisation de votre pipeline CI/CD

Jenkins, l'outil CI/CD le plus utilisé, concentre des vulnérabilités critiques permettant l'exécution de code et l'accès aux secrets. Analyse des CVE majeures et bonnes pratiques.

April 23, 20264 min read

Jenkins est l'outil d'intégration continue et de déploiement continu (CI/CD) le plus déployé au monde. Un Jenkins compromis donne accès aux pipelines de build, aux credentials de production, aux clés SSH et aux secrets d'infrastructure — c'est un actif de valeur extrême pour un attaquant.

CVE-2024-23897 : Arbitrary File Read (CVSS 9.8)

La CVE Jenkins de 2024

En janvier 2024, CVE-2024-23897 — une lecture de fichier arbitraire dans le CLI Jenkins conduisant potentiellement à une exécution de code à distance.

Mécanisme :

Jenkins utilise la bibliothèque args4j pour parser les arguments CLI. Une option permet de lire le contenu de fichiers comme arguments (@/path/to/file). En exploitant cette fonctionnalité via des requêtes CLI non authentifiées (selon la configuration), un attaquant peut lire des fichiers arbitraires sur le serveur Jenkins.

Les fichiers sensibles ciblés :

  • /etc/passwd — liste des utilisateurs système
  • ~/.ssh/id_rsa — clés SSH des comptes de build
  • secrets/master.key — clé maître Jenkins pour déchiffrer les credentials
  • credentials.xml — fichier contenant tous les credentials chiffrés

Avec la clé maître et le fichier credentials.xml, tous les secrets Jenkins sont déchiffrables.

Versions affectées : Jenkins < 2.442, LTS < 2.426.3
Score CVSS : 9.8

Exploitation active

Des exploits publics étaient disponibles dans les 48 heures suivant la divulgation. Des honeypots Jenkins ont détecté des tentatives d'exploitation massives ciblant spécifiquement les fichiers secrets/master.key et credentials.xml.

CVE-2019-1003000 : Script Security Sandbox Escape (CVSS 9.8)

Une évasion du sandbox Groovy dans Jenkins Pipelines. Le sandbox est censé empêcher l'exécution de code arbitraire dans les pipelines — cette CVE permettait de le contourner via des méthodes de métaprogrammation Groovy spécifiques.

// Exemple de bypass sandbox (simplifié)
@NonCPS
def exploit() {
    // Code s'échappant du sandbox Jenkins
}

CVE-2018-1000861 : RCE non authentifiée (CVSS 9.8)

Une désérialisation non sécurisée dans la bibliothèque Stapler utilisée par Jenkins permettait une exécution de code à distance sans authentification via une requête HTTP forgée.

CVE-2016-0792 : RCE via Remoting (CVSS 9.8)

Une faille dans le protocole Jenkins Remoting (communications master-slave) permettait à un nœud Jenkins esclave de compromettre le master, ou vice versa.

Le problème du Groovy dans Jenkins

Les pipelines Jenkins utilisent Groovy — un langage complet de la JVM. Même avec le sandbox activé, des échappées régulières sont découvertes. Des recommandations clés :

Pipeline Declarative vs Scripted

// MOINS SÉCURISÉ — Scripted Pipeline, accès complet Groovy
node {
    sh "deploy.sh"
}

// PLUS SÉCURISÉ — Declarative Pipeline, syntaxe restreinte
pipeline {
    agent any
    stages {
        stage('Deploy') {
            steps {
                sh 'deploy.sh'
            }
        }
    }
}

Sécuriser Jenkins

1. Désactiver l'accès CLI si inutilisé

// jenkins.yaml (JCasC)
jenkins:
  disabledAdministrativeMonitors:
    - "hudson.diagnosis.ReverseProxySetupMonitor"
  remotingSecurity:
    enabled: true
# Ou via l'interface : Administrer Jenkins → Sécurité → Désactiver le CLI

2. Activer l'authentification et l'autorisation strictes

Administrer Jenkins → Configurer la sécurité globale
→ Sécurité : Matrice basée sur les projets
→ Autoriser uniquement les utilisateurs authentifiés
→ Désactiver l'accès anonyme

3. Utiliser les credentials Jenkins plutôt que des variables en clair

// DANGEREUX
environment {
    AWS_SECRET = "mon-secret-en-clair"
}

// CORRECT — utiliser les credentials Jenkins
withCredentials([string(credentialsId: 'aws-secret', variable: 'AWS_SECRET')]) {
    sh 'aws deploy ...'
}

4. Ne pas exposer Jenkins directement sur internet

Placez Jenkins derrière un reverse proxy (Nginx/Apache) avec authentification forte. N'exposez jamais le port Jenkins (8080) directement.

5. Mettre à jour Jenkins et ses plugins

# Via CLI Jenkins
java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin <plugin-name>

# Ou automatiser via Jenkins Configuration as Code (JCasC)

Les plugins Jenkins sont souvent la source de vulnérabilités — maintenez-les à jour.

6. Isoler les nœuds de build

Les agents Jenkins exécutent du code potentiellement non fiable (code des développeurs, dépendances tierces). Utilisez des agents Docker éphémères :

pipeline {
    agent {
        docker {
            image 'node:18-alpine'
            args '--network none'  // Isolation réseau
        }
    }
}

7. Activer les audit logs

Administrer Jenkins → Audit Trail Plugin
→ Logger toutes les actions admin et les builds

Jenkins en 2024 : la surface d'attaque reste large

Jenkins a plus de 1800 plugins officiels — chacun représente une surface d'attaque potentielle. Des CVE de plugins (parfois critiques) sont publiées chaque semaine. Si vous utilisez Jenkins, la veille CVE sur le core ET les plugins est indispensable.


Vérifiez les CVE Jenkins sur cveo.tech — cherchez jenkins pour voir l'historique complet des vulnérabilités.

Monitor CVEs with AI

AI-powered search, CVSS scoring, asset monitoring and automatic alerts.