Czy globalne ułożenie widelcowej bomby uniemożliwiłoby jej wykonanie?

15

Gdybyś miał ustawić globalnie

alias ':(){ :|:& };:'='echo fork bomb averted'

czy byłaby to skuteczna strategia bezpieczeństwa pozwalająca uniknąć egzekucji bomby widelcowej Bash, czy też byłby sposób na jej wykonanie?

Przypuszczam, że pojawia się pytanie: czy istnieje sposób na wykonanie polecenia, gdy jest ono powiązane z czymś innym?

malan
źródło
1
@ user1717828, „bomba widełkowa” to program, który po prostu uruchamia nowe kopie samego siebie, na zawsze. Wynikowy wykładniczy wzrost liczby uruchomionych programów zwykle powoduje uszkodzenie w krótkim czasie.
Mark
1
Nawet jeśli to zadziałało - nie ochroniłoby przed programem, który wywołuje fork () nie przechodząc przez bash?
UKMonkey
2
: () {: |: &: |: &} ;:
Joshua
3
Po prostu uruchoma(){ a|a& };a
user253751,
1
Uniknąłbyś zwykłej formy (jeśli w ogóle sprawiłbyś, żeby działał), ale istnieje prawie nieskończona ilość wariantów.
Maszt

Odpowiedzi:

52

Dwa , nie trzy , ... Wśród głównych przeszkód, które są:

  1. To nie jest poprawna nazwa dla aliasu. Podręcznik online Bash :

    Znaki ... i dowolne z metaznaków powłoki lub znaki cytowania wymienione powyżej mogą nie pojawiać się w nazwie aliasu.

    (, ), &, |I spacje są w Bash 4.4.

  2. Ten konkretny ciąg nie jest jedynym sposobem na napisanie bomby widelcowej w skorupce, znanym tylko dlatego, że wygląda niejasno. Na przykład nie ma potrzeby wywoływania funkcji :zamiast czegoś, co faktycznie składa się z liter.

  3. Jeśli możesz ustawić alias, użytkownik może rozbroić alias, obejść go, usuwając nazwę aliasu w wierszu poleceń, lub całkowicie wyłączyć aliasy, prawdopodobnie uruchamiając funkcję w skrypcie (Bash nie rozwija aliasów w nieinteraktywnych powłokach) .

  4. Nawet jeśli pocisk jest wystarczająco ograniczony, aby zatrzymać wszystkie wersje bomby widełkowej, system ogólnego przeznaczenia będzie miał inne programowalne narzędzia, które mogą się powtarzać i rozwidlać podprocesy. Masz kompilator Perl lub C? Wystarczająco łatwe. Nawet awk mógłby to zrobić. Nawet jeśli nie masz tych zainstalowanych, musisz również powstrzymać użytkownika przed wprowadzaniem skompilowanych plików binarnych spoza systemu lub działaniem, /bin/shktóre prawdopodobnie musi być w pełni działającą powłoką, aby reszta systemu mogła działać.

Wystarczy użyć ulimit -u(tj. RLIMIT_NPROC) Lub odpowiednika, aby ograniczyć liczbę procesów, które użytkownik może uruchomić. W większości systemów Linux pam_limitsmożna ustawić limit liczby procesów przed uruchomieniem jakichkolwiek poleceń wybranych przez użytkownika.

Coś takiego /etc/security/limits.confwprowadziłoby sztywny limit 50 procesów dla wszystkich użytkowników:

*        hard    nproc           50

(Stephen Kitt wspomniał już o punkcie 1, Jeff Schaller o 2 i 3.)

ilkkachu
źródło
Czy można napisać bombę bez widelca &?
Stephen Kitt
4
@StephenKitt Nie jestem w 100% pewien, ale domyślam się, że bash jest zakończony. Jeśli tak, prawdopodobnie istnieją nieskończone możliwości. Na przykład możesz parsować kod ASCII 38 i wykonać go.
Marie,
@Marie w tym konkretnym kontekście musisz także unikać innych zakazanych postaci podczas obchodzenia &ograniczeń.
Stephen Kitt
15
Chodziło mi głównie o to, że próba umieszczenia na czarnej liście złej funkcjonalności jest złym pomysłem. Prawie zawsze można się obejść.
Marie,
2
@Marie: Bash jest z pewnością ukończony przez Turinga.
Wstrzymano do odwołania.
18

Nie. Jest po prostu zbyt wiele sposobów na napisanie bomby.

Pisarz złych bomb widłowych po prostu spróbuje jeszcze raz z inną nazwą funkcji. Lub inne zmiany, dopóki jego bomba nie rozwinie się.

Nieumyślny autor widelec-bomba przede wszystkim nie wyprodukuje kanonicznej bomby-widelca.

Tak naprawdę łatwo jest samemu zostać nieumyślnym pisarzem-bombą. Na przykład, możesz po prostu użyć rekurencyjnego makez zewnętrznym, niezaznaczonym cd, łącząc go z -jopcją i nieistniejącymi podkatalogami - prawdziwy przykład, na który natknąłem się raz.

Nie możesz zabezpieczyć się przed wszystkimi możliwościami, a na pewno nie przed zdeterminowanym atakującym. Wszystko, co osiągniesz, to zwiększenie złożoności systemu.

cmaster - przywróć monikę
źródło
14

Nie możesz aliasować bomby widelcowej, ponieważ nie jest to prawidłowy alias :

$ alias ':(){ :|:& };:'='echo fork bomb averted'
bash: alias: `:(){ :|:& };:': invalid alias name

Znaki „/”, „$”, „'”, „=” oraz dowolne metaznaki powłoki lub znaki cytowania wymienione powyżej mogą nie pojawiać się w nazwie aliasu.

Niektóre powłoki nie sprawdzają nazw aliasów, gdy są zadeklarowane, ale podczas interpretacji poleceń i pomijają wtedy niepoprawną nazwę. Widelec zawsze będzie zawierać bombę &, której nie można podać w prawidłowym aliasie, więc ochrona się w ten sposób nie jest możliwa.

Stephen Kitt
źródło
To, czy powłoka zezwala na skonfigurowanie tego aliasu, czy nie, nie ma znaczenia. Ważne jest to, że nawet jeśli istnieje taki alias, nie jest on rozwijany podczas interpretacji poleceń, ponieważ nazwa aliasu nie pasuje do dozwolonego wzorca. dashi boshnp. oba cicho to ignorują.
schily
10

Dwa razy nie.

To nie jedyny sposób na napisanie bomby widelcowej.

Istnieje również kilka sposobów wykonania „polecenia”, gdy istnieje alias:

command the-command
\the-command

Przykład:

$ alias ls=not-really-ls
$ ls
-bash: not-really-ls: command not found
$ \ls
jeff.html  output.png
$ command ls
jeff.html  output.png
Jeff Schaller
źródło
Nie związany z głównym tematem, ale dlaczego się \lspojawił, output.pngale command lsnie zrobił?
nxnev
Dobrze zauważony! W rzeczywistości nie ma to związku z głównym tematem. Jest to klasyczny błąd PEBCAK, w którym kopiuję / wklejam (lub usuwam plik output.png pomiędzy). Naprawię to, aby zminimalizować zakłócenia. Dziękuję, @nxnev!
Jeff Schaller