All files / src/services commandAnalyzer.js

0% Statements 0/10
0% Branches 0/4
0% Functions 0/1
0% Lines 0/10

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93                                                                                                                                                                                         
/**
 * Analyseur de commandes — Détecte les commandes dangereuses.
 *
 * Utilisé pour :
 *   - Avertir l'utilisateur avant exécution via le chat Claude
 *   - Forcer la confirmation dans l'interface
 *   - Logger les commandes sensibles
 *
 * Niveaux de dangerosité :
 *   - 'safe'      → Exécution directe autorisée
 *   - 'write'     → Modifie des fichiers (avertissement)
 *   - 'dangerous' → Potentiellement destructif (confirmation obligatoire)
 *
 * @module services/commandAnalyzer
 */
 
// ─── Patterns qui nécessitent une confirmation obligatoire ───────────────────
// Ces commandes peuvent causer des pertes de données irréversibles.
 
const DANGEROUS_PATTERNS = [
  { pattern: /\brm\b.*(-rf?|-fr?)/i, desc: 'Suppression récursive/forcée (rm -rf)' },
  { pattern: /\brm\b\s+(-f|--force)/i, desc: 'Suppression forcée (rm -f)' },
  { pattern: /\bdocker\s+(stop|kill|rm|rmi|prune)/i, desc: 'Action destructive Docker' },
  { pattern: /\bsystemctl\s+(stop|disable|mask|kill)/i, desc: 'Arrêt de service systemd' },
  { pattern: /\bservice\s+\S+\s+stop/i, desc: 'Arrêt de service (SysV)' },
  { pattern: /\bkill\b/i, desc: 'Terminaison de processus (kill)' },
  { pattern: /\bpkill\b/i, desc: 'Terminaison de processus par nom (pkill)' },
  { pattern: /\bshutdown\b/i, desc: 'Arrêt du système' },
  { pattern: /\breboot\b/i, desc: 'Redémarrage du système' },
  { pattern: /\bpoweroff\b/i, desc: 'Extinction du système' },
  { pattern: /\bformat\b/i, desc: 'Formatage' },
  { pattern: /\bdd\b.*of=/i, desc: 'Écriture disque raw (dd)' },
  { pattern: /\bmkfs\b/i, desc: 'Création de système de fichiers' },
  { pattern: /\bfdisk\b/i, desc: 'Modification de table de partitions' },
  { pattern: /\bdrop\s+table/i, desc: 'Suppression de table SQL (DROP TABLE)' },
  { pattern: /\btruncate\b/i, desc: 'Vidage de table SQL (TRUNCATE)' },
  { pattern: /\b>\s*\/dev\//i, desc: 'Écriture raw device (/dev/)' },
  { pattern: /\bchmod\s+777/i, desc: 'Permissions ouvertes (chmod 777)' },
  { pattern: /\bchmod\s+-R\s+777/i, desc: 'Permissions ouvertes récursives' },
  { pattern: /\bcrontab\s+-r/i, desc: 'Suppression de crontab' },
  { pattern: /\biptables\s+-F/i, desc: 'Flush des règles firewall' },
];
 
// ─── Patterns de modification de fichiers (avertissement) ────────────────────
// Ces commandes modifient le système de fichiers sans être destructives.
 
const WRITE_PATTERNS = [
  { pattern: /\btee\b/, desc: 'Écriture via tee' },
  { pattern: /\bsed\s+-i/, desc: 'Édition en place (sed -i)' },
  { pattern: />\s*[^>]/, desc: 'Redirection écriture' },
  { pattern: /\becho\b.*>\s*/, desc: 'Écriture via echo' },
  { pattern: /\bcat\b.*>\s*/, desc: 'Écriture via cat' },
  { pattern: /\bprintf\b.*>\s*/, desc: 'Écriture via printf' },
  { pattern: /\bcp\b/, desc: 'Copie de fichier' },
  { pattern: /\bmv\b/, desc: 'Déplacement de fichier' },
  { pattern: /\bmkdir\b/, desc: 'Création de répertoire' },
  { pattern: /\btouch\b/, desc: 'Création de fichier vide' },
  { pattern: /\bchown\b/, desc: 'Changement de propriétaire' },
  { pattern: /\bchmod\b/, desc: 'Changement de permissions' },
];
 
/**
 * Analyse une commande bash et retourne son niveau de dangerosité.
 *
 * @param {string} command — La commande à analyser
 * @returns {{ level: 'safe' | 'write' | 'dangerous', reason?: string }}
 */
function analyzeCommand(command) {
  // Vérifier d'abord les patterns dangereux
  for (const { pattern, desc } of DANGEROUS_PATTERNS) {
    if (pattern.test(command)) {
      return {
        level: 'dangerous',
        reason: `Commande potentiellement destructive : ${desc}`,
      };
    }
  }
 
  // Vérifier les patterns d'écriture
  for (const { pattern, desc } of WRITE_PATTERNS) {
    if (pattern.test(command)) {
      return {
        level: 'write',
        reason: `Commande de modification : ${desc}`,
      };
    }
  }
 
  return { level: 'safe' };
}
 
module.exports = { analyzeCommand };