Ta bomba rozwidlona zawsze przypomina mi coś, co powiedział nauczyciel programowania AI na jednej z pierwszych lekcji, w których uczestniczyłem: „Aby zrozumieć rekurencję, najpierw musisz zrozumieć rekurencję”.
U podstaw tej bomby jest funkcja rekurencyjna . Zasadniczo tworzysz funkcję, która wywołuje siebie, która wywołuje siebie, która wywołuje siebie .... aż do wyczerpania zasobów systemowych. W tym konkretnym przypadku rekurencja jest wzmacniana przez użycie potokowania funkcji do siebie ORAZ jej tła.
Widziałem tę odpowiedź na StackOverflow i myślę, że podany tam przykład najlepiej to ilustruje, tylko dlatego, że łatwiej jest zobaczyć, co robi na pierwszy rzut oka (skradziony z linku powyżej ...)
☃(){ ☃|☃& };☃
Zdefiniuj funkcję błędu ☃() { ... }
, której ciało wywołuje się (funkcja błędu), przesyłając dane wyjściowe do siebie (funkcja błędu) ☃|☃
, i określ wynik w tle &
. Następnie, po funkcja jest zdefiniowana, rzeczywiście wywołać funkcję błędu, ; ☃
.
Zauważam, że przynajmniej na mojej Arch VM, potrzeba podłożenia procesu do tła nie jest wymagana do uzyskania tego samego rezultatu końcowego, do zużycia całej dostępnej przestrzeni procesu i renderowania hosta. Właściwie teraz powiedziałem, że wydaje się, że czasami kończy proces ucieczki i po jego przeskanowaniu -bash: fork: Resource temporarily unavailable
zakończy się na Terminated
(i journalctl
pokazuje zrzut rdzenia bash).
Aby odpowiedzieć na twoje pytanie dotyczące csh / tcsh, żadna z tych powłok nie obsługuje funkcji, możesz tylko alias. W przypadku tych powłok należy napisać skrypt powłoki, który wywołuje się rekurencyjnie.
Wygląda na to, że zsh cierpi z powodu tego samego losu (z tym samym kodem), nie zrzuca zrzutu pamięci i powoduje, że Arch daje Out of memory: Kill process 216 (zsh) score 0 or sacrifice child.
, ale nadal się rozwija. Po chwili stwierdza Killed process 162 (systemd-logind) ...
(i nadal ma rozwidlenie zsh).
Arch nie wydaje się mieć pacman
wersji ksh, więc zamiast tego musiałem wypróbować ją na Debianie. ksh sprzeciwia się :
jako nazwa funkcji, ale używając czegoś - powiedzmy, że b()
wydaje się mieć pożądany wynik.