~/toc $
Fork Bomb (Bombe à Fourche) : Analyse Technique d'une Attaque par Déni de Service Classique
📌 En bref
fork() → 2ⁿ processus en quelques millisecondes.TasksMax (cgroups) + limits.conf (PAM).> 1. Introduction : La "Bombe" qui Exploite fork()
Dans notre restaurant, le chef cuisinier (CPU/processus) exécute une recette (programme) dans la cuisine (RAM). La fork bomb exploite l'appel système fork() pour saturer la table de réservation du maître d'hôtel (noyau), rendant le système inutilisable. Comprendre cette attaque, c'est saisir un maillon essentiel des politiques de disponibilité (NIST SP 800-34, ANSSI RGS).
/image%2F7127247%2F20260329%2Fob_dc84c9_fork-bomb.jpeg)
🍳 2. Pédagogie : L'Analogie du "Chef Cuisinier"
La recette diabolique
Le chaos culinaire : Le chef crée deux chefs. Chacun en crée deux autres. La progression est exponentielle (2ⁿ). La cuisine est vite submergée. Le maître d'hôtel (noyau) est dépassé.
⚡ 3. Vue Bas niveau (Appels Système, COW et Récupération d'Urgence)
Chaque chef se clone via fork() en deux nouveaux chefs. Le nombre de chefs suit 2ⁿ, saturant la table des processus.
2ⁿ
fork(), le noyau alloue un espace d'adressage virtuel complet pour chaque processus enfant : tas, pile, segments de code et de données. Cet espace est significatif.kernel.pid_max), bien avant que la RAM physique n'atteigne sa limite. C'est ce qui rend le système inutilisable.- Consoles root préexistantes :
exec()(contrairement àfork()) ne crée pas de nouveau processus —/sbin/loginpeut encore lancer un shell si une session est déjà ouverte. - Magic SysRq : voir l'Annexe pour les touches détaillées.
→ Pas de redémarrage à froid systématique : si le système répond encore à SysRq, un arrêt propre (REISUB) évite les journaux non flushés, les vérifications fsck forcées et les risques de corruption de données.
📖 Définitions clés
🔐 4. Mitigations et Durcissement
Deux approches complémentaires couvrent des périmètres distincts et doivent être combinées pour une protection complète.
⚠️ Périmètres distincts — pourquoi combiner les deux : pam_limits.so ne s'applique qu'aux sessions interactives (SSH, login TTY, su). Les services systemd (nginx, sshd via socket, timers, scripts…) ne sont pas soumis à limits.conf. C'est précisément la raison pour laquelle TasksMax (cgroups) est indispensable en complément : il couvre ce que PAM ne voit pas.
4.1. Configuration ulimit (PAM)
/etc/security/limits.conf : règlement intérieur pour chaque utilisateur en session interactive.
| Paramètre | Rôle |
|---|---|
nproc | Nombre max de processus par utilisateur |
⚠️ Prérequis : Le module pam_limits.so doit être chargé dans PAM (/etc/pam.d/login, sshd, etc.). Sans lui, limits.conf est silencieusement ignoré.
ℹ️ Root : root soft nproc unlimited est volontaire (root doit pouvoir intervenir en cas d'attaque), mais le rend vulnérable si une bombe est lancée avec ses privilèges.
4.2. Procédure cgroups / systemd (observer → analyser → modifier → tester → surveiller)
TasksMax agit via le contrôleur pids de cgroups v2. Il compte processus + threads, couvre les services systemd, et persiste après daemon-reload sans redémarrage.
ℹ️ Portée globale système : Pour modifier la valeur par défaut appliquée à toutes les slices, éditer DefaultTasksMax= dans /etc/systemd/system.conf. Nécessite un redémarrage complet (contrairement aux overrides de slice qui prennent effet après daemon-reload).
🔍 Étape 1 : Observer
Valeur typique : 4915 (15% de 32768, valeur de kernel.pid_max par défaut).
📊 Étape 2 : Analyser
Compte les threads également (cohérent avec ce que TasksMax mesure).
⚙️ Étape 3 : Modifier
Trois niveaux de granularité disponibles.
🌍 Slice globale (tous les utilisateurs)
👤 Utilisateur spécifique (UID 1000)
⚙️ Service individuel (exemple : nginx)
🧪 Étape 4 : Tester
ℹ️ Distinction des commandes : La boucle sleep crée 250 processus suspendus — c'est elle qui déclenche réellement la limite TasksMax. Les commandes stress testent la charge CPU/mémoire : utiles pour le monitoring, elles ne déclenchent pas nécessairement la limite de tâches si celle-ci est haute.
📈 Étape 5 : Surveiller
🚨 Annexe : Dernier Recours (Magic SysRq)
Activation : sysctl kernel.sysrq=1 (ou echo 1 > /proc/sys/kernel/sysrq). Pour persister au reboot : ajouter kernel.sysrq = 1 dans /etc/sysctl.d/99-sysrq.conf.
Touches utiles :
- F : OOM Killer — force le noyau à tuer un processus pour libérer de la mémoire
- K : SAK (Secure Attention Key) — tue tous les programmes sur la console courante
- REISUB : redémarrage propre séquencé — R (passer en raw), E (SIGTERM), I (SIGKILL), S (sync disques), U (remonter en lecture seule), B (reboot)
→ Toujours préférer REISUB à un redémarrage à froid : les disques sont synchronisés, réduisant le risque de corruption de journaux ou de nécessité de fsck au prochain démarrage.
Synthèse des protections
| Méthode | Portée | Limite | Persistance | Niveau |
|---|---|---|---|---|
| ulimit (PAM) | Sessions interactives uniquement | nproc (processus) | Session (nécessite pam_limits.so actif) | ⭐⭐ |
| TasksMax (cgroups) | Cgroups v2 — slices et services | tâches (processus + threads) | Permanent après daemon-reload | ⭐⭐⭐ |
| Magic SysRq | Noyau (dernier recours) | Urgence — pas préventif | Temporaire (sauf /etc/sysctl.d) | ⭐ (dernier recours) |
🌐 5. Portabilité de l'Attaque
La fork bomb est souvent présentée comme une attaque Linux. C'est inexact : la vulnérabilité de fond est inhérente à tout OS qui expose la création de processus sans limite par défaut. Windows et macOS sont concernés, avec des mécanismes et des niveaux de protection différents.
5.1 Windows
Windows n'implémente pas fork(), mais CreateProcess() et CreateThread() produisent le même effet de saturation lorsqu'ils sont appelés en boucle récursive.
TasksMax par service.⚠️ Ne pas exécuter sur un système sans limite de processus configurée. Les valeurs par défaut Windows sont généreuses et aucun mécanisme équivalent à TasksMax n'est actif par défaut.
5.2 macOS
macOS est fondé sur XNU (noyau hybride Mach/BSD) et expose nativement fork(). La bombe Bash :(){ :|:& };: fonctionne de manière identique à Linux sans modification.
fork() via le noyau XNU. Sur Apple Silicon, le kernel enforcer est plus agressif sur la gestion mémoire — il peut ralentir l'explosion, sans l'empêcher.HardResourceLimits dans les plists de services. SIP (System Integrity Protection) protège les processus système mais ne limite pas les processus utilisateur contre ce type d'attaque.Tableau comparatif
| OS | Mécanisme d'attaque | Protection principale | Active par défaut | Granularité |
|---|---|---|---|---|
| Linux | fork() | cgroups v2 / TasksMax | Partielle (15% pid_max) | ⭐⭐⭐ |
| Windows | CreateProcess() / CreateThread() | Job Objects | Non | ⭐⭐ |
| macOS | fork() | launchd HardResourceLimits | Non | ⭐⭐ |
Linux est le seul des trois systèmes à proposer une protection active par défaut (TasksMax à 15% de kernel.pid_max) et une granularité par service. La vulnérabilité est universelle — la maturité des outils de mitigation ne l'est pas.
✔ 6. Conclusion
fork(), CreateProcess() ou CreateThread() — est potentiellement vulnérable. La différence tient à la maturité des protections par défaut, pas au mécanisme d'attaque.limits.conf pour les sessions interactives, TasksMax par service pour les démons, alertes journald ou Prometheus pour détecter l'anomalie avant la crise. Magic SysRq en dernier recours. La protection la plus granulaire des trois systèmes.TasksMax par service n'est appliqué nativement. Sur un parc Windows de production, la limitation doit être configurée explicitement par application ou conteneur.fork() fonctionne identiquement à Linux via XNU — la bombe Bash s'exécute sans modification. SIP protège les processus système mais pas les processus utilisateur. La limitation via HardResourceLimits dans les plists launchd n'est pas configurée par défaut.📚 Sources Vérifiées
Les affirmations techniques de cet article reposent sur les références primaires suivantes.
pids, le comptage des tâches (processus + threads) et les hiérarchies de cgroups v2. Source primaire pour le comportement réel de TasksMax.TasksMax=, de son interaction avec le contrôleur pids de cgroups v2, et des niveaux de granularité (slice, service, scope). Référence pour DefaultTasksMax et les valeurs par défaut.sysctl kernel.sysrq et de la séquence REISUB. Source primaire pour la section récupération d'urgence.pam_limits et du fichier /etc/security/limits.conf : paramètres nproc, distinction soft/hard, et portée aux sessions interactives uniquement.🔗 Lectures Recommandées SafeITExperts
Pour approfondir les thématiques abordées dans cet article.