Parent : [[INDEX-CYBERSECU]]
CodeIgniter - Configuration auth insecure (CSRF off, keys hardcodées, cookies)
Problème
L'archive Ygg contient un CodeIgniter avec une configuration de sécurité désastreuse : CSRF désactivé, clés d'encryption hardcodées, cookies sans HttpOnly, sessions sans vérification IP. Ces failles ont permis le hijacking de sessions et les attaques CSRF à grande échelle.
Contexte archive Ygg
- Fichier :
02_SERVEUR_PRE_PROD/sessions/ci_sessions/config.php - Framework : CodeIgniter 3.x
- Application : Site de torrents YggTorrent
Failles identifiées dans config.php
1. Clés d'encryption hardcodées (lignes 333-342)
if($_SERVER['HTTP_HOST'] == 'yggtorrent.org') {
$config['encryption_key'] = 'TuvqJBccgQNsPFnAjPVrAqSF3Gmkhr';
} else if($_SERVER['HTTP_HOST'] == 'www.yggtorrent.org') {
$config['encryption_key'] = 'Qsqqd8p8gDebYpuRWxEbh4Fd9NhNGG';
} else {
$config['encryption_key'] = 'AekruK8dAxj7Q4fJtwk6fwXCjymp7N';
}
Problème : Clés 28 caractères dans le code source. Exfiltrables via LFI, git leak, ou compromission du repo.
2. CSRF désactivé (ligne 471)
$config['csrf_protection'] = FALSE;
Problème : Aucune protection contre les attaques Cross-Site Request Forgery. Un attaquant peut forcer des actions (changement email, suppression compte, téléchargement).
3. Cookie HttpOnly = FALSE (ligne 426)
$config['cookie_httponly'] = FALSE;
Problème : Les cookies sont accessibles via JavaScript. XSS = vol de session immédiat.
4. Session sans vérification IP (ligne 403)
$config['sess_match_ip'] = FALSE;
Problème : Une session volée (via XSS ou leak) fonctionne depuis n'importe quelle IP.
5. Session ID non détruit au regenerate (ligne 405)
$config['sess_regenerate_destroy'] = FALSE;
Problème : Les anciens IDs de session restent valides après régénération.
6. SameSite=None sur cookies (ligne 424)
$config['cookie_path'] = '/; SameSite=None';
Problème : Les cookies sont envoyés dans des requêtes cross-site. Facilite les attaques CSRF.
Solution protectif — Configuration CodeIgniter sécurisée
// config.php — Configuration sécurisée CodeIgniter
// 1. Clé via variable d'environnement
$config['encryption_key'] = getenv('CI_ENCRYPTION_KEY');
if (empty($config['encryption_key']) || strlen($config['encryption_key']) < 32) {
throw new Exception('CI_ENCRYPTION_KEY non configurée ou trop courte (< 32 chars)');
}
// 2. Activer CSRF
$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_token';
$config['csrf_cookie_name'] = 'csrf_cookie';
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = TRUE;
// 3. Cookies sécurisés
$config['cookie_httponly'] = TRUE; // Pas d'accès JS
$config['cookie_secure'] = TRUE; // Uniquement HTTPS
$config['cookie_path'] = '/'; // Sans SameSite=None
$config['cookie_domain'] = '.monsite.org'; // Restreint
// 4. Sessions strictes
$config['sess_match_ip'] = TRUE; // Vérifier IP
$config['sess_regenerate_destroy'] = TRUE; // Détruire anciens IDs
$config['sess_expiration'] = 900; // 15 min max
// 5. Logs sensibles
$config['log_threshold'] = 1; // Uniquement erreurs en prod
$config['log_file_permissions'] = 0600; // Uniquement owner
Checklist de validation
- Clé encryption dans
.env(jamais dans le code) - CSRF activé sur TOUS les formulaires
- Cookie HttpOnly + Secure + SameSite=Strict
- Session match_ip = TRUE
- Session expiration ≤ 15 min pour actions sensibles
- Regenerate_destroy = TRUE
- Logs avec permissions 0600
- Pas de
permitted_uri_charsélargi (ligne 165 :+ajouté)
Anti-patterns associés
KNOW-ANT-002— Clés d'accès hardcodéesKNOW-ANT-004— Disabling CSRF protection
Comment se prot[ée]ger
- Migrer vers Argon2id/bcrypt (jamais MD5/SHA1)
- Sessions JWT avec expiration courte + refresh token
- CSRF tokens sur tous les POST/PUT/DELETE
- Rate limiting sur login (5 tentatives / 15 min)
- MFA/TOTP obligatoire pour les comptes admin
Références
- Archive Ygg :
02_SERVEUR_PRE_PROD/sessions/ci_sessions/config.php - OWASP : CodeIgniter Security
- CWE-798 : Use of Hard-coded Credentials