Jak zatrzymać i wykryć widelec bomby

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

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

To jest kod bomby widelcowej.

W naszej szkole łączymy się przez telnet, tj. Protokół obsługujący klienta. Około 100 systemów jest podłączonych do serwera. Nagle serwer spowolnił się i po pewnym czasie zawiesił się. Dowiedziałem się, że sombody zaimplementowało bombę widełkową.

Jak możemy wykryć, w którym systemie jest zaimplementowana bomba widełkowa? I jak możemy to zatrzymać?

Jedną z metod jest ograniczenie maksymalnej liczby procesów, które może posiadać pojedynczy użytkownik. Czy jest jakiś sposób, aby go zatrzymać i dowiedzieć się, z którego systemu został zaimplementowany?

Rajesh M.
źródło
19
Telnet? Poważnie? Naprawdę powinieneś użyć SSH ...
ThiefMaster
Zobacz także unix.stackexchange.com/q/64611/17609
moooeeeep
dobrze migrowano z SO, ale jedna odpowiedź może być na poziomie jądra. niektóre łatki zostały wstępnie przygotowane, ale żadna nie wydaje się akceptowana. Chodzi mi o to: jak to wykryć: cóż, każdy użytkownik będzie wiedział, że nie może już korzystać z systemu, więc punkt wykrywania może nie jest kluczowy. Jak odzyskać? Obecną odpowiedzią jest restart, powiedziałbym: sposób, aby poinformować jądro, aby uruchomiło tylko jeden proces (ten, który chcesz wyczyścić bałagan) i zatrzymać wszystkie inne, czymkolwiek one są. Może to być funkcja dostępna tylko w konsoli systemowej.
philippe lhardy

Odpowiedzi:

16

Jednym ze sposobów jest ograniczenie liczby procesów, które użytkownik może uruchomić.

Zaloguj się jako root i edytuj ten plik, aby dodać użytkowników i skonfigurować ich limit.

# vi /etc/security/limits.conf

Dodaj ten wiersz do pliku

john hard nproc 10

Teraz użytkownik John może utworzyć tylko 10 procesów.

Barath Bushan
źródło
Myślę, że musisz zrestartować komputer, aby nowe ustawienia /etc/security/limits.confzaczęły obowiązywać.
Dan D.
2
Nie. Ale są one stosowane przez PAM, więc dotyczą tylko nowych loginów.
ThiefMaster 17.03.13
14

Aby zatrzymać działającą bombę widelcową, możesz być w stanie killall <name>zabić wszystkie procesy bomby. Jednak ponieważ bomba widełkowa zwykle powoduje niewiarygodnie duże obciążenie systemu, możesz nie być w stanie SSH do niego włączyć lub wykonać tego. Ponowne uruchomienie może być konieczne lub co najmniej znacznie szybsze.

Jeśli każdy użytkownik ma własne konto w systemie, możesz po prostu sprawdzić katalog domowy każdego użytkownika i wyszukać plik wykonywalny. Są duże szanse, że przesłał również kod źródłowy, więc znalezienie go nie powinno być zbyt trudne. Jeśli było to wspólne konto dla wszystkich studentów, nie masz szczęścia. Zwłaszcza po zakończeniu sesji telnet lub ssh użytkownika nie ma szansy dowiedzieć się, kto ją uruchomił.

Jednak zamiast karać użytkownika, który zdetonował bombę widełkową, powinieneś raczej naprawić konfigurację systemu, by rozbroić bombę widełkową. Możesz ustawić limity procesów dla poszczególnych użytkowników, /etc/security/limits.confa tym samym zapobiec wymykaniu się bomby widelcowej - dzięki np. Zaledwie 50 procesom bomba widelca nie wyrządzi dużych szkód.

ThiefMaster
źródło
nie można wykryć, z którego systemu pochodzi aa?
Rajesh M
@ user1670364: Nie jest jasne, o co pytasz. Co rozumiesz przez „jego nadejście”? Możesz powiedzieć, który użytkownik jest właścicielem procesu, co jeszcze chcesz wiedzieć?
David Schwartz
@DavidSchwartz Mam na myśli, że możliwe jest wykrycie bomby widelcowej, w którym systemie jest wdrażany?
Rajesh M
@ user1670364: Jeśli masz na myśli system, który faktycznie uruchamia bombę widełkową, jest to ten, który działa wolno. Jeśli masz na myśli odpowiedzialnego użytkownika, to użytkownik jest właścicielem procesów, które rozwidlają się.
David Schwartz