 |
» |
|
|
 |
Poiché questi programmi rappresentano un rischio potenziale per la protezione del sistema, prendere nota di quali programmi sono setuid (impostano l'ID utente) e quali setgid (impostano l'ID gruppo). Chi attacca un sistema può utilizzare i programmi setuid e setgid, usando per lo più una o due modalità:
Facendo eseguire ad un programma setuid o setgid dei comandi definiti dall'aggressore, interattivamente o mediante script. Sostituendo dati falsi a quelli creati da un programma.
Per proteggere i programmi setuid e setgid, seguire queste linee guida: Fare attenzione a qualsiasi modifica ai programmi setuid e setgid. Cercare eventuali programmi setuid superflui. Modificare le autorizzazioni di un programma che risulti essere setuid senza che ci sia la necessità, trasformandole in quelle di un programma setgid. Per ulteriori informazioni, vedere chmod(1) e chmod(2). La forma completa del comando ls (ll o ls -l) mostra i programmi setuid, elencando S o s invece di - o x per le autorizzazioni proprietario-esecuzione. Mostra i programmi setgid elencando S o s invece di - o x per le autorizzazioni gruppo-esecuzione. Ci si può attendere di trovare filesystem setuid e setgid, ma devono avere le stesse autorizzazioni fornite dai supporti di fabbrica, salvo che queste siano state personalizzate. Non consentire agli utenti di avere programmi setuid, soprattutto quando utilizzano setuid per altri utenti. Esaminare il codice di tutti i programmi importati da fonti esterne per rilevare l'eventuale presenza di software distruttivi noti come "cavalli di Troia". Non ripristinare o installare mai un programma setuid proveniente da un fonte non controllabile. Per consentire agli utenti l'accesso a determinati programmi per superutente, HP consiglia di usare SMH limitato. SMH limitato consente a chi non dispone di privilegi di superutente di accedere a particolari aree di SMH. Per i dettagli, consultare smh(1M).
Possibili fattori di rischio dei programmi setuid e setgid |  |
Qualunque esso sia, il programma eseguito crea un processo con quattro numeri di ID, ID utente reale ed effettivo (ruid ed euid) ed ID gruppo reale ed effettivo (rgid ed egid). Normalmente, queste coppie di ID sono identiche. Tuttavia, l'esecuzione di un programma setuid o setgid modifica il valore di euid o egid del processo, da quello associato al proprietario a quello associato all'oggetto. I processi generati acquisiscono i propri attributi dall'oggetto, fornendo all’utente gli stessi diritti d'accesso di proprietario e gruppo del programma. Se il bit di setuid è attivato, i privilegi del processo saranno impostati in base a quelli del proprietario del file. Se il bit di setgid è attivato, i privilegi del processo saranno impostati in base a quelli del gruppo del file. Se né il bit di setuid né quello di setgid sono impostati, i privilegi del processo rimarranno invariati. In un caso particolarmente rischioso, se il programma è stato impostato come root con setuid, l'utente guadagnerà tutti i privilegi disponibili per root. Si tratta di una situazione pericolosa, perché il programma potrà essere utilizzato in un modo che viola la sicurezza del sistema. Questo problema si presenta in misura minore anche in altri casi in cui si utilizzano setuid e setgid.
Per ragioni di sicurezza, normalmente il kernel HP-UX ignora i bit setuid e setgid degli script. Questa regola può essere resa meno rigida, modificando appropriatamente il parametro sintonizzabile secure_sid_scripts, ma si consiglia vivamente di non modificare le impostazioni predefinite di questo parametro. Per ulteriori informazioni su questo parametro sintonizzabile, consultare la manpage secure_sid_scripts(5). Modalità di impostazione degli ID |  |
Gli ID sono impostati in questi diversi modi: Il valore di ruid e rgid è ereditato dal processo login, che imposta il valore di uid e gid. Il valore di uid e gid è specificato in /etc/passwd. Il comando login modifica anche ruid, euid, rgid ed egid. Il comando su modifica euid e ruid. Il comando newgrp può modificare valore di gid. I bit di setuid e setgid sono impostati utilizzando la chiamata di sistema chmod() o il comando chmod. Per ulteriori informazioni, vedere chmod(1) e chmod(2).
Linee guida per limitare le potenzialità di setuid |  |
Se si aggiungono a un sistema esistente dei programmi setuid impostati come root, fare molta attenzione. Aggiungendo un programma setuid impostato come root, si modifica la configurazione del sistema e si potrebbe comprometterne la protezione. Rafforzare l'uso restrittivo dei programmi privilegiati seguendo questi suggerimenti relativi alle procedure amministrative e di programmazione: Usare setuid e setgid solo quando è assolutamente necessario. Assicurarsi che nessun programma setuid sia scrivibile da altri utenti. Quando possibile, usare setgid al posto di setuid, per ridurre la portata dell'eventuale danneggiamento causato da errori di programmazione o da violazioni della protezione. Eseguire periodicamente delle ricerche nei propri filesystem per rilevare l'eventuale presenza di programmi setuid e setgid nuovi o modificati. È possibile utilizzare il comando ncheck -s. Essere perfettamente a conoscenza di cosa possono fare i programmi setuid e setgid e controllare che eseguano solamente le operazioni previste. In caso contrario, rimuovere il programma o il suo attributo setuid. Se è necessario copiare un programma setuid, controllare che nel file di destinazione le modalità siano corrette. Scrivere programmi setuid in modo che sia possibile provarli con dati non critici, senza attributi setuid o setgid. Applicare questi attributi solo dopo la revisione del codice e dopo che tutti i settori aziendali interessati abbiano compreso che i nuovi programmi sono in grado di garantire la protezione. Controllare che un programma setuid non crei file scrivibili da soggetti diversi dall'utente designato. Reimpostare il valore di euid prima di una chiamata di sistema exec(*). Tenere presente che exec(*) può essere chiamata da altre routine di libreria ed essere cauti nell'utilizzare routine (tra cui popen(), system(), execlp() e execvp()) che ramificano la shell per eseguire un programma. Per ulteriori informazioni, consultare exec(2), popen(3S) e system(3S). Quando si scrivono programmi setuid, per ridurre l'ambito delle vulnerabilità usare setresuid() nelle parti di codice che richiedono privilegi. Per ulteriori informazioni, vedere setresuid(2). Chiudere tutti i i descrittori di file non necessari prima di chiamare exec(*). Assicurarsi che nell'ambiente del programma tutte le variabili (PATH, IFS) ed il valore umask siano sufficientemente restrittivi. Non utilizzare la chiamata di sistema creat() per creare un file di blocco. Usare invece lockf() o fcntl(). Per ulteriori informazioni, vedere lockf(2) e fcntl(2). Fare soprattutto attenzione ad evitare l'overrun del buffer, utilizzando sprintf(), strcpy() e strcat() senza la corretta validazione della lunghezza del parametro. Per ulteriori informazioni, consultare printf(3S) e string(3C).
|