
Wenn Sie global festlegen würden
alias ':(){ :|:& };:'='echo fork bomb averted'
Wäre das eine wirksame Sicherheitsstrategie, um die Ausführung der Bash-Fork-Bombe zu verhindern, oder gäbe es dennoch eine Möglichkeit, sie auszuführen?
Ich nehme an, die Frage läuft darauf hinaus: Gibt es eine Möglichkeit, einen Befehl auszuführen, wenn dieser einen Alias für etwas anderes hat?
Antwort1
Die zwei , nein, drei , ... Zu den Haupthindernissen dabei zählen:
Dies ist kein gültiger Name für einen Alias.Bashs Online-Handbuch:
Die Zeichen ... und alle oben aufgeführten Shell-Metazeichen oder Anführungszeichen dürfen in einem Aliasnamen nicht vorkommen.
(
,)
,&
,|
und Leerzeichen sind in Bash 4.4 nicht mehr verfügbar.Diese spezielle Zeichenfolge ist nicht die einzige Möglichkeit, eine Fork-Bombe in der Shell zu schreiben, sondern nur deshalb berühmt, weil sie obskur aussieht. Es besteht beispielsweise keine Notwendigkeit, die Funktion
:
anstelle von etwas aufzurufen, das tatsächlich aus Buchstaben besteht.Wenn Sie den Alias festlegen könnten, könnte der Benutzer den Alias aufheben, ihn umgehen, indem er den Aliasnamen in der Befehlszeile maskiert, oder Aliase vollständig deaktivieren, möglicherweise indem er die Funktion in einem Skript ausführt (Bash erweitert Aliase nicht in nicht interaktiven Shells).
Selbst wenn die Shell so eingeschränkt ist, dass sie alle Versionen einer Fork-Bombe stoppt, verfügt ein Allzwecksystem über andere programmierbare Dienstprogramme, die rekursiv arbeiten und Unterprozesse abspalten können. Sie haben Perl oder einen C-Compiler? Ganz einfach. Sogar awk könnte das wahrscheinlich. Selbst wenn Sie diese nicht installiert haben, müssen Sie den Benutzer auch daran hindern, kompilierte Binärdateien von außerhalb des Systems einzuspielen oder auszuführen,
/bin/sh
was wahrscheinlich eine voll funktionsfähige Shell sein muss, damit der Rest des Systems funktioniert.
Benutz einfachulimit -u
(ie RLIMIT_NPROC
) oder gleichwertig, um die Anzahl der Prozesse zu beschränken, die ein Benutzer starten kann. Auf den meisten Linux-Systemen gibt espam_limits
Dadurch kann die Anzahl der Prozesse begrenzt werden, bevor vom Benutzer ausgewählte Befehle gestartet werden.
So etwas /etc/security/limits.conf
würde eine feste Grenze von 50 Prozessen für alle Benutzer festlegen:
* hard nproc 50
(Stephen Kittschon erwähntPunkt 1, Jeff Schallererwähnt2 und 3.)
Antwort2
Nein. Es gibt einfach zu viele Möglichkeiten, eine Fork-Bombe zu schreiben.
Der böse Fork-Bomb-Autor wird es einfach mit einem anderen Funktionsnamen oder anderen Änderungen erneut versuchen, bis seine Fork-Bombe erfolgreich ist.
Der unabsichtliche Autor der Fork-Bombe wird die kanonische Fork-Bombe erst gar nicht produzieren.
Es ist eigentlich ziemlich einfach, selbst zum unabsichtlichen Autor von Fork-Bomben zu werden. Sie könnten beispielsweise einfach rekursiv make
mit einem externen, nicht aktivierten verwenden cd
und es mit der Option und nicht vorhandenen Unterverzeichnissen kombinieren -j
- ein echtes Beispiel, über das ich einmal gestolpert bin.
Sie können sich nicht gegen alle Möglichkeiten schützen, und schon gar nicht gegen einen entschlossenen Angreifer.Sie erreichen damit lediglich eine Erhöhung der Komplexität Ihres Systems.
Antwort3
Man kann eine Fork Bomb nicht als Alias verwenden, da es sich nicht um einegültiger Aliasname:
$ alias ':(){ :|:& };:'='echo fork bomb averted'
bash: alias: `:(){ :|:& };:': invalid alias name
Die Zeichen '/', '$', '`', '=' und alle oben aufgeführten Shell-Metazeichen oder Anführungszeichen dürfen in einem Aliasnamen nicht vorkommen.
Einige Shells prüfen Aliasnamen nicht bei der Deklaration, sondern bei der Interpretation von Befehlen und überspringen dann den ungültigen Namen. Eine Fork-Bombe enthält immer &
, was nicht in einem gültigen Aliasnamen enthalten sein kann. Daher ist es nicht möglich, sich auf diese Weise zu schützen.
Antwort4
Zweimal, nein.
Das ist nicht die einzige Möglichkeit, eine Fork-Bombe zu schreiben.
Es gibt auch mehrere Möglichkeiten, „einen Befehl“ auszuführen, wenn ein Alias vorhanden ist:
command the-command
\the-command
Beispiel:
$ alias ls=not-really-ls
$ ls
-bash: not-really-ls: command not found
$ \ls
jeff.html output.png
$ command ls
jeff.html output.png