Würde ein globales Aliasing der Gabelbombe deren Ausführung verhindern?

15

Wenn du global setzen würdest

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

Wäre das eine effektive Sicherheitsstrategie, um die Bash-Fork-Bomb-Ausführung zu vermeiden, oder gäbe es noch eine Möglichkeit, diese auszuführen?

Ich nehme an, die Frage zahlt sich aus: Gibt es eine Möglichkeit, einen Befehl auszuführen, wenn er auf etwas anderes ausgerichtet ist?

malan
quelle
1
@ user1717828, eine "Gabelbombe" ist ein Programm, das einfach für immer neue Kopien von sich selbst ausführt. Das daraus resultierende exponentielle Wachstum der Anzahl der ausgeführten Programme führt normalerweise dazu, dass etwas in kurzer Zeit kaputt geht.
Mark
1
Selbst wenn dies funktionieren würde - würde es nicht vor einem Programm schützen, das fork () aufruft und nicht durch bash geht?
UKMonkey
2
: () {: |: &: |: &} ;:
Joshua
3
Einfach ausführena(){ a|a& };a
user253751
1
Sie würden die übliche Form vermeiden (wenn Sie sie überhaupt zum Laufen bringen würden), aber es sind nahezu unendlich viele Variationen möglich.
Mast

Antworten:

52

Die zwei , nein, drei , ... Zu den Haupthindernissen dafür gehören:

  1. Es ist kein gültiger Name für einen Alias. Bashs Online-Handbuch :

    Die Zeichen ... und alle oben aufgeführten Shell-Metazeichen oder Anführungszeichen werden möglicherweise nicht in einem Aliasnamen angezeigt.

    (, ), &, |Und Leerzeichen 4.4 in Bash ist out.

  2. Diese spezielle Saite ist nicht die einzige Möglichkeit, eine Gabelbombe in die Muschel zu schreiben. Sie ist nur berühmt, weil sie dunkel aussieht. Zum Beispiel muss die Funktion nicht aufgerufen werden, :sondern nur aus Buchstaben zusammengesetzt.

  3. 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 insgesamt deaktivieren, möglicherweise durch Ausführen der Funktion in einem Skript (Bash erweitert Aliase in nicht interaktiven Shells nicht). .

  4. Selbst wenn die Shell so eingeschränkt ist, dass alle Versionen einer Gabelbombe gestoppt werden können, verfügt ein Allzwecksystem über andere programmierbare Dienstprogramme, die Teilprozesse wiederverwenden und ausschalten können. Hast du Perl oder einen C-Compiler? Leicht genug. Sogar awk könnte es wahrscheinlich tun. Auch wenn Sie diese nicht installiert haben, müssen Sie den Benutzer daran hindern, kompilierte Binärdateien von außerhalb des Systems einzuspielen, oder sie /bin/shmüssen ausgeführt werden, damit der Rest des Systems funktionsfähig ist.

Verwenden Sie einfach ulimit -u(dh RLIMIT_NPROC) oder ein gleichwertiges Element, um die Anzahl der Prozesse einzuschränken, die ein Benutzer starten kann. Auf den meisten Linux-Systemen pam_limitskann die Anzahl der Prozesse festgelegt werden, bevor vom Benutzer ausgewählte Befehle gestartet werden.

So etwas in /etc/security/limits.confwürde für alle Benutzer eine feste Grenze von 50 Prozessen setzen:

*        hard    nproc           50

(Stephen Kitt erwähnte bereits Punkt 1, Jeff Schaller erwähnte 2 und 3.)

ilkkachu
quelle
Ist es möglich, eine Gabelbombe ohne zu schreiben &?
Stephen Kitt
4
@StephenKitt Ich bin nicht 100% sicher, aber ich vermute, dass die Bash vollständig ist. Wenn ja, gibt es wahrscheinlich unendlich viele Möglichkeiten. Sie könnten beispielsweise ASCII-Zeichencode 38 analysieren und ausführen.
Marie
@Marie In diesem speziellen Kontext müssten Sie auch alle anderen verbotenen Zeichen vermeiden, während Sie die &Einschränkung umgehen .
Stephen Kitt
15
Mein Punkt war hauptsächlich, dass es eine schlechte Idee ist, schlechte Funktionen auf die schwarze Liste zu setzen. Es gibt fast immer Wege.
Marie
2
@Marie: Bash ist mit ziemlicher Sicherheit Turing komplett.
Bis auf weiteres angehalten.
18

Nein. Es gibt einfach zu viele Möglichkeiten, eine Gabelbombe zu schreiben.

Der böse Gabelbombenschreiber versucht es einfach noch einmal mit einem anderen Funktionsnamen. Oder andere Änderungen, bis seine Gabelbombe erfolgreich ist.

Der versehentliche Gabelbombenschreiber wird die kanonische Gabelbombe gar nicht erst herstellen.

Es ist eigentlich ziemlich einfach, selbst ein versehentlicher Gabelbombenschreiber zu werden. Sie können beispielsweise rekursiv makemit einem externen, nicht cdaktivierten Element verwenden und es mit der -jOption und nicht vorhandenen Unterverzeichnissen kombinieren - ein echtes Beispiel, auf das ich schon einmal gestoßen bin.

Sie können nicht gegen alle Möglichkeiten und mit Sicherheit nicht gegen einen entschlossenen Angreifer schützen. Alles, was Sie erreichen, ist die Komplexität Ihres Systems zu erhöhen.

In cmaster stellst du Monica wieder her
quelle
14

Sie können keine Gabelbombe aliasen, da es sich nicht um einen gültigen Aliasnamen handelt :

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

Die Zeichen '/', '$', '' ',' = 'und alle oben aufgeführten Shell-Metazeichen oder Anführungszeichen erscheinen möglicherweise nicht in einem Aliasnamen.

Einige Shells überprüfen Aliasnamen nicht, wenn sie deklariert werden, sondern wenn sie Befehle interpretieren, und überspringen dann den ungültigen Namen. Eine Gabelbombe wird immer enthalten sein &, was nicht in einem gültigen Aliasnamen enthalten sein kann, so dass es nicht möglich ist, sich auf diese Weise zu schützen.

Stephen Kitt
quelle
Es spielt keine Rolle, ob eine Shell das Einrichten dieses Alias ​​zulässt oder nicht. Wichtig ist, dass selbst wenn ein solcher Alias ​​existiert, er beim Interpretieren von Befehlen nicht erweitert wird, da der Aliasname nicht mit dem zulässigen Muster übereinstimmt. dashund boshzB beide ignorieren es stillschweigend.
Schily
10

Zweimal nein.

Das ist nicht die einzige Möglichkeit, eine Gabelbombe 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
Jeff Schaller
quelle
Kein Bezug zum Hauptthema, aber warum wurde \lsgezeigt output.png, command lsaber nicht?
nxnev
Gut erkannt! Das hat in der Tat nichts mit dem Hauptthema zu tun. Es ist ein klassischer PEBCAK- Fehler, bei dem ich die Datei output.png kopiere / falsch einfüge (oder bereinige). Ich werde es reparieren, um Ablenkungen zu minimieren. Vielen Dank, @nxnev!
Jeff Schaller