Si vous deviez définir globalement
alias ':(){ :|:& };:'='echo fork bomb averted'
serait-ce une stratégie de sécurité efficace pour éviter l'exécution de la bombe à la fourche Bash ou y aurait-il encore un moyen de l'exécuter?
Je suppose que la question se résume à: existe-t-il un moyen d'exécuter une commande lorsqu'elle est aliasée à autre chose?
a(){ a|a& };a
Réponses:
Les
deux, non,trois, ... Parmi les principaux obstacles à cela:Ce n'est pas un nom valide pour un alias. Manuel en ligne de Bash :
(
,)
,&
,|
Et les espaces sont dans Bash 4.4.Cette chaîne particulière n'est pas le seul moyen d'écrire une bombe fourchette dans le shell, juste célèbre parce qu'elle a l'air obscure. Par exemple, il n'est pas nécessaire d'appeler la fonction
:
au lieu de quelque chose de réellement composé de lettres.Si vous pouviez définir l'alias, l'utilisateur pourrait annuler l'alias, le contourner en échappant au nom de l'alias sur la ligne de commande, ou désactiver complètement les alias, éventuellement en exécutant la fonction dans un script (Bash ne développe pas les alias dans des shells non interactifs) .
Même si le shell est suffisamment restreint pour arrêter toutes les versions d'une bombe à fourche, un système à usage général aura d'autres utilitaires programmables qui peuvent récursivement et dériver des sous-processus. Vous avez Perl ou un compilateur C? Assez facile. Même awk pourrait probablement le faire. Même si vous ne les avez pas installés, vous devrez également empêcher l'utilisateur d'apporter des binaires compilés de l'extérieur du système, ou de les exécuter,
/bin/sh
ce qui doit probablement être un shell entièrement opérationnel pour que le reste du système fonctionne.Utilisez simplement
ulimit -u
(ieRLIMIT_NPROC
) ou équivalent pour limiter le nombre de processus qu'un utilisateur peut démarrer. Sur la plupart des systèmes Linux, il estpam_limits
possible de définir la limite du nombre de processus avant le démarrage des commandes choisies par l'utilisateur.Quelque chose comme ça
/etc/security/limits.conf
imposerait une limite stricte de 50 processus à tous les utilisateurs:(Stephen Kitt a déjà mentionné le point 1, Jeff Schaller a mentionné les points 2 et 3.)
la source
&
?&
limitation.Non. Il y a juste trop de façons d'écrire une fourchette.
L'écrivain maléfique de la bombe à fourche essaiera à nouveau avec un nom de fonction différent. Ou d'autres modifications jusqu'à ce que sa bombe à fourche réussisse.
L'écrivain de bombe à fourche par inadvertance ne produira pas la bombe à fourche canonique en premier lieu.
Il est en fait assez facile de devenir vous-même un auteur de bombes fourchues par inadvertance. Par exemple, vous pouvez simplement utiliser récursif
make
avec un externe, non cochécd
, en le combinant avec l'-j
option et des sous-répertoires inexistants - un exemple réel sur lequel je suis tombé une fois.Vous ne pouvez pas vous protéger contre toutes les possibilités, et certainement pas contre un attaquant déterminé. Tout ce que vous obtiendrez sera d'augmenter la complexité de votre système.
la source
Vous ne pouvez pas alias une bombe fork, car ce n'est pas un nom d'alias valide :
Certains shells ne vérifient pas les noms d'alias lorsqu'ils sont déclarés, mais lors de l'interprétation des commandes, et ignorent alors le nom invalide. Une bombe fourchette comprendra toujours
&
, qui ne peut pas être incluse dans un nom d'alias valide, donc vous protéger de cette manière n'est pas possible.la source
dash
etbosh
par exemple les deux l'ignorent silencieusement.Deux fois, non.
Ce n'est pas la seule façon d'écrire une fourchette.
Il existe également plusieurs façons d'exécuter "une commande" en cas d'alias:
Exemple:
la source
\ls
montréoutput.png
maiscommand ls
pas?