
Outil d’analyse comportementale en temps réel qui isole les paquets suspects dans Docker, trace les appels système avec strace, cartographie les cascades de processus en graphes orientés, et détecte les attaques de la chaîne d’approvisionnement à l’aide de signatures YARA, de détection d’anomalies par apprentissage automatique et d’analyse temporelle des motifs.

TraceTree Demo
TraceTree (cascade-analyzer) est un organisme de sécurité autonome conçu pour l'ère des agents. Il va au-delà du simple scan pour offrir un écosystème de détection robuste, durci et évolutif. Comme sa mascotte, l'araignée, TraceTree tisse une toile de protection complète autour de votre flux de développement grâce à ses huit « pattes » spécialisées.
TraceTree peut être utilisé comme une passerelle de revue avant que des agents ou des humains ne fassent confiance à l'installation d'un paquet. Voir Export de reçu comportemental pour un petit format de reçu compatible JSON/SARIF qui résume le hachage de la cible, la politique du bac à sable, le comportement observé, les hachages des artefacts, le verdict et les paramètres de confidentialité sans exposer les journaux bruts d'appels système.
TraceTree/ ├── api/ # API stubs ├── codebase-analysis-docs/ # Architecture documents and knowledge guides ├── data/ # Behavioral signatures, rules, and training datasets ├── docs/ # Documentation assets ├── examples/ # Demo scripts and usage examples ├── frontend/ # Next.js/React web dashboard ├── graph/ # NetworkX directed graph builder ├── hooks/ # Git/Shell hooks for background monitoring ├── logs/ # Execution trace logs and strace outputs ├── macapp/ # Native macOS menu bar app ├── mascot/ # Console ASCII spider mascot ├── mcp/ # MCP server security testing module ├── ml/ # Machine learning classification and anomaly detection ├── monitor/ # Core syscall parser, YARA matching, and timelines ├── orchestrator/ # TypeScript multi-agent coordination server ├── repocheckai/ # Repository analysis engine (TypeScript/Node) ├── samples/ # Malware and benign files for sandbox tests ├── sandbox/ # Docker container manager and strace sandbox ├── test_targets/ # Mock packages/servers for detection testing ├── tests/ # Unit, integration, and system tests ├── watcher/ # File system change listener daemon └── worker/ # Background task execution worker
## Les 8 pattes de l'araignée TraceTree
1. **Pattes 1 : Isolation en bac à sable (Le piège)** — Exécute les cibles dans des conteneurs Docker isolés (ou un mode `direct` haute performance) où les menaces sont physiquement contenues.
2. **Pattes 2 : Analyse des appels système (Le système nerveux)** — Un moteur de haute précision qui surveille chaque « vibration » (appel système) qu'un processus fait à l'OS.
3. **Pattes 3 : Graphique comportemental (La toile)** — Cartographie la « Cascade » de la façon dont les processus, fichiers et nœuds réseau interagissent en utilisant des graphes dirigés NetworkX.
4. **Pattes 4 : Détection d'anomalies par ML (L'intuition)** — Un modèle Random Forest personnalisé (entraîné sur un petit ensemble de données représentatif de paquets sains/malveillants, plus des flux optionnels en direct de MalwareBazaar) qui prédit l'intention malveillante avec une haute confiance.
5. **Pattes 5 : Correspondance de signatures YARA (La mémoire)** — Une bibliothèque intégrée d'ADN de malwares connus et de schémas d'exploitation (Reverse Shells, Cryptomineurs, etc.).
6. **Pattes 6 : Protocole de sécurité MCP (Le bouclier de l'agent)** — Protection spécialisée pour les serveurs du Protocole de contexte de modèle (MCP), défendant les outils que les agents IA utilisent.
7. **Pattes 7 : IA de gardien de sécurité (La toile proactive)** — Un « scanner intelligent » pré-commit utilisant des LLM locaux (Qwen-Coder) pour détecter les fuites et injections avant qu'elles n'atteignent votre historique.
8. **Pattes 8 : Analyse temporelle et N-gram (Le scan d'ADN)** — Identifie les menaces par le *rythme* et la *séquence* de leurs actions dans le temps.
## Comment ça marche```
target ──► Docker sandbox (network dropped) ──► strace -t -f
│
▼
strace log
│
┌────────────────┼────────────────┐
▼ ▼ ▼
strace parser signature temporal
(parser.py) matcher (sigs) analyzer
│ │ │
└───────┬────────┴────────────────┘
▼
NetworkX graph
(builder.py)
│
▼
ML anomaly detection
(RandomForest / IsolationForest)
│
▼
verdict
ip link set eth0 down) avant le début de l'installation/exécution, donc toute tentative de connexion sortante est enregistrée mais bloquée.strace -t -f -e trace=all. L'option -t ajoute des horodatages pour l'analyse temporelle, -f suit les processus enfants.monitor/parser.py) — Analyseur basé sur des expressions régulières qui gère les sorties multi-lignes de strace et les deux formats [pid] et pid nu. Extrait la création de processus, l'accès aux fichiers, les connexions réseau et les opérations mémoire. Chaque appel système reçoit un poids de sévérité (0–9) basé sur sa pertinence en sécurité.monitor/signatures.py) — Fait correspondre le flux d'événements parsé avec 8 modèles de signatures comportementales définis dans data/signatures.json. Chaque correspondance produit des preuves listant les événements spécifiques qui l'ont déclenchée.monitor/timeline.py) — Détecte 5 modèles comportementaux basés sur le temps dans le flux d'événements horodatés (par exemple, lecture d'identifiants suivie d'une connexion externe dans les 5 secondes).Définies dans data/signatures.json. Chacune a une sévérité (1–10), des appels système requis, des motifs de fichiers, des conditions réseau et une séquence ordonnée à faire correspondre.
Détectés à partir de la sortie horodatée de strace. Nécessite l'option -t de strace (activée par défaut).
Chacun des 24 types d'appels système a un poids de sévérité de base. Exemples :
mprotect avec PROT_EXEC : 9.0dup2 après un connect : 9.0execve d'un binaire inattendu : 7.0connect vers les métadonnées cloud (169.254.x.x) : 8.0connect vers le CDN PyPI/npm : 0.0 (bénin)openat de /usr/lib/python/* : 0.0 (bénin)Le score de sévérité total alimente le calcul de confiance du ML.
Chaque appel système connect est classé dans l'une des quatre catégories :
git clone --depth 1 https://github.com/tejasprasad2008-afk/TraceTree.git cd TraceTree pip install -e .
### Lancer une analyse```bash
cascade-analyze --help
Sortie:``` ┌──────────────────────────────────────┐ │ TraceTree Security Analyzer │ │ Target: requests │ │ Analyzer Type: PIP │ └──────────────────────────────────────┘ ✔ Sandboxing requests (pip)... ✔ Parsing requests... ✔ Graphing requests... ✔ Detecting requests...
┌─ Cascade Graph: requests ────────────┐ │ pip install requests │ │ └─ pip (root) │ │ └─ net_151.101.1.69:443 (connect)│ │ └─ file_/usr/lib/python3.11/... │ └──────────────────────────────────────┘
┌─ Flagged Behaviors ──────────────────┐ │ No suspicious footprints flagged. │ └──────────────────────────────────────┘
┌──────────┐
│ CLEAN │
└──────────
Confidence Score: 72.3%
Pour un paquet malveillant (par exemple, un typosquat connu) :```
┌─ Behavioral Signatures Matched ──────┐
│ 🔴 credential_theft (severity 9/10) │
│ Step 1: openat /etc/shadow │
│ Step 2: connect 45.33.32.156:4444 │
└──────────────────────────────────────┘
┌─ Temporal Execution Patterns ────────┐
│ 🔴 connect_then_shell (severity 10/10)│
│ Window: 1500-4200 ms — External... │
└──────────────────────────────────────┘
┌───────────┐
│ MALICIOUS │
└───────────┘
Confidence Score: 99.9%
Signatures: credential_theft | Temporal: connect_then_shell
cascade-analyze <target>Analyse un seul package, binaire ou fichier groupé.```bash
cascade-analyze requests cascade-analyze urllib33 # known typosquat
cascade-analyze package.json
cascade-analyze suspicious_app.dmg cascade-analyze payload.exe
cascade-analyze requirements.txt cascade-analyze package.json
cascade-analyze ./some_file --type pip cascade-analyze ./some_file --type npm cascade-analyze ./some_file --type dmg cascade-analyze ./some_file --type exe
**Subcommand : `cascade-analyze mcp`** — Analyse de sécurité du serveur MCP (voir la section MCP ci-dessous).
**Subcommand : `cascade-analyze watch <repo>`** — Gardien de session (voir la section Session Guardian).
**Subcommand : `cascade-analyze check <file>`** — Analyse rapide à la demande.
### `cascade-watch <repo>`
Gardien de session autonome. Surveille un répertoire pour les manifestes de paquets et exécute une analyse sandbox en arrière-plan.```bash
cascade-watch ./my-project
cascade-watch ./my-project --check setup.py # on-demand scan
cascade-watch https://github.com/user/repo.git # URL accepted but not cloned
Displays a spider mascot in the terminal and polls status in a loop. Press Ctrl+C to stop. Only one watcher per directory is allowed (lockfile at /tmp/tracetree_sessions/).
cascade-check <file>Quick one-off analysis of a specific file. Starts a fresh sandbox run and returns a verdict.```bash cascade-check setup.py cascade-check ./payload.exe
### `cascade-install-hook`
Installe un hook shell qui exécute `cascade-watch` automatiquement après chaque `git clone`.```bash
cascade-install-hook
Ceci ajoute une ligne source à ~/.bashrc ou ~/.zshrc. Le script de hook se trouve dans ~/.local/share/tracetree/hooks/shell_hook.sh. Après l'installation, chaque git clone lancera un observateur en arrière-plan et enregistrera dans /tmp/tracetree_<reponame>.log.
cascade-trainPipeline d'entraînement interactif. Demande une clé API MalwareBazaar (optionnelle — peut être ignorée pour s'entraîner uniquement sur des jeux de données locaux), puis :
ml/model.skops et invalide le cache```bash
export MALWAREBAZAAR_AUTH_KEY="your-key"
cascade-train## Analyse de sécurité des serveurs MCP
La sous-commande `cascade-analyze mcp` analyse les serveurs du protocole de contexte de modèle (Model Context Protocol) pour détecter des comportements malveillants. Elle exécute le serveur dans un conteneur isolé, agit comme un client MCP simulé pour découvrir et invoquer chaque outil, puis classifie la trace d'appels système résultante.```bash
# Analyze an npm MCP server
cascade-analyze mcp --npm @modelcontextprotocol/server-github
# Analyze a local MCP server project
cascade-analyze mcp --path ./my-mcp-server
# Allow network (for servers that legitimately need internet)
cascade-analyze mcp --npm @modelcontextprotocol/server-github --allow-network
# Force transport
cascade-analyze mcp --npm some-package --transport stdio
cascade-analyze mcp --npm some-package --transport http --port 3000
# JSON output
cascade-analyze mcp --npm some-package --output json
strace -f.initialize, découverte tools/list, invocation sécurisée de chaque outil avec des arguments synthétiques.; ls /etc, ../../../etc/passwd, <script>alert(1)</script>).filesystem, github, postgres, fetch, shell.sandbox/ — Gestion du cycle de vie des conteneurs Docker. Construit cascade-sandbox:latest à partir d'un Dockerfile basé sur python:3.11-slim avec strace, wine64, p7zip-full, cabextract, Node.js et npm. Désactive l'interface réseau (ip link set eth0 down) avant l'exécution de la cible. Prend en charge les cibles pip, npm, DMG et EXE. Renvoie un chemin de journal strace ou une chaîne vide en cas d'échec.
monitor/parser.py — Analyseur de journal strace basé sur des expressions régulières. Gère les entrées d'appels système multi-lignes, les formats [pid] et pid nu, et la sortie horodatée (-t). Suit 24 types d'appels système dans 5 catégories (processus, réseau, fichier, mémoire, IPC). Attribue des poids de sévérité par événement, classe les destinations réseau et signale les accès aux fichiers sensibles. Renvoie des données d'événements structurées avec des horodatages et des décalages en millisecondes relatifs.
monitor/signatures.py — Correspondance de signatures comportementales. Charge 8 motifs à partir de data/signatures.json. Prend en charge à la fois la correspondance non ordonnée (les appels système requis + les motifs de fichier/réseau doivent être présents) et la correspondance de séquence ordonnée (les paires condition-appel système doivent apparaître dans l'ordre). Renvoie les signatures correspondantes avec des preuves listant les événements spécifiques qui ont déclenché chaque correspondance.
monitor/timeline.py — Analyseur de motifs temporels. Détecte 5 motifs comportementaux basés sur le temps à partir du flux d'événements ordonnés et horodatés. Chaque motif spécifie une sévérité, une fenêtre de temps et les conditions de déclenchement. Renvoie les correspondances triées par sévérité décroissante. Actif uniquement lorsque strace a été exécuté avec -t (ce qui est la valeur par défaut).
graph/builder.py — Construction de graphe orienté NetworkX. Crée des nœuds pour les processus, les fichiers et les destinations réseau. Ajoute des arêtes pour les relations de clonage, les cibles d'appels système et les relations temporelles (événements consécutifs du même PID dans les 5 secondes). Les nœuds et les arêtes sont étiquetés avec les correspondances de signatures et les poids de sévérité. Produit du JSON compatible Cytoscape et des statistiques internes.
ml/detector.py — Détection d'anomalies. Extrait un vecteur de 10 caractéristiques (nombre de nœuds, nombre d'arêtes, connexions réseau, lectures de fichiers, nombre d'execve, sévérité totale, réseaux suspects, fichiers sensibles, sévérité maximale, nombre de motifs temporels). Utilise RandomForestClassifier si un modèle entraîné est disponible localement ou téléchargeable depuis GCS ; se rabat sur IsolationForest entraîné sur 10 références de paquets propres codées en dur. Les scores de sévérité et les nombres de motifs temporels augmentent la confiance finale indépendamment de la prédiction ML.
mcp/ — Module d'analyse de serveur MCP. Six fichiers : sandbox.py (bac à sable Docker pour les serveurs MCP), client.py (client JSON-RPC 2.0 avec découverte d'outils et sondes adversariales), features.py (extraction de caractéristiques spécifiques MCP avec détection de type de serveur), classifier.py (classification des menaces basée sur des règles), report.py (console Rich + génération de rapports JSON).
watcher/session.py — Gardien de session. La classe SessionWatcher s'exécute dans un thread démon en arrière-plan. Découvre les paquets en recherchant requirements.txt, package.json, setup.py et pyproject.toml. Exécute chacun via le pipeline du bac à sable. Expose le statut via get_status() et les résultats via une Queue. Verrouillage de session via un fichier de verrouillage à /tmp/tracetree_sessions/.
mascot/spider.py — Classe SpiderMascot. Araignée ASCII avec 5 états (idle, success, warning, scanning, confused). Utilisée dans l'interface en ligne de commande pour un retour visuel pendant l'analyse.
hooks/ — Système de hooks shell. shell_hook.sh encapsule la commande git pour intercepter git clone et lancer cascade-watch en arrière-plan. install_hook.py est un installateur multiplateforme qui détecte bash/zsh et ajoute la ligne source au fichier RC approprié.
cli.py — Point d'entrée de l'interface en ligne de commande Typer. Enregistre toutes les sous-commandes. Orchestre le pipeline d'analyse avec des barres de progression Rich et des panneaux de sortie formatés.
cascade-train avec un grand ensemble de données étiqueté. Le repli IsolationForest est une référence heuristique, pas un modèle de qualité production.ip link set eth0 down) avant d'exécuter/installer le paquet pour empêcher l'exfiltration active de données pendant l'analyse. Bien que sécurisé, cela signifie que les logiciels malveillants nécessitant des poignées de main réseau ou des connexions C2 pendant l'installation peuvent ne pas exécuter leur charge utile, ou que certains installateurs légitimes nécessitant une connectivité Internet échoueront. Pour contourner cela, passez l'option --controlled-network pour activer le mode réseau contrôlé/entonnoir.strace/ptrace (en appelant ptrace(PTRACE_TRACEME, ...) ou en vérifiant TracerPid dans /proc/self/status). Si l'évitement est déclenché, le logiciel malveillant peut se terminer prématurément ou exécuter uniquement des actions bénignes, échappant à la détection.Les pull requests sont les bienvenues. Veuillez garder les nouvelles fonctionnalités découplées des modules existants.
MIT
graph/builder.py) — Construit un graphe orienté NetworkX avec des nœuds processus, fichier et réseau. Ajoute des arêtes temporelles entre des événements consécutifs du même PID dans une fenêtre de 5 secondes.ml/detector.py) — Extrait un vecteur de 10 caractéristiques à partir du graphe et des données parsées. Utilise un RandomForestClassifier si un modèle entraîné est disponible, sinon se rabat sur un IsolationForest entraîné sur 10 bases de référence de paquets propres codées en dur. Les scores de sévérité et les comptages de modèles temporels augmentent la confiance finale.| Signature | Sévérité | Ce qu'elle détecte |
|---|
reverse_shell | 10 | Connexion externe → dup2 → execve /bin/sh |
container_escape | 10 | openat de /proc/1/, /sys/fs/cgroup, /var/run/docker.sock |
credential_theft | 9 | openat de /etc/shadow, .ssh/, .aws/ → connexion externe |
typosquat_exfil | 9 | Lecture de secret (.env, .npmrc) → connexion à pastebin/file.io/transfer.sh |
process_injection | 9 | mprotect PROT_EXEC → execve d'un binaire non standard |
crypto_miner | 8 | clone → clone → connexion au port du pool de minage (3333, 4444, 14444, 45700) |
dns_tunneling | 7 | getaddrinfo + sendto + socket sur le port 53/5353 |
persistence_cron | 7 | openat du chemin crontab → écriture |
| Modèle | Sévérité | Condition de déclenchement |
|---|
connect_then_shell | 10 | Connexion externe → execve /bin/sh dans les 3 secondes |
credential_scan_then_exfil | 9 | Lecture de fichier sensible → connexion externe dans les 5 secondes |
delayed_payload | 8 | Intervalle >10s suivi d'une rafale d'activité suspecte (comportement de dropper) |
rapid_file_enumeration | 7 | 10+ ouvertures de fichier en 1 seconde (comportement de scan) |
burst_process_spawn | 7 | 5+ clone/execve en 2 secondes |
| Catégorie | Critères | Score de risque |
|---|
safe_registry | L'IP correspond aux plages CDN connues de PyPI/npm/GitHub | 0.0 |
known_benign | Port web standard (80/443) vers un hôte non classifié | 0.5 |
suspicious | Métadonnées cloud (169.254.x.x), IP privée du conteneur, ou port suspect (4444, 1337, 31337, etc.) | 8.0–9.0 |
unknown | Par défaut | 3.0 |
| Type de cible | Fonctionnement | Remarques |
|---|
| Paquets PyPI | pip download (avec réseau), puis pip install --no-index (sans réseau) sous strace | Le plus fiable. Le réseau est désactivé avant l'installation. |
| Paquets npm | npm install sous strace, réseau désactivé après le dry-run | Nécessite Node.js dans l'image du sandbox. |
| Fichiers DMG | Extrait avec 7z dans le conteneur. Les scripts trouvés (.sh, .py, .command), les installateurs .pkg, les bundles .app et les binaires Mach-O nus sont chacun exécutés sous strace. | Nécessite p7zip-full dans l'image du sandbox. L'extraction DMG peut échouer sur des formats cryptés ou peu courants. Les scripts sont exécutés dans un conteneur Linux, donc le comportement spécifique à macOS ne s'exécutera pas. |
| Fichiers EXE | Exécuté sous wine64 avec strace -t -f et un délai d'attente de 30 secondes. Le bruit d'initialisation de Wine est filtré du journal strace. | Nécessite wine64 dans l'image du sandbox. Les applications GUI qui attendent une saisie utilisateur expireront. La couche de traduction de Wine signifie que les appels système sont des appels système Linux, pas natifs Windows — certains comportements spécifiques à Windows peuvent ne pas être visibles. |
| Menace | Sévérité | Description |
|---|
COMMAND_INJECTION | Critique | Shell lancé en réponse aux arguments de l'outil |
CREDENTIAL_EXFILTRATION | Critique | Lecture de secret suivie d'une connexion réseau |
COVERT_NETWORK_CALL | Élevée | Connexion sortante lors d'un appel d'outil vers une destination inattendue |
PATH_TRAVERSAL | Élevée | Lectures de fichiers en dehors du répertoire de travail |
EXCESSIVE_PROCESS_SPAWNING | Moyenne | Nombre disproportionné de processus enfants |
PROMPT_INJECTION_VECTOR | Élevée | Les descriptions d'outils contiennent des caractères de largeur nulle ou un langage d'injection |
api/main.py est câblé pour exécuter le pipeline d'analyse TraceTree réel dans des tâches en arrière-plan. Il utilise une base de données en mémoire (mock_db) pour le suivi des tâches, et nécessite que la variable d'environnement TRACETREE_API_KEYS soit définie pour démarrer.cascade-watch accepte un argument URL mais n'effectue pas de git clone. Il surveille le répertoire local ou se rabat sur le répertoire de travail actuel.