Un alias mondial de la bombe à fourche empêcherait-il son exécution?

15

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?

malan
la source
1
@ user1717828, une "bombe fourchette" est un programme qui exécute simplement de nouvelles copies de lui-même, pour toujours. La croissance exponentielle qui en résulte du nombre de programmes en cours d'exécution provoque généralement une rupture rapide.
Mark
1
Même si cela fonctionnait - cela ne protégerait pas contre un programme qui appelle fork () ne passant pas par bash?
UKMonkey
2
: () {: |: &: |: &} ;:
Joshua
3
Il suffit de lancera(){ a|a& };a
user253751
1
Vous éviteriez la forme courante (si vous la faisiez fonctionner), mais il y a une quantité presque infinie de variations possibles.
Mast

Réponses:

52

Les deux , non, trois , ... Parmi les principaux obstacles à cela:

  1. Ce n'est pas un nom valide pour un alias. Manuel en ligne de Bash :

    Les caractères ... et l'un des métacaractères du shell ou les guillemets répertoriés ci-dessus peuvent ne pas apparaître dans un nom d'alias.

    (, ), &, |Et les espaces sont dans Bash 4.4.

  2. 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.

  3. 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) .

  4. 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/shce qui doit probablement être un shell entièrement opérationnel pour que le reste du système fonctionne.

Utilisez simplement ulimit -u(ie RLIMIT_NPROC) ou équivalent pour limiter le nombre de processus qu'un utilisateur peut démarrer. Sur la plupart des systèmes Linux, il est pam_limitspossible 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.confimposerait une limite stricte de 50 processus à tous les utilisateurs:

*        hard    nproc           50

(Stephen Kitt a déjà mentionné le point 1, Jeff Schaller a mentionné les points 2 et 3.)

ilkkachu
la source
Est-il possible d'écrire une bombe fourchette sans &?
Stephen Kitt
4
@StephenKitt Je ne suis pas sûr à 100% mais je suppose que bash est complet. Si c'est le cas, il existe probablement des possibilités infinies. Par exemple, vous pouvez analyser le code de caractère ascii 38 et l'exécuter.
Marie
@Marie dans ce contexte particulier, vous devez également éviter tout autre personnage interdit tout en contournant la &limitation.
Stephen Kitt
15
Mon point était principalement que tenter de mettre sur liste noire de mauvaises fonctionnalités est une mauvaise idée. Il existe presque toujours des solutions.
Marie
2
@Marie: Bash est certainement Turing complet.
pause jusqu'à nouvel ordre.
18

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 makeavec un externe, non coché cd, en le combinant avec l' -joption 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.

cmaster - réintégrer monica
la source
14

Vous ne pouvez pas alias une bombe fork, car ce n'est pas un nom d'alias valide :

$ alias ':(){ :|:& };:'='echo fork bomb averted'
bash: alias: `:(){ :|:& };:': invalid alias name

Les caractères '/', '$', '' ',' = 'et l'un des métacaractères du shell ou les guillemets répertoriés ci-dessus peuvent ne pas apparaître dans un nom d'alias.

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.

Stephen Kitt
la source
Qu'un shell permette ou non de configurer cet alias n'a pas d'importance. Il est important que même si un tel alias existe, il n'est pas développé lors de l'interprétation des commandes car le nom d'alias ne correspond pas au modèle autorisé. dashet boshpar exemple les deux l'ignorent silencieusement.
schily
10

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:

command the-command
\the-command

Exemple:

$ alias ls=not-really-ls
$ ls
-bash: not-really-ls: command not found
$ \ls
jeff.html  output.png
$ command ls
jeff.html  output.png
Jeff Schaller
la source
Pas lié au sujet principal, mais pourquoi a-t-il été \lsmontré output.pngmais command lspas?
nxnev
Bien repéré! Cela n’est en effet pas lié au sujet principal. C'est une erreur PEBCAK classique où je copie / colle mal (ou nettoie le fichier output.png entre les deux). Je vais le réparer pour minimiser les distractions. Merci, @nxnev!
Jeff Schaller