-----BEGIN PGP SIGNED MESSAGE-----
GARR-CERT Security Alert
- ------------------------------------------------------------------------------
Alert ID: A-99012A
Data di creazione: Mon May 24 11:16:51 1999
Titolo: Buffer overflow di libc su Solaris
Gravita': alta
- ------------------------------------------------------------------------------
1) Descrizione del problema
E' possibile sovrascrivere dei buffer di memoria quando la libreria libc
utilizza la variabile di ambiente LC_MESSAGES: impostando tale variabile in modo
appropriato un utente locale puo' indurre delle applicazioni con il bit SUID
settato (che non siano necessariamente affette da problemi di buffer overflow)
ad eseguire comandi arbitrari.
2) Piattaforme interessate
Accertate: Solaris 2.6 e 2.7 su Sparc.
3) Impatto
Utenti locali possono acquisire privilegi di root.
4) Soluzioni
Non esiste al momento una patch ufficiale dalla Sun. Nell' attesa, dato che non
e' proponibile rimuovere il bit SUID da tutti i programmi che lo hanno settato,
si dovrebbe considerare l'ipotesi di installare un SUID-wrapper, cioe' un
programma che viene eseguito prima dell'originale e che controlli le dimensioni
delle variabili di ambiente.
Di seguito viene riportato il codice sorgente e le istruzioni di un SUID-wrapper
"di emergenza".
- --- Inizio messaggio riportato ---
Make a directory, /subin, and move all setuid root binaries into it.
Remove the setuid bits. Compile the following c program and put it
in place of the old setuid root binaries, with the setuid bit set.
I spent a small amount of time on this, so it itself may be exploitable.
Use with caution.
- --- cut here ---
#include <stdio.h>
#define MAX_ENV 255
#define HOLDING_PEN "/subin/"
#define BSIZE 1024
/*
quick and dirty wrapper to defeat overflowing of libraries with
environment variables
5/99, Craig Johnston, Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
this comes with no guarantees except "it seems to work here."
When is security going to become a priority at Sun?
*/
int main(int argc, char **argv, char **envp)
{
char *p, *q, buf[BSIZE];
int i;
while (*envp) { /* whack off long env variables */
for (p = *envp, i = 0; *p ; ++p, ++i)
if (i >= MAX_ENV) {
*p = '