Linux ha qualche misura per proteggersi dalle bombe a forcella?


12
#include <unistd.h>
int main(int argc, char* argv[]) {
  while(1)
  {
    fork();
  } 
}

Eseguo questo programma sul mio Linux, niente output sul terminale, il sistema operativo sembra essere morto. Linux ha qualche misura di protezione per tale programma che può esaurire la memoria?


2
Ho il sospetto che l'impatto sarebbe molto meno se non seguissi i cattivi consigli che molte distro ti danno per creare una grande partizione di swap ...
R .. GitHub FERMA AIUTANDO ICE

1
"Non creare nuovi processi dopo aver colpito 65k" conta come contromisura? ;)
Bobby,

Risposte:


18

Questo è noto come bomba a forcella .

Linux ha qualche misura di protezione per tale programma che può esaurire la memoria?

Non proprio. Ogni fork produce un nuovo processo, con il proprio spazio di indirizzi virtuale e l'utilizzo della memoria. Quindi ogni copia è relativamente piccola. Alla fine, utilizzerai tutta la memoria fisica + di scambio sul sistema e il killer di memoria esaurita (OOM) inizierà a uccidere i singoli processi. Ma la bomba a forcella creerà comunque processi altrettanto veloci (se non più veloci).

Un modo per evitare che ciò accada in primo luogo è limitare il numero di processi utente, usando ulimit -u(supponendo che tu stia usando Bash; altre shell avranno equivalenti).


2
Una cosa da notare è che ulimitè specifico per bash; altre shell avranno probabilmente lo stesso comando integrato, ma forse con un nome diverso.
Jay,

@Jay: punto giusto. L'ho notato nella risposta ora, grazie!
Oliver Charlesworth,

1
limitare i descrittori di memoria / file per utente dovrebbe essere sufficiente. Limitare la memoria per utente è sempre una buona idea. Quando un processo viene interrotto (oom), il watchdog dovrebbe inviare una notifica in modo che BOFH possa avviare l'utente "canaglia" con tutti i processi appartenenti al sistema

Credo che puoi anche impostare alcuni limiti tramite i parametri di accesso
p_l

10

Sì, anche se potrebbe non essere abilitato per impostazione predefinita sul sistema. La setrlimitchiamata di sistema definisce i limiti di sistema, incluso il numero di processi per utente.

Vediamolo prima nell'API del kernel (da quando hai citato "linux"): puoi usare la manpage per setrlimit, che ti dirà di fare qualcosa come

#include <sys/resource.h>
...

struct rlimit  r;

rnew.r_cur = 40;
rnew.r_max = 50;
setrlimit(RLIMIT_NPROC,&r);

Ciò imposterà i processi massimi per utente ( RLIMIT_NPROC) su 40 (limite flessibile) e 50 (limite rigido).

Ora, dalla shell, se usi bash, puoi usare il ulimitcomando integrato:

ulimit -u
29089

È possibile impostare il limite passandolo come argomento:

ulimit -u 100

ulimit --help ti mostrerà che ci sono molti altri limiti che puoi impostare (uno che potrebbe interessare è il numero massimo di descrittori di file utilizzati dall'utente).


7

Dipende se si desidera utilizzarlo a livello di utente o di sistema. A livello di utente ulimit(o comandi corrispondenti per altre shell) sarebbe la soluzione più semplice.

Tuttavia a livello di sistema esistono meccanismi per impedire agli utenti malintenzionati (o semplicemente non utilizzare ulimit) di arrestare il sistema. Il meccanismo dei cgroup di Linux può limitare le risorse su base per gruppo. Puoi forzare (per pam_systemdmacanismo) la sessione dell'utente in un gruppo specifico. Ciò comporta altri vantaggi, ad esempio per lo scheduler della CPU.


1
+1: i cgroups sono davvero nuovi e la maggior parte delle persone non ne sa ancora molto. Dove possiamo saperne di più?
Ken Bloom,

1
@KenBloom: 1. sfogliando /sys/fs/cgroup/2. cercando in google 3. sfogliando make menuconfig4. sfogliando /usr/src/linux/Documentation/cgroups5. leggendo la documentazione di systemd. Mi dispiace non posso aiutare di più ma ho usato solo quelle risorse. Ho usato i cgroups sul desktop per controllare le risorse.
Maciej Piechotka,

6

Utilizzare ulimit -udalla shell bash per impostare un limite sui "processi max utente".

Dalla shell C, si utilizza il limitcomando.

Se è necessaria una chiamata di sistema per eseguire questa operazione, utilizzare la setrlimitchiamata per impostare RLIMIT_NPROC.


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.