Explorer
KNOW-PAT-052

CodeIgniter - Configuration auth insecure (CSRF off, keys hardcodées, cookies)

Domaine
cybersecu
Type
pattern
Priorité
P2

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ées
  • KNOW-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