Προς το περιεχόμενο

Fork bombs και άλλα τέρατα


Ozone

Προτεινόμενες αναρτήσεις

:(){ :|:& };:

 

Κρασάρει το σύστημα. Πραγματικά όμως. Πας κατευθείαν για hard reset.

 

το δοκιμασα και οντος ηθελα επανεκινηση.. τη ακριβως κανει αυτη η εντολη??

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 85
  • Δημ.
  • Τελ. απάντηση

Αυτή είναι μια fork-bomb. Βασικά χωρίζεται στα εξής μέρη:

>
){
 :|:&
}

Εδώ ορίζεται μια συνάρτηση με όνομα `:', η οποία καλεί τον εαυτό της, κάνοντας pipe στον εαυτό της και μπαίνει στο background.

>
:

Εδώ καλείται για πρώτη φορά η συνάρτηση που ορίστηκε προηγουμένως. Το ελληνικό ερωτηματικό υποδηλώνει ότι πρόκειται για νέα εντολή στην ίδια γραμμή.

 

Αυτό που κάνει αυτό το πράγμα είναι ότι εκτελούμενο, κάνει fork(), δηλαδή δημιουργεί δύο αντίγραφα του εαυτού του (:|:&), τρέχοντας ουσιαστικά ένα shell instance για το καθένα. Κάθε αντίγραφο δημιουργεί τα δικά του κ.ο.κ. Τελικά το σύστημα ξεμένει είτε από μνήμη, είτε από χώρο στο process table. Ωστόσο με ένα απλό ulimit -u 90 στο shell που βρίσκεσαι, απλά θα περιορίζονταν τα processes του χρήστη (για το τρέχον shell) στα 90, οπότε κάποια στιγμή δε θα μπορούσε να κάνει επιπλέον fork() η fork-bomb. Bonus λουκουμάκι σε όποιον μου πει πως σκοτώνουμε μια fork-bomb από το shell που την ξεκίνησε ;-)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

παιδιά !

 

όταν πέρασα απο το γραφείο των καθηγητών για να δηλώσω την απουσία μου λόγω μικρής αδιαθεσίας

πάνω στο γραφείο του apoikos νομίζω είδα τα θέματα με την λύση !

 

http://en.wikipedia.org/wiki/Fork_bomb

Once a successful fork bomb has been activated in a system it may not be possible to resume normal operation without rebooting, as the only solution to a fork bomb is to destroy all instances of it. Trying to use a program to kill the rogue processes normally requires another process be created, which may not be possible if there are no empty slots in the process table, or space in memory structures.

 

However, in practice, some of these fork bombs can be cured relatively easily. Consider the shell fork bomb shown below:

 

:(){ :|:& };:

 

One important "feature" in this code is that a fork bomb process which can no longer fork, doesn't stick around but rather exits. If we try often enough, eventually we'll be able to run a new do-nothing process; Each new do-nothing process we run reduces the number of rampant "fork bomb" processes by one, until eventually we can eradicate all of them, when the do-nothing processes can exit. The following short Z Shell code will typically get rid of the above fork bomb in about a minute:

 

while (sleep 100 &!) do; done

 

 

η killall5 τί κάνει ?

 

.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Bonus λουκουμάκι σε όποιον μου πει πως σκοτώνουμε μια fork-bomb από το shell που την ξεκίνησε ;-)

 

Κύριε, κύριε να παίξω;

Προφανώς πριν εξαντληθεί η μνήμη ή το process pool πρέπει να γίνει ένα από τα 3:

α. Μίας και όλα τα σύγχρονα shells με το που στέλνουν ένα process στο background έχουν σαν output το PID της (στην συγκεκριμένη περίπτωση και τα 2 PIDs) και επειδή τα σύγχρονα συστήματα είναι τέρατα όσον αφορά τα διαθέσιμα resources, μπορεί κανείς να κάνει ένα kill -9 (βάναυσα πράγματα, οχι -15 και αηδίες) στο parent PID ήτοι το μικρότερο από τα 2 που θα εμφανιστούν στην κονσόλα. Διαφορετικά kill -9 %1

β. Ο δεύτερος τρόπος είναι πιό "επιστημονικός". Εάν έχει ενεργοποιηθεί το SysRq key στον kernel (συνήθως print screen) τότε με Alt-SysRq-i ή με Alt-SysRq-k θα σκοτώσει την fork bomb. Μπορεί να πάρει και το περισσότερο σύστημα μαζί βέβαια αλλά η ερώτηση ήταν για το bomb μόνο. :-D

γ. Αυτό δεν το έχω δοκιμάσει αλλά φαντάζομαι οτι αν προλάβει κανείς και πιάσει ένα ελεύθερο slot στο process table και γράψει ένα one-liner που να ψάχνει και να σκοτώνει όλα τα processes που έχουν μπει στο background μπορεί αργά και με ασφάλεια για το υπόλοιπο σύστημα να τα καταφέρει. Με κανένα sleep στο ενδιάμεσο φαντάζομαι οτι θα δουλεύει.

 

Η καλή ερώτηση είναι τί γίνεται σε περίπτωση που το bomb έχει γραφτεί σε assembly; Το crash θα έρθει σε χιλιοστά του δευτερολέπτου. Και ακόμα καλύτερα, τί γίνεται σε περίπτωση που έχει τρέξει κάποιος τη μπόμπα με nohup;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Nullscan: ας πιάσουμε συγκεκριμένο παράδειγμα:

>
#include <unistd.h>
int main(void){
   while (1)
        fork();
   return 0;
}

 

Έχει ελάχιστο μέγεθος, οπότε είναι πιθανότερο να πιάσει το process table παρά να εξαντλήσει τη μνήμη. Επίσης, δεν παρουσιάζει αυτό που λέει ο gtroza: όταν τιγκάρει το process table, η fork() απλά αποτυγχάνει, αλλά η fork bomb προσπαθεί αενάως.

 

Θεώρησε λοιπόν ότι έχεις ένα τιγκαρισμένο process table, το οποίο σημαίνει ότι δεν μπορείς να εκτελέσεις καμία εξωτερική εντολή (αφού αυτό ισοδυναμεί με fork() + exec()), οπότε έχεις μόνο τα shell builtins. Επίσης για κάθε process που σκοτώσεις, περιμένουν άλλα 900 στη γωνία κάνοντας fork() μέχρι να πετύχει, οπότε δε θα πετύχεις στατιστικά το timeslot για να προλάβεις να κάνεις εσύ spawn κάτι. Τέλος, υποθέτουμε ότι κάποιος την έσκασε ως root και έχει αφήσει ανοιχτό το terminal στο οποίο την «έσκασε». Τι κάνουμε;

 

Hint: υπάρχει λύση να τη σκοτώσεις χωρίς να πάρεις όλο το σύστημα κάτω.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

παιδιά sorry

το διαγώνισμα ήταν για το πρόγραμμα αξιολόγησης των καθηγητών !

 

ευτυχώς που δεν αντέγραψα απο τον NullScan !

θα κρεμούσα όλη την τάξη !

:mrgreen::mrgreen::mrgreen::mrgreen::mrgreen::mrgreen::mrgreen:

 

υγ:πάντως θα ρωτήσω και στο φροντιστήριο

 

καλό καλοκαίρι !

 

υγ2:κύριε, ο nske γιατί δεν γράφει διαγώνισμα, διακρίσεις ;

.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Για να δούμε...

ίσως κάτι του στύλ:

> ps aux | grep bash | awk '{print $2}' | xargs kill -9

 

Καλύτερα;

 

 

 

Edit: χωρίς xargs δεν κάνουμε δουλειά

Διάλεξα bash γιατί είναι το σύνηθες πλέον, μπορεί να αντικατασταθεί με οποιοδήποτε shell.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

η ps, η grep και η awk είναι external εντολές. Δε θα τρέξουν γιατί δεν έχει χώρο το process table. Για να σου το θέσω διαφορετικά, ούτε ls δεν μπορείς να κάνεις ;-)

 

Ξεκινάμε με το πρώτο σκονάκι λοιπόν: όταν δεν μπορείς να κάνεις ls, ευλογείς το shell expansion:

>
echo *

 

Δεύτερη «υπόδειξη»: πρέπει κάπως να βρεις ποια processes έχει το fork bomb.

 

Τρίτη «υπόδειξη»: ακόμα και να τα κάνεις kill -9 όλα, η kill() syscall παίρνει ένα argument, το οποίο σημαίνει ότι τι shell θα πάει να τα εκτελέσει ένα-ένα και για καθένα που θα σκοτώνεις, θα ξεπηδάει ένα άλλο απ' τη γωνία.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

να τον τιμωρήσετε αυστηρά κύριε

 

πρέπει να γίνουμε άνθρωποι, σωστοί και χρήσιμοι στην κοινωνία

 

μήπως τετραγωνίζουμε τον κύκλο ?

.

 

τώρα που το insomnia μοιάζει πιό εύρωστο

μήπως να κάνει κανένα καλοκαιρινό linux workshop ?

σε νησί εννοώ, όχι σε υπόγειο!

.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σε περίπτωση που δεν μπορείς να τρέξεις τίποτα τότε χρησιμοποιείς την exec πρίν από κάθε εντολή.

Και η ulimit επίσης είναι shell built in command (ulimit -u 1 αν δεν κάνω λάθος είναι η σύνταξη)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ο απλουστερος τρόπος από όλους:

 

Βαλτε τώρα KDE 4 svn και έχετε μία στις 10 περιπτωση να πετυχετε πακετα που, όταν πατε να κατεβασετε μεσω του desktop θέματα ή δεν ξερω τι άλλο, θα γεμίσει το συστημα άπειρα instances του kio slave και απλά ... έχετε ελαχιστο χρόνο μεχρι να γεμίσει πλήρως η RAΜ και αρχίσει να γεμίζει και το swap και σούρνεται τελειως το συστημα :devil::shock:

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.


  • Δημιουργία νέου...