Rendi un processo non eseguibile su Linux


14

Sto lavorando su un'applicazione per la gestione delle password e per motivi di sicurezza voglio avviare un processo invendibile.

E inoltre non voglio che questo programma sia un demone poiché devo leggere dallo standard input e scriverlo.

C'è un modo per fare questo?


11
"per motivi di sicurezza, voglio avviare un processo invendibile." Solo una nota - se ciò fosse permesso, le persone potrebbero facilmente sfruttarlo per motivi nefasti - ad esempio, lanciare una bomba a forcella inarrestabile.
VLAZ,

32
Sembra un problema XY . Ho il sospetto che qualunque cosa tu stia davvero cercando di ottenere, un processo inaffidabile non è il modo per farlo. "Per motivi di sicurezza" è molto vago. Che cosa esattamente vuoi impedire all'utente di fare? Che accesso hanno?
Nate Eldredge,

4
Qualsiasi processo che non è verificabile a tutti gli effetti è un virus.
Naftuli Kay,

3
@NateEldredge: piuttosto, il programma ignora i segnali. Questo è il modo tipico di farlo; in caso contrario, qualcuno potrebbe inviare un SIGINT o SIGTSTP direttamente al processo, bypassando il terminale.
Noah Spurrier,

2
@NoahSpurrier: Sto immaginando una situazione in cui hai un utente che può digitare cose sulla console, ma che altrimenti non può eseguire codice sul computer (come un chiosco). Lo si imposta in modo tale che nessuna chiave che possano digitare abbia un effetto imprevisto. Se riescono a eseguire altro codice, ignorare SIGINT e SIGTSTP e SIGQUIT non aiuta; chiunque potesse inviare quei segnali direttamente al processo potrebbe anche inviare SIGKILL o SIGSTOP che non si possono ignorare.
Nate Eldredge,

Risposte:


41

Far funzionare il gestore di password da un utente e maniglia separata / ignorare / segnali terminali generati blocchi ( SIGINT, SIGQUIT, SIGHUP, SIGTSTP, SIGTTIN, e SIGTTOU).

Non è possibile inviare segnali a processi (= kill) eseguiti con un altro utente (utente il cui uid reale e uid del set salvato è diverso dall'Uid effettivo) a meno che l'ID effettivo sia 0 (root).

Tutti i processi saranno comunque killable dalla radice.

Per maggiori dettagli, vedi kill (2) .


15

L'unico modo per rendere un processo invendibile è quello di implementarlo come thread del kernel , che non è qualcosa di banale.

Puoi ancora ucciderlo ma sarebbe un danno collaterale di arresto del sistema operativo.

Potresti anche sviluppare un modulo kernel personalizzato che imposterà il SIGNAL_UNKILLABLEflag sul tuo processo. Questo flag è progettato per essere impostato solo per init(o systemd, qualunque sia il processo iniziale avviato dal kernel), che sono i soli processi di terra dell'utente protetti da un'uccisione incondizionata, ma nulla sembra impedire che quel flag sia presente per un processo regolare.


1
potrebbe essere il processo init
muhmuhten

@muhmuhten Hai ragione, init è un processo utente protetto da un'uccisione incondizionata. Tuttavia non è progettato per essere personalizzato mentre esiste sicuramente un'API per moduli e thread del kernel.
jlliagre,

Per elaborare la mia risposta, presumo che tu non abbia accesso a un account di root (che, per inciso, suggerisce che si tratti di un esempio di giocattolo, di un progetto di corso o di un malware). Ciò preclude l'idea di poter collegare un modulo del kernel a tale scopo. Si noti inoltre che il flag SIGNAL_UNKILLABLE non è disponibile per i processi normali e preclude alcune importanti operazioni normali (come vforking) e quindi lo considero un caso limite normalmente poco pratico.
GregD

@jlliagre infatti, non lo è.
muhmuhten,

@dudek Un processo invendibile è già un caso limite normalmente poco pratico.
jlliagre,

11

Tecnicamente, non c'è modo di rendere un processo inattuabile.

Naturalmente, per gli utenti non root possono solo uccidere i processi che hanno lo stesso ID utente che hanno, quindi se puoi creare account diversi puoi usare un ID utente "univoco" per il processo e solo root potrebbe ucciderlo.

Una soluzione semplice, ma meno robusta, è far sì che il tuo processo catturi il maggior numero possibile di segnali (forse ignorandoli). Questo è adatto solo per esempi di giocattoli o ambienti non avversari poiché non c'è modo di catturare il segnale KILL (segnale 9), ma altrimenti puoi evitare di essere ucciso da loro.

Infine, puoi organizzare la rigenerazione del processo se ucciso. Anche questo è fragile (molto fragile), ma renderà un po 'più difficile esplodere. Questo può essere realizzato usando un processo di monitoraggio personale o usando inittab. Per un avversario che sa cosa sta facendo, questo può essere facilmente aggirato uccidendo più processi contemporaneamente.


1
Ma (a parte inittab) è possibile che anche il processo di monitoraggio possa essere ucciso, no?
roaima,

No, i driver di dispositivo (moduli del kernel) possono creare processi che non possono essere eliminati dal root.
Noah Spurrier,
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.