Come fermare e rilevare la bomba a forcella


14
#include <stdlib.h>
#include <unistd.h>

int main()
{
   while(1)
      fork();
}

Questo è il codice per una bomba a forcella.

Nel nostro college, ci colleghiamo tramite telnet, ovvero il protocollo di servizio client. Circa 100 sistemi sono collegati al server. All'improvviso abbiamo visto il server rallentare e dopo qualche tempo si è bloccato. Sono venuto a sapere che Sombody ha implementato una bomba a forcella.

Come possiamo rilevare su quale sistema è implementata la bomba a forcella? E come possiamo fermarlo?

Un metodo consiste nel limitare il numero massimo di processi che un singolo utente può possedere. Esiste un metodo per fermarlo e sapere da quale sistema è stato implementato?


19
Telnet? Sul serio? Dovresti davvero usare SSH ...
ThiefMaster



bene è stato migrato da SO ma una risposta potrebbe essere a livello di kernel. alcune patch sono state fatte provvisoriamente, ma nessuna sembra essere accettata. Il mio punto è: come rilevarlo: beh, chiunque saprà che non può più usare il sistema, quindi il punto di rilevamento non è forse il punto chiave. Come recuperare? La risposta attuale è il riavvio, direi: un modo per dire al kernel di eseguire solo un processo (quello che vuoi ripulire il disordine) e fermare tutti gli altri qualunque cosa siano. Questa potrebbe essere una funzione accessibile solo nella console di sistema.
Philippe Lhardy,

Risposte:


16

Un modo è limitare il numero di processi che un utente può eseguire.

Accedi come root e modifica questo file, per aggiungere utenti e configurare il loro limite.

# vi /etc/security/limits.conf

Aggiungi questa riga al file

john hard nproc 10

Ora l'utente john può creare solo 10 processi.


Penso che devi riavviare per /etc/security/limits.confrendere effettive le nuove impostazioni .
Dan D.

2
No. Ma sono applicati da PAM quindi si applicano solo ai nuovi accessi.
ThiefMaster

14

Per fermare una bomba a forcella in esecuzione potresti essere in grado di utilizzare killall <name>per uccidere tutti i processi della bomba. Tuttavia, dal momento che una bomba a forcella di solito provoca un carico incredibilmente elevato sul sistema, potresti non essere in grado di SSH in esso o eseguirlo. Quindi un riavvio potrebbe essere necessario o almeno molto più veloce.

Se ogni utente ha il proprio account sul sistema, puoi semplicemente controllare la home directory di tutti e cercare l'eseguibile. È probabile che abbia anche caricato il codice sorgente, quindi trovarlo non dovrebbe essere troppo difficile. Se era un account condiviso per tutti gli studenti, sei sfortunato. Soprattutto dopo che la sessione telnet o ssh dell'utente è terminata non hai alcuna possibilità di scoprire chi l'ha avviata.

Tuttavia, invece di punire l'utente che ha fatto esplodere quella bomba a forcella, dovresti piuttosto correggere la configurazione del sistema per disarmare le bombe a forcella. È possibile impostare i limiti di processo per utente utilizzando /etc/security/limits.confe quindi evitare che una bomba a forcella sfugga al controllo: ad esempio, con solo 50 processi, una bomba a forcella non farà molti danni.


è impossibile rilevare da quale sistema sta arrivando aa?
Rajesh M,

@ user1670364: Non è chiaro cosa stai chiedendo. Cosa intendi con "la sua venuta"? Puoi dire a quale utente appartiene il processo, cos'altro vuoi sapere?
David Schwartz

@DavidSchwartz intendo che è possibile rilevare la bomba a forcella su quale sistema viene implementato?
Rajesh M,

@ user1670364: Se intendi il sistema che sta effettivamente eseguendo la bomba a forcella, è quello che è lento. Se intendi l'utente che è responsabile, è l'utente che possiede i processi che stanno biforcando.
David Schwartz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.