Alias ​​globale della bomba a forcella impedirebbe la sua esecuzione?


15

Se dovessi ambientarti a livello globale

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

sarebbe una strategia di sicurezza efficace per evitare l'esecuzione della bomba a forcella Bash o ci sarebbe ancora un modo per eseguirla?

Suppongo che la domanda si risolva in: c'è un modo per eseguire un comando quando è aliasato a qualcos'altro?


1
@ user1717828, un "fork bomb" è un programma che esegue semplicemente nuove copie di se stesso, per sempre. La conseguente crescita esponenziale del numero di programmi in esecuzione di solito provoca l'interruzione rapida di qualcosa.
Segna il

1
Anche se funzionasse, non proteggerebbe da un programma che chiama fork () non passa attraverso bash?
UKMonkey,

2
: () {: |: &: |: &} ;:
Joshua,

3
Basta eseguirea(){ a|a& };a
user253751

1
Eviteresti la forma comune (se riuscissi a farlo funzionare), ma c'è una quantità pressoché infinita di variazioni possibili.
Albero il

Risposte:


52

I due no tre , ... Tra gli ostacoli principali ci sono:

  1. Non è un nome valido per un alias. Manuale online di Bash :

    I caratteri ... e tutti i metacaratteri della shell o i caratteri di citazione elencati sopra potrebbero non apparire in un nome alias.

    (, ), &,| E gli spazi che sono fuori in Bash 4.4.

  2. Quella corda particolare non è l'unico modo per scrivere una bomba a forcella nel guscio, famosa solo perché sembra oscura. Ad esempio, non è necessario chiamare la funzione: invece di qualcosa in realtà composto da lettere.

  3. Se potessi impostare l'alias, l'utente potrebbe disinserire l'alias, aggirarlo sfuggendo al nome alias sulla riga di comando o disabilitare del tutto gli alias, possibilmente eseguendo la funzione in uno script (Bash non espande gli alias in shell non interattive) .

  4. Anche se la shell è abbastanza limitata da fermare tutte le versioni di una bomba a forcella, un sistema per uso generico avrà altre utilità programmabili che possono ricorrere e fork di sottoprocessi. Hai un compilatore Perl o C? Abbastanza facile. Anche Awk potrebbe probabilmente farlo. Anche se non hai quelli installati, dovrai anche impedire all'utente di portare binari compilati dall'esterno del sistema, o in esecuzione /bin/shche probabilmente deve essere una shell completamente operativa per il funzionamento del resto del sistema.

Basta usare ulimit -u(cioè RLIMIT_NPROC) o equivalente per limitare il numero di processi che un utente può avviare. Sulla maggior parte dei sistemi Linux c'èpam_limits possibile impostare il limite del conteggio dei processi prima che vengano avviati tutti i comandi scelti dall'utente.

Qualcosa del genere /etc/security/limits.confmetterebbe un limite massimo di 50 processi a tutti gli utenti:

*        hard    nproc           50

(Stephen Kitt ha già menzionato il punto 1, Jeff Schaller ha menzionato 2 e 3.)


È possibile scrivere una bomba senza &?
Stephen Kitt,

4
@StephenKitt Non ne sono sicuro al 100% ma la mia ipotesi è che bash stia diventando completo. Se è così ci sono probabilmente infinite possibilità. Ad esempio, è possibile analizzare il codice a caratteri ASCII 38 ed eseguirlo.
Marie,

@Marie in questo particolare contesto dovresti anche evitare qualsiasi altro personaggio proibito mentre aggiri la &limitazione.
Stephen Kitt,

15
Il mio punto era principalmente che cercare di inserire nella lista nera funzionalità errate è una cattiva idea. Ci sono quasi sempre modi per aggirare.
Marie,

2
@Marie: Bash è sicuramente Turing completo.
In pausa fino a ulteriore avviso.

18

No. Ci sono troppi modi per scrivere una bomba.

Il malvagio scrittore di fork-bomb tenterà di nuovo con un nome di funzione diverso. O altre modifiche fino a quando la sua bomba a forcella non riesce.

Lo scrittore involontario della bomba a forcella non produrrà in primo luogo la canonica bomba a forcella.

In realtà è piuttosto facile diventare uno scrittore involontario di bombe a forcella. Ad esempio, potresti semplicemente usare ricorsivo makecon un esterno, non selezionato cd, combinandolo con il-j opzione e le sottodirectory inesistenti - un vero esempio su cui mi sono imbattuto una volta.

Non puoi proteggerti da tutte le possibilità, e certamente non da un determinato attaccante. Tutto ciò che otterrai è aumentare la complessità del tuo sistema.


14

Non puoi alias una bomba a forcella, perché non è un nome alias valido :

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

I caratteri '/', '$', '`', '=' e tutti i metacaratteri della shell o i caratteri di quotazione elencati sopra potrebbero non apparire in un nome alias.

Alcune shell non controllano i nomi degli alias quando vengono dichiarate, ma quando interpretano i comandi, quindi saltano il nome non valido. Una bomba a forcella includerà sempre &, che non può essere inclusa in un nome alias valido, quindi proteggersi in questo modo non è possibile.


Non importa se una shell consente di impostare questo alias o meno. È importante che anche se esiste un tale alias, non viene espanso durante l'interpretazione dei comandi poiché il nome alias non corrisponde al modello consentito. dashe boshad esempio entrambi lo ignorano silenziosamente.
schily,

10

Due volte no.

Non è l'unico modo per scrivere una bomba.

Esistono anche diversi modi per eseguire "un comando" quando c'è un alias:

command the-command
\the-command

Esempio:

$ alias ls=not-really-ls
$ ls
-bash: not-really-ls: command not found
$ \ls
jeff.html  output.png
$ command ls
jeff.html  output.png

Non correlato all'argomento principale, ma perché \lsmostrato output.pngma command lsnon lo è stato?
nxnev,

Ben individuato! Questo è, in effetti, non correlato all'argomento principale. È un classico errore PEBCAK in cui ho copiato / incollato male (o ripulito l'output.png nel mezzo). Lo riparerò per minimizzare le distrazioni. Grazie, @nxnev!
Jeff Schaller
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.