Journal Bloquer Linux en 24 caractères

Posté par  (site web personnel) .
Étiquettes : aucune
0
26
mai
2003
C'est tellement simple, c'est à pleurer...

$ cat > bloque.c
main(){while(1)fork();}
^D
$ gcc -o bloque bloque.c
$ ./bloque

En quelques fractions de seconde, le load average de la machine monte à 750, tout rame à fond, et plus personne ne peut lancer de processus. Dommage pour l'administrateur système, même de simples "w", "free" et "ps -e f" ne passent pas, alors de là à ce qu'il réussisse à lancer "kill"... Seule solution pour lui: le reboot¹.

¹ Éventuellement précédé d'un petit Syst-E ou Syst-I, s'il a compris ce qui se passe, et qui lui permettra au moins de redémarrer proprement la machine.
  • # Re: Bloquer Linux en 24 caractères

    Posté par  . Évalué à 4.

    Euh... je ne suis pas expert en programmation système mais je suis un peu surpris tout de même...

    Mais comment ça fonctionne exactement les forks ?
    Les processus fils sont-ils toujours rattachés à leur père ?
    N'existerait'il pas une protection limitant le nombre max possible de fork d'un processus ?
    Le compte root seul est-il sans limite ?

    Je pense qu'il y a une parade à ça... sinon, ce 'problème' pourrait se propager rapidement et bloquer pas mal de serveur par un petit virus propre à Linux, non ? ... je pense que plein de petits rigolos aurait déjà peaufiné des p'tites blagues là-dessus si ça marchait vraiment comme ça...
    • [^] # Re: Bloquer Linux en 24 caractères

      Posté par  (site web personnel) . Évalué à 5.

      Je vais peut-être dire une bêtise, mais la commande "ulimit" (cf. man bash) ne permettrait-elle pas d'empêcher ce problème en limitant le nombre maximum de processes qu'un utilisateur peut lancer ?
      • [^] # Re: Bloquer Linux en 24 caractères

        Posté par  (site web personnel) . Évalué à 5.

        Absolument. Elle permet également de limiter le temps CPU, la mémoire consommée, le nombre de fichiers ouverts, etc. Taper "ulimit -a" pour avoir la liste des réglages actuels. La question est maintenant : combien d'administrateurs pensent à mettre des limites ? Combien de distributions mettent des limites par défaut ?
        • [^] # Re: Bloquer Linux en 24 caractères

          Posté par  . Évalué à 1.

          >Combien de distributions mettent des limites par défaut ? En tout cas pas Mandrake : ma 9.1 s'est gelée d'un coup, même ver num ne répondait plus :-/. Ca m'apprendra à compiler des conneries!
          • [^] # Re: Bloquer Linux en 24 caractères

            Posté par  . Évalué à 2.

            Sur une Mandrake 9.0, une seule limite fixée, tout le reste est en "unlimited" : max user processes (-u) 1279 pas 1300, ou 1280 ! 1279 :) N'empêche, je trouve que ca fait quand même beaucoup de processes.
            • [^] # Re: Bloquer Linux en 24 caractères

              Posté par  . Évalué à 2.

              pire ! Mdk 9.1, réglages par défauts : core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited max locked memory (kbytes, -l) unlimited max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 2047 virtual memory (kbytes, -v) unlimited pas top en effet...
            • [^] # Re: Bloquer Linux en 24 caractères

              Posté par  . Évalué à 2.

              je trouve que ca fait quand même beaucoup de processes J'ai vu des techos se battre avec Linux car leur serveur Notes lançait tellement de processus que le système décidait de le tuer :) Le tout sans le moindre ulimit!!!
            • [^] # Re: Bloquer Linux en 24 caractères

              Posté par  (site web personnel) . Évalué à 2.

              « max user processes (-u) 1279. Pas 1300, ou 1280 ! 1279 :) » C'est parce que tu as 160 Mo de RAM, et parce qu'une petite portion de ta RAM (entre 4 et 128 Ko) est indisponible pour Linux, ce qui te fait passer de 1280 à 1279 threads maximum par défaut.
              • [^] # Re: Bloquer Linux en 24 caractères

                Posté par  . Évalué à 1.

                C'est parce que tu as 160 Mo de RAM

                exact :)

                et parce qu'une petite portion de ta RAM (entre 4 et 128 Ko) est indisponible pour Linux, ce qui te fait passer de 1280 à 1279 threads maximum par défaut.

                Merci pour le renseignement :) ca me donne envie de lire un peu de doc sur le sujet ca :)
                • [^] # Re: Bloquer Linux en 24 caractères

                  Posté par  (site web personnel) . Évalué à 2.

                  Il n'y a pas de doc, il faut lire le code source de Linux. :)

                  Linux t'indique au démarrage de combien de pages de mémoire il dispose (cherche une ligne contenant "On node 0 totalpages:" dans /var/log/syslog -- enfin le fichier, ça dépend bien sûr de ta distro). Chaque page fait 4 Ko, comme toujours (?) sur les dérivés du 386.

                  Linux divise ensuite ce nombre par deux pour savoir combien de threads il peut gérer avec cette mémoire (car chaque thread nécessite deux pages). Linux enfin divise ce nombre max de threads par 16 pour avoir une limite un peu plus raisonnable (mais encore trop grande, comme on l'a vu).
  • # Re: Bloquer Linux en 24 caractères

    Posté par  (site web personnel) . Évalué à 7.

    Tu viens de decouvrir la fork bomb. (nb: voir aussi malloc bomb pour une version differente mais marrante aussi) ca marche sur bien plus de systemes que linux...

    Maintenant pour une solution: niveau noyeau, ca bouge un peu, notamment dernierement des changements dans le comportement du memory overcommmit (qui tue des process quand c'est necessaire), et niveau userspace, voir limit/limits ...
  • # Re: Bloquer Linux en 24 caractères

    Posté par  . Évalué à 8.

    - Cela n'a rien de spécifique à Linux, tous les OS souffrent de ce problème, on fait pareil avec un solaris, avec un windows - La commande kill est interne dans plusieurs shells justement pour ce genre de problème, sous Linux on peut même voir les processus en naviguant dans /proc, et dans certains cas (pas celui ci, mais dans les cas de dépassement de mémoire par exemple) ca permet de résoudre le problème si on a un shell root lancé - Il existe plusieurs patchs noyau qui réserve des ressources pour root, pour ejecter des processus qui font des bétises, par défault, il y a déjà des quotas qu'il est possible d'activer, en RAM, en CPU, en nombre de processus, plus le OOM killer qui récupère de la RAM quand il n'y a plus aucun espoir (mais que l'on n'a pas encore appelé le capitaine Flams)...
    • [^] # Re: Bloquer Linux en 24 caractères

      Posté par  (site web personnel) . Évalué à 1.

      « Cela n'a rien de spécifique à Linux, tous les OS souffrent de ce problème, on fait pareil avec un solaris, avec un windows » Tous ? Unix et Windows, certainement. VMS ? Je suis nettement moins sûr. Ça fait quelques temps que j'ai pas mis la main sur une ligne de commande VMS, mais quelque chose comme SHOW PROCESS/FULL ou SHOW ACCOUNT/FULL listait trois tonnes de limites et de restrictions imposées à mon pauvre compte d'utilisateur normal. En tous cas, vu que la priorité d'un processus évolue dynamiquement en fonction des ressources qu'il consomme, je ne pense pas qu'il soit possible d'empêcher un administrateur de buter le processus fou si le système ne l'a pas encore fait.
  • # Re: Bloquer Linux en 24 caractères

    Posté par  (site web personnel, Mastodon) . Évalué à -1.

    ça marche pas chez moi bash: syntax error near unexpected token `(' voila ce qu'il met
  • # Re: Bloquer Linux en 24 caractères

    Posté par  . Évalué à 4.

    Euh.. et si l'administrateur active la limitation de process par user?
    • [^] # Re: Bloquer Linux en 24 caractères

      Posté par  (site web personnel) . Évalué à 1.

      Ça existe ça ? Pour ce que j'en sais, tout ce que Linux peut faire c'est de mettre un plafond à la consommation de resources, pour un processus donné. Ses enfants hériteront de ce plafond, et bien entendu, à moins d'être root, ils ne pourront pas l'augmenter. Donc, le mieux que puisse faire l'administrateur, c'est de placer un appel à ulimit dans /etc/profile, ce qui limitera le nombre de processus qu'un utilisateur pourra lancer à partir d'une session donnée. "Rien" ne l'empêchera de se connecter par l'intermédiaire d'un autre terminal (disons, en lançant une autre connection SSH) et de "doubler" ainsi son nombre de processus. Par ailleurs, comme Cyberdivad et littlebreizhman l'ont remarqué, Linux place effectivement une limite au nombre maximum de processus dans le processus racine (init), dont tous les processus du système héritent donc (mais s'ils sont root, ils peuvent changer cette limite). En gros, la limite est calculée comme suit : 8 processus pour chaque méga de RAM. Comme on a pu le voir, c'est suffisant pour mettre pas mal de machines à genoux. :-) Par ailleurs, comme chaque processus prend 8 Ko de mémoire "système" (sans compter celle qu'il s'allouerait, donc), on voit bien que même root aura du mal à mettre plus de 128 processus par méga (de toutes façons à ce niveau là, le scheduler serait à genoux).
      • [^] # Re: Bloquer Linux en 24 caractères

        Posté par  . Évalué à 0.

        Comme dit plus haut, ce problème apparait sur tous les systèmes. Pour te rassurer, tu ferais bien de regarder ça: http://campuscgi.princeton.edu/man?ulimit
      • [^] # Re: Bloquer Linux en 24 caractères

        Posté par  (site web personnel) . Évalué à 1.

        Avec le fichier de limites, tu peux spécifier une limite au nombre total de processus qu'un utilisateur donné peut avoir. 17:21 root@kartxila ~# ~ # cat /etc/security/limits.conf # /etc/security/limits.conf # #Each line describes a limit for a user in the form: # # # #Where: # can be: # - an user name # - a group name, with @group syntax # - the wildcard *, for default entry # # can have the two values: # - "soft" for enforcing the soft limits # - "hard" for enforcing hard limits # # can be one of the following: # - core - limits the core file size (KB) # - data - max data size (KB) # - fsize - maximum filesize (KB) # - memlock - max locked-in-memory address space (KB) # - nofile - max number of open files # - rss - max resident set size (KB) # - stack - max stack size (KB) # - cpu - max CPU time (MIN) # - nproc - max number of processes # - as - address space limit # - maxlogins - max number of logins for this user # - priority - the priority to run user process with # # # #* soft core 0 #* hard rss 10000 #@student hard nproc 20 #@faculty soft nproc 20 #@faculty hard nproc 50 #ftp hard nproc 0 #@student - maxlogins 4 www-data soft nproc 128 # End of file 17:23 root@kartxila ~# Là, Apache pourra lancer jusqu'à 128 process (je suis sous Debian, le chemin peut être différent pour d'autres distribs). Tu peux l'appliquer aux utilisateurs, groupes, etc... Et cela ne s'applique pas qu'aux process, comme tu peux le voir ci dessus...
      • [^] # Re: Bloquer Linux en 24 caractères

        Posté par  (site web personnel) . Évalué à 1.

        Tiens non, j'ai dit une connerie, la limite est bien par utilisateur. Cool. :-)
  • # Re: Bloquer Linux en 24 caractères

    Posté par  . Évalué à 5.

    Bheua c'est simple oui mais chez moi en tout cas c'est pas impressionnant. D'ailleur ton prog est en train de tourner en fond pendant que je tape le message ... ;) cf le top : top - 01:00:14 up 2:46, 3 users, load average: 791.15, 273.00, 101.65 Tasks: 1039 total, 1007 running, 32 sleeping, 0 stopped, 0 zombie Cpu(s): 14.1% user, 85.9% system, 0.0% nice, 0.0% idle Mem: 126436k total, 124184k used, 2252k free, 3980k buffers Swap: 626492k total, 3844k used, 622648k free, 47348k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ Command 4698 outs 16 0 1564 1564 1344 R 3.5 1.2 0:02.86 top 3635 root 15 0 94112 11m 2452 S 1.0 9.2 0:14.66 X 4700 outs 17 0 228 228 216 R 1.0 0.2 0:00.14 bloque 4702 outs 17 0 228 228 216 R 1.0 0.2 0:00.14 bloque 4703 outs 17 0 228 228 216 R 1.0 0.2 0:00.14 bloque [...] Je suis sur gentoo avec le noyau fournis par defaut et je n'ai fais aucune modif. Ca doit etre pasque ils onts patché le noyau.
  • # Re: Bloquer Linux en 24 caractères

    Posté par  (site web personnel) . Évalué à 2.

    Pfff... je faisais ça en première année de fac, pour friser les machines de mes petits camarades... il y a aussi la variante : for(i=1;i<=100;i++) { if ( fork() ) { while(); } } Sur solaris, tu peux tout killer en faisant un : kill -9 -1 rapide, efficace...
    • [^] # Re: Bloquer Linux en 24 caractères

      Posté par  (site web personnel) . Évalué à 1.

      en le faisant en shell ca evite d'avoir à compiler et c fait moins de caracteres :-) genre :(){ :|:&};: en bash ca definit la fonction ":" puis l'appelle.
      • [^] # Re: Bloquer Linux en 24 caractères

        Posté par  (site web personnel) . Évalué à 1.

        Sauf que : n'est pas un identificateur valide, et que la RAM est bouffée assez vite, ce qui bute l'ensemble en peu de temps.
        • [^] # Re: Bloquer Linux en 24 caractères

          Posté par  (site web personnel) . Évalué à 2.

          : n'est pas un identificateur valide ? pourquoi ca marche alors ?
          • [^] # Re: Bloquer Linux en 24 caractères

            Posté par  (site web personnel) . Évalué à 1.

            pourquoi ça marchait pas chez moi tout à l'heure alors ? ;-) d'autant plus que la doc, section SHELL_GRAMMAR, te dit que avant les parenthèses on met un "name" et la section DEFINITIONS te dit qu'un "name", c'est une séquence de caractères alphanumériques et d'underscores... bref, pas de deux-points là-dedans ? ah, j'ai trouvé : j'avais appelé sh (qui est un lien symbolique vers bash) au lieu de bash. hé bien sûr, la doc ne dit rien de deux-points, de sa présence dans bash comme de son absence dans sh.
  • # Re: Bloquer Linux en 24 caractères

    Posté par  (site web personnel) . Évalué à 1.

    Bravo. Maintenant il ne te reste plus qu'a decouvrir l'affichage d'images de boules sur les postes de tes petits camarades en faisant joujou avec le DISPLAY
    • [^] # Re: Bloquer Linux en 24 caractères

      Posté par  (site web personnel) . Évalué à 1.

      Tu vas trop vite en besogne. Avant ya ecrire « salut! » sur les tty des gens aussi. Puis la découverte de la commande mesg parceque c'est lourd quand même à force.
    • [^] # Re: Bloquer Linux en 24 caractères

      Posté par  (site web personnel) . Évalué à 1.

      le must pour X c'est :
      - s'amuser avec xauth et les magic cookies
      - s'amuser avec netscape -remote, mozilla -remote
      - s'amuser avec xwd/xwud/xwatchwin
      - s'amuser avec x2x...

      et en cadeau bonus... si tu peux acceder au display des xdm comme tu veux, je te laisse imaginer les possibilites... (oui oui jai vu ca... a ma fac... ct sympa d'ailleurs :)
  • # Re: Bloquer Linux en 24 caractères

    Posté par  . Évalué à 1.

    pour info ce programme ne marche pas si on a instaure des limites de memoire et/ou de processus comme sur mac os x au bout de quelques secondes, il fait un truc genre: processus number exceeded, et il kill le programme fautif faudrait voir a faire un truc similaire sur notre bon vieux gnu/linux non ?
    • [^] # Re: Bloquer Linux en 24 caractères

      Posté par  (site web personnel) . Évalué à 1.

      Comme on l'a dit un peu partout ailleurs dans la discussion, il y a des limites sous Linux, mais elle sont par défaut infinies, ou alors trop grandes (cas précisément du nombre de processus). Et comme on le sait bien, ce qui compte, ce n'est pas tant de savoir que sa propre machine à soi est ultra-blindée, avec limites en tous genre optimisées pour chaque utilisateur, mais de savoir que par défaut, il n'y en a pas. Par ailleurs, Linux ne tue pas un processus qui tente de fork()er au delà de la limite, il fait simplement échouer l'appel de fork(), ce dont le petit programme ci-dessus se contrefout. Il faudrait pour se débarraser du programme qu'il épuise la mémoire (kill assuré) ou qu'il dépasse la limite de temps CPU (autre kill assuré)... limite qui n'est pas activée par défaut. Tiens, une question que je me pose : y a-t-il moyen de demander au noyau de loguer ce genre d'actions (kill de processus en vadrouille) ? Parce que si je mets des limites et que je commence à voir des applications disparaître, j'aimerais autant pouvoir aller jeter un coup d'oeil dans les logs pour confirmation.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.