Pourquoi auditer ?
Un système de licensing non audité accumule des dettes de sécurité invisibles. Les vecteurs d'attaque évoluent, les techniques de contournement s'automatisent. Un audit annuel avec la checklist ci-dessous permet d'identifier les faiblesses avant qu'elles soient exploitées.
L'audit de sécurité d'un système de licensing n'est pas un luxe — c'est la due diligence minimale avant de distribuer un logiciel commercial. Un système non audité expose l'éditeur à des pertes directes.
Les 10 vecteurs d'attaque
1. Copie de licence
Attaque : copier le fichier .lic sur une autre machine.
Contre-mesure : fingerprint hardware vérifié à chaque démarrage.
Test : copier le .lic sur une VM différente → doit rejeter.
Score IronLock v2 : ✓ Protégé (8 sources de fingerprint).
2. Replay attack
Attaque : rejouer un token d'activation valide capturé sur le réseau.
Contre-mesure : nonce unique par token + timestamp vérifié côté serveur.
Test : intercepter une requête /activate et la rejouer → doit rejeter (nonce already used).
# Protection anti-replay côté serveur
USED_NONCES = set() # En prod : Redis avec TTL
def check_nonce(nonce: str, timestamp: str) -> bool:
if nonce in USED_NONCES:
return False # replay détecté
ts = datetime.fromisoformat(timestamp)
if abs((datetime.now(timezone.utc) - ts).total_seconds()) > 300:
return False # timestamp trop ancien
USED_NONCES.add(nonce)
return True
3. Manipulation d'horloge
Attaque : régler l'horloge système en arrière pour étendre une licence expirée.
Contre-mesure : vérification NTP + timestamp ancré dans le fingerprint.
Test : fixer la date système à J-365 → la licence ne doit pas redevenir valide.
import ntplib
def get_trusted_time() -> datetime:
try:
ntp = ntplib.NTPClient().request('pool.ntp.org', version=3)
ntp_time = datetime.fromtimestamp(ntp.tx_time, timezone.utc)
sys_time = datetime.now(timezone.utc)
if abs((ntp_time - sys_time).total_seconds()) > 300:
sys.exit("Horloge système incorrecte")
return ntp_time
except:
return datetime.now(timezone.utc) # offline : faire confiance au local
4. Patch mémoire (runtime bypass)
Attaque : injecter un breakpoint sur la fonction de vérification de licence et modifier le registre retour pour forcer la validation.
Contre-mesure : anti-debug multi-couches + vérification de l'intégrité du code en mémoire.
Test : attacher gdb/x64dbg et patcher le saut conditionnel après verify_licence() → l'anti-debug doit terminer le processus avant.
5. VM spoofing
Attaque : cloner la VM d'une machine autorisée pour dupliquer la licence.
Contre-mesure : détection de VM + sources de fingerprint non virtualisables (Disk serial, BIOS UUID).
Test : créer une VM avec les mêmes specs qu'une machine autorisée → le fingerprint doit différer sur au moins 3 sources critiques.
Scoring de maturité
| Vecteur | Non protégé | Partiellement | Protégé |
|---|---|---|---|
| Copie de licence | 0 | 1 | 2 |
| Replay attack | 0 | 1 | 2 |
| Manipulation horloge | 0 | 1 | 2 |
| Patch mémoire | 0 | 1 | 2 |
| VM spoofing | 0 | 1 | 2 |
| Bruteforce clé | 0 | 1 | 2 |
| Décompilation bytecode | 0 | 1 | 2 |
| Interception réseau | 0 | 1 | 2 |
| Falsification signature | 0 | 1 | 2 |
| Corruption de fichier | 0 | 1 | 2 |
Score max : 20. IronLock v2 par défaut : 17/20. Score minimum recommandé pour un logiciel commercial : 14/20.
Checklist de test rapide
# Tests à réaliser avant chaque release majeure
# 1. Copie de licence
cp licence.lic /tmp/ && VM_CLONE=true python loader.py
# Attendu : SecurityError hardware_id mismatch
# 2. Licence expirée
date -s "2028-01-01" && python loader.py
# Attendu : LicenceExpiredError
# 3. Fichier modifié
python -c "d=open('app.ironenc','rb').read();open('app.ironenc','wb').write(d[:100]+b'X'+d[101:])"
python loader.py
# Attendu : IntegrityError (HMAC invalide)
# 4. Debugger attaché
gdb -p $(pgrep loader) -ex "set *(int*)verify_licence=0xC3"
# Attendu : processus terminé (anti-debug)
Conclusion
Un audit de sécurité n'est pas une validation une fois pour toutes — c'est un processus continu. La checklist 10 vecteurs ci-dessus se teste en moins d'une heure et identifie les faiblesses critiques. IronLock v2 couvre nativement 85% des vecteurs. Les 15% restants (principalement l'anti-replay réseau et la manipulation d'horloge) nécessitent une configuration spécifique selon votre architecture de distribution.