Attaque de la chaîne d’approvisionnement Rust cible arrayref, internment et append-only-vec
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
Une attaque sophistiquée sur la chaîne d’approvisionnement a ciblé l’écosystème Rust en compromettant un compte légitime de mainteneur et en utilisant une identité d’hameçonnage pour injecter des dépendances malveillantes pendant le processus de construction. Les attaquants ont empoisonné trois boîtes largement utilisées, arrayref, internment, et append-only-vec, pour exécuter un dépôt de code à distance pendant le processus de construction de Cargo. Cela a permis une exécution silencieuse de code sur les postes de travail des développeurs et les pipelines CI/CD pendant la compilation de routine.
Enquête
Les chercheurs ont analysé l’attaque en utilisant Harden-Runner, qui a capturé le script de construction malveillant tentant une connexion sortante à un serveur de charge utile sur le port 9089. Un examen judiciaire de l’historique Git de crates.io-index a révélé l’insertion ciblée de dépendances malveillantes et une stratégie d’attirance par retrait et mise à jour conçue pour pousser les développeurs vers des versions compromises. Les chercheurs ont également identifié des mécanismes de persistance secondaire et un comportement de C2 signalé par les utilisateurs affectés.
Atténuation
L’atténuation immédiate inclut la fixation des boîtes légitimes à des versions sécurisées vérifiées et l’audit des fichiers Cargo.lock pour les versions compromises des dépendances. Les organisations doivent purger les caches locaux et CI/CD, y compris ~/.cargo/registry/cache, pour supprimer les fichiers malveillants .crate . Le filtrage de sortie pour les connexions sortantes inhabituelles depuis les environnements de construction et une discipline stricte du fichier de verrouillage sont également des défenses critiques à long terme.
Réponse
Si des versions affectées sont trouvées dans un fichier de verrouillage, l’environnement de construction doit être traité comme compromis, et toutes les informations d’identification accessibles, y compris les clés SSH, les jetons cloud et les secrets CI/CD, doivent être renouvelées. Les systèmes des développeurs doivent être examinés pour des artefacts de persistance tels que les services systemd non autorisés ou les fichiers suspects dans les répertoires de configuration. Tous les artefacts logiciels produits pendant la période d’exposition doivent être reconstruits à partir de sources propres et vérifiées.
Flux d’attaque
Détections
Points de persistance possibles [ASEPs – Software/NTUSER Hive] (via événement de registre)
Communications C2 possibles sur HTTP vers IP directe avec port inhabituel (via proxy)
Fichier caché créé sur un hôte Linux (via événement fichier)
IOCs (HashSha256) pour détecter : attaque sur la chaîne d’approvisionnement Rust : arrayref, internment, et append-only-vec empoisonnés par le dépôt de temps de construction proc-macro1
IOCs (SourceIP) pour détecter : attaque sur la chaîne d’approvisionnement Rust : arrayref, internment, et append-only-vec empoisonnés par le dépôt de temps de construction proc-macro1
IOCs (DestinationIP) pour détecter : attaque sur la chaîne d’approvisionnement Rust : arrayref, internment, et append-only-vec empoisonnés par le dépôt de temps de construction proc-macro1
Détection d’une connexion réseau sortante anormale [Connexion réseau Windows]
Exécution de PowerShell malveillant et de VBScript dans l’attaque de la chaîne d’approvisionnement Rust [Windows Powershell]
Exécution d’un processus de construction suspect dans le répertoire temporaire Unix [Création de processus Linux]
Exécution de simulation
Prérequis : Le contrôle pré-vol de la télémétrie et de la base doit avoir réussi.
Raisonnement : Cette section détaille l’exécution précise de la technique de l’adversaire (TTP) conçue pour déclencher la règle de détection. Les commandes et le récit DOIVENT refléter directement les TTPs identifiés et viser à générer la télémétrie exacte attendue par la logique de détection. Des exemples abstraits ou non liés entraîneront un mauvais diagnostic.
-
Récit d’attaque & Commandes : L’adversaire a injecté avec succès un crate malveillant dans un projet Rust. Lorsque le processus de construction est initié, le
script build.rsexécute un fil d’arrière-plan qui tente d’établir une connexion à un serveur C2 distant sur le port 9089 pour récupérer une charge utile. Cela simule la « Connexion réseau sortante anormale » décrite dans la règle. L’objectif est de déclencher l’alerte de journal de pare-feu/réseau en atteignant le port spécifique9089. -
Script de test de régression :
# Simuler un dépôt de temps de construction tentant de se connecter à un serveur C2 sur le port 9089 # Nous utilisons un client TCP pour simuler la tentative de connexion réseau. $C2_IP = "127.0.0.1" # Localhost pour éviter le trafic externe réel pendant le test $C2_PORT = 9089 Write-Host "Simulation de l'activité réseau du processus de construction..." -ForegroundColor Cyan try { $client = New-Object System.Net.Sockets.TcpClient $beginConnect = $client.BeginConnect($C2_IP, $C2_PORT, $null, $null) $success = $beginConnect.AsyncWaitHandle.WaitOne(1000, $false) if ($success) { Write-Host "Connexion réussie ! La télémétrie devrait être générée." -ForegroundColor Green $client.EndConnect($beginConnect) } else { Write-Host "Échec de la connexion (attendu si aucun écouteur n'est actif), mais la télémétrie devrait toujours montrer la tentative." -ForegroundColor Yellow } $client.Close() } catch { Write-Host "Erreur pendant la simulation : $($_.Exception.Message)" -ForegroundColor Red } -
Commandes de nettoyage :
# Aucun changement persistant effectué par le script ; cependant, assurez-vous que tous les écouteurs locaux sont arrêtés. # Si un écouteur a été lancé pour le test, utilisez : Stop-Process -Name "nc" -ErrorAction SilentlyContinue Write-Host "Nettoyage terminé." -ForegroundColor Green